我已经为我正在开发的一个小的 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)
编辑:顺便问一下,这个编辑器中的换行符有什么问题?