GLSL - 变量变量获取垃圾值 - GL_POINTS

时间:2012-06-29 23:40:09

标签: java opengl glsl lwjgl

奇怪的问题。好像我的GLSL程序的行为与逻辑和规范建议的不同。这是vert着色器:

#version 120

uniform mat4 q;
varying vec2 TextureCoord;

void main()
{
  gl_FrontColor = gl_Color;
  gl_TexCoord[0] = gl_MultiTexCoord0;
  vec4 p = q*gl_Vertex;
  TextureCoord = vec2(.01f,.01f);
  gl_Position= gl_ModelViewProjectionMatrix*p;
  gl_PointSize = gl_Normal.x / -p.z;
}

这是碎片着色器:

#version 120

uniform sampler2D theTex;
varying vec2 TextureCoord;

void main()
{
  vec2 realTexCoord = ( gl_TexCoord[0].st*vec2(0.024f,0.024f)) + TextureCoord;
  gl_FragColor = gl_Color*texture2D(theTex, realTexCoord);

}

皱纹是这样的。如果我在frag着色器中放下+ TextureCoord并用一些常量vec2替换它,如(.1f,.1f)一切都很好,我看到了纹理。但是像这样,我只是得到奇怪的垃圾颜色噪音。这是GL_POINTS,具有平滑点和纹理坐标替换。我正在使用TexCoord [0] .st因为gl_PointCoord总是为零......

看起来发生的事情是垃圾价值以某种方式进入我的变化之间。但是这会怎么样?如果这些值以某种方式在顶点和片段着色器之间进行“插值”,那么应用了哪种逻辑?

我尝试在制服上发送值,但它也总是为零。

我正在使用LWJGL。

2 个答案:

答案 0 :(得分:0)

什么是GPU硬件?你试过安装最新的驱动程序吗?您是否尝试在不同供应商的GPU上运行代码?这可能是在着色器之间没有正确链接变化的情况 - 这可能发生在一些错误/旧的OpenGL实现上。

您是否尝试使用GL_TRIANGLE_STRIP?这里可能只有GL_POINTS拓扑错误。顺便说一句。纹理GL_POINTS对我来说是一个奇怪的想法。

根据当前的gl_Position,通过基元对变量进行插值。对于GL_POINTS,应该没有插值,因为每个组合的原语有一个顶点。

答案 1 :(得分:0)

我刚用旧的ATI卡遇到了类似的问题。

您可以尝试在主程序中调用glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); - 为我修复了gl_PointCoord。

我不确定这对你是否有效(我不知道为什么它对我有用......)但我的变化的乱码问题是通过在我的末尾加上_coord = gl_TexCoord[0].xy;行来解决的。片段着色器(_coord是一个否则未使用的vec2,我根本没有在其他任何地方调用gl_TexCoord)。我在论坛上发现了这个建议,但对于我的生活,我再也找不到了!