GLSL(1.2) + VBOs + Textures

GLSL(1.2) + VBOs + Textures

本文关键字:VBOs Textures GLSL      更新时间:2023-10-16

再次应用他们对问题的大量帮助。这是我的代码:

  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;
}

问题是没有出现纹理或其他任何东西。我可以说怎么了?

事先非常感谢。

您正在着色器中使用旧的固定函数属性(如ftransform使用的gl_MultiTexCoord0gl_Vertex)。但在应用程序代码中,您尝试使用通用属性接口(如glVertexAttribPointerglEnableVertexAttribArray)加载它们。这不起作用(它可能适用于属性0,它是gl_Vertex的别名,但这无论如何都是违反直觉的)。

有两种方法可以解决这个问题。请不要使用通用属性API,而是使用旧的固定函数属性,因此用glVertexPointer替换glVertexAttribPointer(0, ...),用glTexCoordPointer替换glVertexAttribPointer(1, ...),同样用glEnableClientState(GL_VERTEX_ARRAY)glEnableClientState(GL_TEXTURE_COORD_ARRAY)替换glEnableVertexAttribArray

或者,更现代、更经得起未来考验的方法是,在着色器中放弃使用旧的固定函数,并将属性作为通用属性放入:

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]变化,它更应该是自定义变化的。