Articles of 着色器

着色器或无着色器?

我有一个我不太了解的问题。 在OpenTK中,我应该有着色器吗? 不皱眉吗? 有着色器有什么优点和缺点? 我可以在没有任何与顶点或片段着色器有关的情况下完美地完成任务吗?

为什么blendShader除了背景图像的当前坐标之外什么都不能取样?

在Flash中,可以将DisplayObject的blendShader属性设置为像素着色器(flash.shaders.Shader类)。 该机制很好,因为Flash会自动为您的Shader提供两个input图像,包括背景表面和前景显示对象的位图。 问题是,在运行时,着色器不允许您在当前输出坐标下的任何地方对背景进行采样。 如果您尝试对其他坐标进行采样,则只会返回当前坐标的颜色,而忽略您指定的坐标。 这似乎只发生在运行时,因为它在Pixel Bender工具包中正常工作。 此限制使得无法模拟Windows Vista / 7中的Aero Glass效果,因为您无法正确采样背景模糊。 我必须提到可以通过手动合成技术在Flash中创建效果,但很难确定何时需要更新,因为Flash不提供有关屏幕的特定区域或特定显示对象何时需要的信息渲染的。 例如,你可能有一个固定的玻璃表面,物体在其下面移动,不会在移动时发送事件。 唯一的select是每一帧重新渲染玻璃条,这是效率低下,这就是为什么我试图通过blendShader来做到这一点,所以Flash确定何时需要自动渲染。 这种限制是否有技术上的原因,还是某种疏忽? 有谁知道一个解决方法,或者我可以提供我的手动组合实现与何时需要重新呈现的信息? 这个限制在这个页面的最后一个注释中没有提及,这里提到: http : //help.adobe.com/en_US/as3/dev/WSB19E965E-CCD2-4174-8077-8E5D0141A4A8.html它说: “ 注意:当Pixel Bender着色器程序在Flash Player或AIR中以混合模式运行时,采样和outCoord()函数的行为与其他上下文中的行为不同。在混合中,采样函数将始终返回当前正在评估的像素例如,你不能在outCoord()中添加一个偏移量来采样一个相邻像素,同样的,如果你在采样函数外使用了outCoord()函数,它的坐标值总是为0。例如,使用像素的位置来影响混合图像的组合方式。“

OpenGL管理图像,VBO和着色器

我正在使用具有顶点属性(所以不是即时模式)的着色器的游戏。 我正在绘制大量的图像,并改变了我用来绘制它们的四边形的宽度/高度。 为了优化这个,有一个缓冲区可能是一个好主意,但是当一个图像改变时(或者只使用glBufferSubData的缓冲区的一部分),需要更新整个缓冲区。 我只是想知道你们正在使用什么样的策略?

如何修改“使用XNA Game Studio 4.0的3Dgraphics”中的阴影映射?

所以我一直在关注Sean James的“XNA Game Studio 4.0 3Dgraphics”中的教程,并且一直做得很好,直到我到达了阴影映射部分。 在这本书中,它创建了一个Sphere模型的点光源。 我的第一个问题是如何绘制一个定向光与这个框架的工作? 其次,它可以做一个灯光的阴影贴图,我怎么能做所有或部分灯光在游戏中的阴影贴图? 我只想知道如何修改这些代码来完成上述任务。 我遵循MSDN和其他网站上的教程,没有得到答案。 请帮助我,这么紧急。

XNA中正交几何的轮廓阴影效应

我刚刚开始学习阴影的艺术,但是当限制到单个顶点/像素着色器技术(感谢XNA)时,我无法将轮廓宽度设置为2D,凹面几何。 我需要给轮廓的形状具有平滑的,每个顶点的着色以及不透明度。 具有平滑,每顶点着色,可变宽度和不透明度的轮廓不能干扰原始形状的颜色。 像素深度边界检测algorithm将不起作用,因为像素深度不是3.0语义。 扩大几何graphics/重新绘制将无法正常工作,因为它会干扰原始形状的颜色。 我想知道是否可以在着色器function之外使用模板/深度缓冲区,因为我可以通过graphics设备访问它。 但我不相信我能够操纵实际的价值。 我该怎么做?

顶点着色器像素着色NVIDIA的问题 – 重新启动驱动程序

我在NVIDIA显卡上遇到了问题。 在AMD上它是正确的。 着色器生成器导出代码: //ROOT //PSParts //VSParts //Samplers sampler sLod23ColorGround : register(s0); sampler sLod23BumpGround : register(s1); sampler sTG0 : register(s2); sampler sTG1 : register(s3); sampler sTG2 : register(s4); sampler sTG3 : register(s5); sampler sTG4 : register(s6); //Constants float4x4 mZERO : register(c0); float4 fvTIME : register(c4); float4 fvGS : register(c5); float4 fvGSD : register(c6); float4 fvGSDFT : […]

如何在移动设备上使用qt5在桌面上工作(es2,正确的glsl版本)?

