再次运用他们的大量帮助解决问题。这是我的代码:
float ctex[] = {0.0,0.0,
0.0,1.0,
1.0,1.0,
1.0,0.0};
float data[] = {1.0, 1.0,-5.0,
-1.0,-1.0,-5.0,
1.0,-1.0,-5.0,
-1.0, 1.0,-5.0};
GLuint ind[] = {0,1,2,0,3,1};
LoadTexture();
glGenBuffers(1,&triangleVBO);
glBindBuffer(GL_ARRAY_BUFFER,triangleVBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(data),data,GL_STATIC_DRAW);
glGenBuffers(1,&triangleIND);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,triangleIND);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ind),ind,GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
glGenBuffers(1,&triangleT[0]);
glBindBuffer(GL_ARRAY_BUFFER,triangleT[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(ctex),ctex,GL_STATIC_DRAW);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0);
GLuint v,f,p;
v = glCreateShader(GL_VERTEX_SHADER);
f = glCreateShader(GL_FRAGMENT_SHADER);
p = glCreateProgram();
char *vsFuente = LeeShader("shaders/shader.vert");
char *fsFuente = LeeShader("shaders/shader.frag");
const char *vs = vsFuente;
const char *fs = fsFuente;
glShaderSource(v,1,&vs,NULL);
glShaderSource(f,1,&fs,NULL);
free(vsFuente);free(fsFuente);
glCompileShader(v);
glCompileShader(f);
glAttachShader(p,v);
glAttachShader(p,f);
glLinkProgram(p);
//main loop
while(1){
...etc.
glUseProgram(p);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,triangleVBO);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
glDisableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,triangleTex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,idtextere);
glEnable(GL_TEXTURE_2D);
glDisableVertexAttribArray(1);
glUseProgram(0);
...etc.
}
这是我的顶点着色器:
void main(){
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
这是我的片段着色器:
均匀采样器2D tex;
void main(){
vec4 color = texture2D(tex,gl_TexCoord[0].st);
gl_FragColor = color;
}
问题是纹理没有出现或其他任何东西。我可以说是什么问题?
提前非常感谢您。
最佳答案
您正在着色器中使用旧的固定功能属性(例如gl_MultiTexCoord0
所使用的gl_Vertex
或ftransform
)。但是在您的应用程序代码中,您尝试使用通用属性接口(interface)(例如glVertexAttribPointer
和glEnableVertexAttribArray
)加载它们。这是行不通的(它可能适用于属性0,尽管它是gl_Vertex
的别名,但这仍然是违反直觉的)。
有两种方法可以解决此问题。要么不使用通用属性API,要么使用旧的固定功能属性,所以用glVertexAttribPointer(0, ...)
替换glVertexPointer
,用glVertexAttribPointer(1, ...)
替换glTexCoordPointer
,同样用glEnableVertexAttribArray
和glEnableClientState(GL_VERTEX_ARRAY)
替换glEnableClientState(GL_TEXTURE_COORD_ARRAY)
。
或者,采用更现代,更适应 future 的方法,将旧的固定功能的东西放到着色器中,然后将属性作为通用属性放入:
attribute vec4 position;
attribute vec2 texCoord;
void main() {
gl_TexCoord[0] = texCoord;
gl_Position = gl_ModelViewProjectionMatrix * position;
}
并且不要忘记在链接程序之前调用
glBindAttribLocation(p, 0, "position")
和glBindAttribLocation(p, 1, "texCoord")
以便将属性索引分配给正确的属性。但是第二种方法,即使是首选方法,现在对您来说也可能是一个太大的改变,因为它实际上应该伴随着在着色器中删除对旧固定功能的任何使用,例如modelview投影矩阵,可以是自定义制服,也可以是
gl_TexCoord[0]
变化,而应该是自定义变化。关于c++ - GLSL(1.2)+ VBO +纹理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17582869/