【问题标题】:GLSL(1.2) + VBOs + TexturesGLSL(1.2) + VBO + 纹理
【发布时间】:2013-07-11 16:29:45
【问题描述】:

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

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

这是我的片段着色器:

uniform sampler2D tex;

void main(){
  vec4 color = texture2D(tex,gl_TexCoord[0].st);
  gl_FragColor = color;
}

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

非常感谢您。

【问题讨论】:

  • glEnable(GL_TEXTURE_2D); ?
  • 是的,我用过但什么都没有
  • texLoc = glGetUniformLocation(yourID, textureUniformName); glUniform1i(texLoc, 0);
  • @Borgleader glEnable(GL_TEXTURE_2D 在使用着色器时绝对没有必要,那是用于旧的固定功能纹理。

标签: c++ c glsl


【解决方案1】:

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

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

或者,更现代和面向未来的方法,放弃在着色器中使用旧的固定功能的东西,并将属性作为通用属性放入:

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") 以便将属性索引分配给正确的属性。

但是第二种方法,即使是首选,现在对你来说可能有点太重了,因为它实际上应该伴随着在你的着色器中放弃任何旧的固定功能的东西,比如模型视图投影矩阵,应该是自定义制服,或者 gl_TexCoord[0] 变化,应该是自定义变化。

【讨论】:

  • 呼,终于成功了。我不得不使用 UV = coordtex 而不是 gl_TexCoord [0] = texCoord, 。其中 UV 是一个可变的 vec2 变量,而 coordtex 是一个属性 vec2 变量。这是因为 gl_TexCoord [0] 不是 vec2 变量。非常感谢您的帮助朋友。
  • “这是因为 gl_TexCoord [0] 不是 vec2 变量” - 好吧,您可以将其分配给 2D 部分,然后将其余部分保留为默认值,例如 @987654338 @ 或gl_TexCoord[0].st = texCoord;,或者您可以将属性设为vec4 并让GL 使用默认值填充它的r 和q 坐标。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多