2

我已经为我正在开发的一个小的 openGL 2.0 应用程序编写了自己的顶点和片段着色器。一切似乎都很好,除了一件事,每个顶点的纹理坐标似乎是 (0, 0)。

当我不使用自己的着色器时,即使用openGL的默认着色器时,一切都画得 很好

当我激活自己的着色器时,形状仍然可以,顶点位置是正确的。但是纹理坐标都变成了(0, 0)。

这是顶点着色器的代码:

in vec2 position;
in vec2 texcoord;

out vec2 coord;

void main(void) {
    gl_Position = gl_ModelViewProjectionMatrix * vec4(position, 0, 1);
    coord = vec2(gl_TextureMatrix[0] * vec4(texcoord, 1, 1));
}

这是片段着色器:

uniform sampler2D texture;

uniform float redFactor;
uniform float greenFactor;
uniform float blueFactor;

in vec2 coord;
void main(void) {
    vec4 color = texture2D(texture, coord);
    float grey = (color.r * redFactor + color.g * greenFactor + color.b * blueFactor);
    gl_FragColor = vec4(grey, grey, grey, color.a);
}

同样,没有我自己的 shader也能正常工作。所以 VBO 的设置正确。

顺便说一句,texcoords 正确地从顶点着色器传递到片段着色器。例如,当我换行时

coord = vec2(gl_TextureMatrix[0] * vec4(texcoord, 1, 1));  

在顶点着色器中对此:

coord = vec2(0.5, 0.5);  

我得到正确的结果。

这是我的 VBO 内容的样子:
[0.0, 0.0,
0.0, 0.0,
0.0, 1.0,
0.0, 1.0,
1.0, 1.0,
1.0, 1.0,
1.0, 0.0,
1.0, 0.0]

这是绘图的IBO:

[0, 1, 2, 2, 3, 0]

以下是指针:

VERTEX_ARRAY_POINTER(size = 2, stride = 16, offset = 0),   
TEXCOORD_ARRAY_POINTER(size = 2, stride = 16, offset = 8)  

编辑:顺便问一下,这个编辑器中的换行符有什么问题?

4

2 回答 2

4
于 2013-08-06T14:53:08.850 回答
2

如果您使用的是直上顶点数组指针、texcoord 数组指针等... API 调用,那么您将需要在着色器中使用相应的数组。

更准确地说,当您想要访问着色器中纹理单元 0 的纹理坐标时,您可以使用而不是使用in vec2 texcoord(用于通用顶点属性) 。gl_TexCoord [0]

这里的根本问题是您将弃用的 API 功能 ( glTexCoordPointer) 与新的 GLSL 构造 (inout) 混合在一起。nVIDIA 驱动程序实际上会将调用别名glTexCoordPointer (...)为特定顶点属性槽,但这是非标准行为,您通常不应混合和匹配两者。

唯一保证被 OpenGL 规范别名为特定属性槽的数组指针。是顶点指针,别名为属性槽 0。

最后,您将希望切换到顶点属性数组,因为它们更加灵活并且实际上由核心 OpenGL 支持:)

于 2013-08-06T15:01:24.323 回答