【问题标题】:OpenGL 3.3 texture mapping triangleOpenGL 3.3 纹理映射三角形
【发布时间】:2013-08-14 08:14:38
【问题描述】:

在过去的几天里,我只是在 Opengl 3.3(核心)中对三角形进行了纹理处理,运气不佳。我可以成功渲染顶点和颜色,但纹理似乎有问题。我当前的任务/目标只是顶点和纹理坐标(没有颜色)。

由于我手动创建了测试纹理,它应该显示为 16x16 白色/红色方格三角形。

奇怪的行为:如果我使用 GL_CLAMP_TO_EDGE,它全是白色的。如果我使用 GL_REPEAT,它会变成粉红色(白色 + 红色)...

顶点着色器:

#version 330
layout (location = 0) in vec3 vertPos;
layout (location = 1) in vec2 texCoord;
out vec2 tex;
uniform mat4 viewMatrix, projMatrix;
void main()
{
  gl_Position = projMatrix * viewMatrix * vec4(vertPos,1.0);
  tex = texCoord;
};

片段着色器:

#version 330
out vec4 Color;
in vec2 tex;
uniform sampler2D texsampler;
void main() {
  Color = texture(texsampler, tex);
};

状态初始化代码(按顺序排列):

  glPixelStorei(GL_UNPACK_ALIGNMENT,1);
  //glPixelStorei(GL_PACK_ALIGNMENT,1);

  glFrontFace(GL_CW);  // clockwise oriented polys are front faces
  glCullFace(GL_BACK); // cull out the inner polygons... Set Culling property appropriately

  glLineWidth(1.0f); // for any wireframe

  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // color 1.0f is fully opaque, 0.0f is transparent

  glDepthFunc(GL_LEQUAL);
  glDepthRange(0,1); // default

  glDisable(GL_CULL_FACE);

  glClearColor(0.0f,0.0f,0.0f,1.0f); // set clear color to black

  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); // filled polys

纹理初始化:

  glGenTextures(1,&texid1);
  glBindTexture (GL_TEXTURE_2D, texid1);

  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    uint32 buf[16*16];
    uint32 x;
    for (x=0;x<16*16;) {
      buf[x++] = 0xFFFFFFFF;
      buf[x++] = 0xFFFF0000;
    }

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8 , 16, 16, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)buf);

  glBindTexture (GL_TEXTURE_2D, 0);

着色器初始化:

  shader1 = new_gl_shader_program(vert_src,frag_src);
  if (shader1) {
    if (link_gl_shader_program(shader1)) {

      projMatrixLoc = glGetUniformLocation(shader1, "projMatrix");
      viewMatrixLoc = glGetUniformLocation(shader1, "viewMatrix");

      sampler2dLoc = glGetUniformLocation(shader1, "texsampler");

      glBindFragDataLocation( shader1, 0, "Color" ); // ADDED.

    }
    else {
      print("LINK ERROR: %s\n",get_gl_shader_msg());
      delete_gl_shader_program(shader1);
      shader1 = 0;
    }
  }
  else
    print("COMPILE/MISC ERROR: %s\n",get_gl_shader_msg());

  if (!shader1)
    return;

缓冲区数据初始化:

typedef struct MESH_VERT_3D {
  float x,y,z;
  float u,v;
}MESH_VERT_3D;

MESH_VERT_3D meshbuf[3]; // total of 15 floats

    meshbuf[0].x = 0.0f;
    meshbuf[0].y = 0.0f;
    meshbuf[0].z = 0.0f;

    meshbuf[1].x = 1.0f;
    meshbuf[1].y = 0.0f;
    meshbuf[1].z = 0.0f;

    meshbuf[2].x = 1.0f;
    meshbuf[2].y = 0.0f;
    meshbuf[2].z = 1.0f;

    meshbuf[0].u = 0.0f;
    meshbuf[0].v = 1.0f;
    meshbuf[1].u = 1.0f;
    meshbuf[1].v = 1.0f;
    meshbuf[2].u = 1.0f;
    meshbuf[2].v = 0.0f;

    glGenBuffers(1, &vboid);
    glBindBuffer(GL_ARRAY_BUFFER, vboid);
    glBufferData(GL_ARRAY_BUFFER, sizeof(meshbuf), meshbuf, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glGenVertexArrays(1, &vaoHandle);
    glBindVertexArray(vaoHandle);

    glBindBuffer(GL_ARRAY_BUFFER, vboid);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5, null);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(float)*5, (void*)(sizeof(float)*3));
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

渲染:

  gls_begin_3d(&glscene);
  use_gl_shader_program(shader1);

  glUniformMatrix4fv(projMatrixLoc,  1, GL_FALSE, gls_get_projection_matrix());
  glUniformMatrix4fv(viewMatrixLoc,  1, GL_FALSE, gls_get_modelview_matrix());

  glActiveTexture(GL_TEXTURE0);
  glBindTexture (GL_TEXTURE_2D, texid1);
  glUniform1i(sampler2dLoc, 0);

  glBindVertexArray(vaoHandle);

  glDrawArrays(GL_TRIANGLES, 0, 3 );

  glBindTexture (GL_TEXTURE_2D, 0);

  use_gl_shader_program(0);
  gls_end_3d(&glscene);

【问题讨论】:

  • 它没有错误。
  • 在渲染循环中添加了对 glGetError() 的调用。它正在喷出 0x0(无错误)。
  • 事后看来,这是关于在 stackoverflow 和 web 上使用 glsl 的基本 Opengl 3.3+ 纹理映射问题的最彻底的问题和一组答案。像这样的事情会在几天前帮助我起床和跑步。我希望它可以帮助其他人,所以他们不会像以前那样气馁!诚然,95% 可以在网络上(通过谷歌等)追踪到,但最后一点(5%)的有用信息确实有帮助。

标签: c++ opengl glsl texture-mapping opengl-3


【解决方案1】:

问题 1:

您应该将片段着色器输出变量Color 绑定到片段数据位置:

glBindFragDataLocation( shader1, 0, "Color" );

否则 OpenGL 不知道着色器程序的结果位于何处。

问题 2:

您为纹理坐标创建第二个缓冲区对象:glGenBuffers(1, &amp;tboid); 但是,所有内容都应放入单个 VBO。

问题 3:

你将null传递给glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(float)*5, null);,但是纹理坐标的开头不是0,而是sizeof(float)*3

问题 4:

在顶点着色器中,您有out vec2 texCoordOut;。但是,在片段着色器中,您使用 in vec2 tex;。名称应该匹配。

【讨论】:

  • 我将问题更新得更好一些。我会考虑你的建议。
  • 尝试调试它。而不是Color = texture(texsampler, tex);Color = vec4(tex.x, tex.y, 0.0, 0.0); 告诉我们你看到了什么。
  • 好的,我将它添加到“sampler2dLoc = ...”下方的着色器初始化部分(在我这边)。这似乎没有什么不同。不过,这个建议仍然很有意义。嗯。
  • 如果没有区别,那么问题不在于纹理。
  • 好的!我添加了 Color = vec4(tex.x, tex.y, 0.0, 0.0);像你建议的那样到片段着色器,现在什么都没有出现!它是空白的(黑色?)!
【解决方案2】:

在顶点着色器中,你有

out vec2 texCoordOut;

但在片段着色器中,您使用

in vec2 tex;

这是行不通的,因为您需要使用相同的名称,以便 GL 可以匹配它。

【讨论】:

  • @CoderX:大声笑,在那之前有 3 个错误 :)
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 2011-04-04
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多