0

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

#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);

}

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

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

我尝试将值发送到制服上,但它也始终为零。

我正在使用 LWJGL。

4

2 回答 2

0

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

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

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

于 2012-10-03T15:41:02.310 回答
0

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

您是否尝试过与 GL_TRIANGLE_STRIP 相同的操作?这里可能只有 GL_POINTS 拓扑错误。顺便提一句。纹理 GL_POINTS 对我来说是一个奇怪的想法。

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

于 2012-06-30T00:36:44.590 回答