我在寻找关于这个问题的帮助/信息: 我的工作:我有一个opengl es2渲染引擎,可以在iOS应用上运行。 我几乎设法通过调用与QGL(4.8之后,然后5.0从今天)应用与QGLWidget相同的OpenGL渲染引擎的工作。 为了支持es2函数集,我的小部件也inheritance了QGLFunctions(QtOpenGLFunctions和qt 5.0.0)。 然而,我仍然有着色器问题:我无法在qComp上使用glCompileShader编译它们,因为几乎每个关键字(lowp,vec4,vec2 …)都返回了编译错误。 所以我编译了QOpenGLShader程序,但是我必须指定“#version 120”,最接近es2。 但是,我的精灵并没有显示出正确的大小,只有潜在的影响,不同的iOS代码是在着色器编译/版本。 我认为在着色器中的问题是不考虑gl_PointSize。 有没有更好的办法让我像使用iOS一样在qt上编译着色器? (我知道glsl es2版本是从版本120,但我不知道他们有什么不同)。 hello-gl-es2的例子没有帮助我,因为glsl版本也返回1.20。 我会很乐意收到任何提示,谢谢! 我的着色器,在iOS上运行良好,但不在Qt上: const GLchar vShaderStr[] = #ifdef __BUILD_DESKTOP__ "#version 120\n" // necessary for Qt to compile shaders #endif //__BUILD_DESKTOP__ "attribute lowp vec4 Position;\n" "attribute mediump vec2 TextureCoord;\n" "attribute lowp float Weight;\n" "uniform mat4 MVP;\n" "varying mediump vec2 TextureCoordOut;\n" "void […]

BasicEffect和SkinnedEffect处理WorldViewProj不同?

我做了一个ModelBatch类,批处理和绘制操纵/ unanimated和皮肤/animation模型。 现在,BasicEffect被分配到绑定模型(XNA模型处理器),SkinnedEffect被分配到蒙皮模型(基于微软的Skinned Model Sample )。 设置着色器参数时发生问题。 在RenderBatch()方法中,我写道: … foreach (Effect effect in mesh.Effects) { if (effect is BasicEffect) // if it's a rigged model. { effect.Parameters["WorldViewProj"].SetValue(modelInfo.world * viewProjection); } else // it's a skinned model. { effect.Parameters["WorldViewProj"].SetValue(viewProjection); effect.Parameters["Bones"].SetValue(modelInfo.boneTransforms); } } … 在运行游戏时,操纵模型的位置将locking在前几帧的摄像头位置。 之后,一切正常(操纵模型的位置是正确的)。 即使我只设置“WorldViewProj”参数(因此它不是因为“Bones”参数),在运行时,蒙皮模型在运行时没有位置偏移问题。 为了完美地工作,我不得不将模型部分改为: if (effect is BasicEffect) // if it's a rigged […]

我有一个碎片着色器,一个空的s_lightMap,如何以及为什么它影响输出?

我有一个不同色调的混凝土岩石的图像,我正在使用这个着色器,但是没有在我的程序中引用s_lightMap的制服 : precision mediump float; varying vec2 v_texCoord; uniform sampler2D s_baseMap; uniform sampler2D s_lightMap; void main() { vec4 baseColor; vec4 lightColor; baseColor = texture2D( s_baseMap, v_texCoord ); lightColor = texture2D( s_lightMap, v_texCoord ); gl_FragColor = baseColor * (lightColor + 0.25); } 它显示了一个可变的光色添加到最终的像素颜色的图片,但s_lightMap甚至没有链接到程序中,在这种情况下发生了什么,起初我以为它会做的baseColor作为FragColor,但加法的0.25给非负的结果(lightColor + 0.25)。 我很困惑,一分钟,我认为lightColor将设置为1的纹理下一个0的数组。 还是只是随机数据? 它不会随机出现在图片中 ,它看起来像服从阴影规则。 我想在没有损坏的代码中模仿这种效果。 这是未被遮住的图像: 示例“变形”图像如何具有可变阴影(虽然这是一个倒置):

OpenGL计算matrix

我试图从glTranslate等切换到我自己的matrix,但由于某种原因,它不工作。 这里是我的2个函数来创建视图和投影matrix: public Matrix4f getViewMatrix() { Matrix4f viewMatrix = new Matrix4f(); viewMatrix.setIdentity(); viewMatrix.translate(game.player.position); viewMatrix.rotate(game.player.rotation.x, new Vector3f(1.0f, 0.0f, 0.0f)); viewMatrix.rotate(game.player.rotation.y, new Vector3f(0.0f, 1.0f, 0.0f)); viewMatrix.rotate(game.player.rotation.z, new Vector3f(0.0f, 0.0f, 1.0f)); //System.out.println(viewMatrix); return viewMatrix; } public Matrix4f getProjectionMatrix() { FloatBuffer projectionBuffer = BufferUtils.createFloatBuffer(16); GL11.glGetFloat(GL_MODELVIEW_MATRIX, projectionBuffer); Matrix4f projectionMatrix = new Matrix4f(); projectionMatrix.load(projectionBuffer); return projectionMatrix; } 我用统一的方式将这两个matrix发送给顶点着色器,并使用: gl_Position = view_matrix […]