【问题标题】:OpenGL GLSL texture(...) function always returning v4(0,0,0,1)OpenGL GLSL texture(...) 函数总是返回 v4(0,0,0,1)
【发布时间】:2014-03-21 17:53:53
【问题描述】:

我有以下基本纹理映射设置

void init(void) {
  glGenVertexArrays(NumVAOs, VAOs);
  glBindVertexArray(VAOs[Triangles]);

  GLfloat  vertices[6][2] = {
    { -0.90, -0.90 },  // Triangle 1
    {  0.85, -0.90 },
    { -0.90,  0.85 },

    {  0.1, 0.1 },  // UVs
    {  0.9,  0.1 },
    {  0.1,  0.9 }
  };

  glGenBuffers(NumBuffers, Buffers);

  glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);

  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    GLuint program = LoadShaders( "triangles.vert", "triangles.frag" );
  glUseProgram(program);

  glVertexAttribPointer(vPosition, 2, GL_FLOAT,
                        GL_FALSE, 0, BUFFER_OFFSET(0));

  glEnableVertexAttribArray(vPosition);

  glVertexAttribPointer(1, 2, GL_FLOAT,
                        GL_FALSE, 0, BUFFER_OFFSET(2*3*sizeof(GLfloat)));

  glEnableVertexAttribArray(1);

  GLuint sloc = glGetUniformLocation(program, "mySampler");
  glUniform1i(sloc, 0);

  int x,y,n;
  unsigned char *data = stbi_load("bricks.jpg", &x, &y, &n, 4);

  glGenTextures(1, &m_textureId);
  glBindTexture(GL_TEXTURE_2D, m_textureId);
  glTexParameterf(m_textureId, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(m_textureId, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

  stbi_image_free(data);
}

void display(void) {
  glClear(GL_COLOR_BUFFER_BIT);

  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, m_textureId);

  glBindVertexArray(VAOs[Triangles]);
  glDrawArrays(GL_TRIANGLES, 0, NumVertices);
  glFlush();
}

顶点着色器:

#version 330 core

layout(location = 0) in vec4 vPosition;
layout(location = 1) in vec2 uv;

out vec2 texCoord;

void
main() {
  gl_Position = vPosition;
  texCoord = uv;
}

片段着色器:

#version 330 core

in vec2 texCoord;

out vec4 fColor;

uniform sampler2D mySampler;

void
main() {
  fColor = texture(mySampler, texCoord);
}

但是,屏幕上没有显示任何内容。如果我将我的碎片着色器换成只设置静态颜色的着色器,我会看到三角形。我已经确认我正在从图像中获取数据并打印出一组看起来正确的 RGBA 数据样本(rgb 变化,但 alpha 是恒定的 0xFF)。我已经阅读了至少 5 个教程,但似乎无法正确理解。

我也确认如果我这样做:

fColor = vec4(texCoord.x, texCoord.y, 0.0, 1.0);

我得到了一个渐变的颜色,我相信这告诉我我得到了正确插入的 UV 值。

【问题讨论】:

  • 您确定着色器确实编译成功,以防万一吗?
  • 是的。似乎我从对纹理(...)的调用中得到了 vec4(0.0,0.0,0.0,1.0)。
  • 上传纹理图片后尝试调用glGenerateMipmap(GL_TEXTURE_2D),有帮助吗?

标签: opengl texture-mapping


【解决方案1】:

显然,某些实现需要这些 texparams

glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

【讨论】:

  • 哦,错误是您指定m_textureId 而不是GL_TEXTURE_2D 作为glTexParameter 的参数?
猜你喜欢
  • 2017-12-03
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多