奇怪的问题。好像我的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。
答案 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)。我在论坛上发现了这个建议,但对于我的生活,我再也找不到了!