OpenGL GLSL纹理(…)函数始终返回v4(0,0,0,1)

OpenGL GLSL纹理(…)函数始终返回v4(0,0,0,1),opengl,texture-mapping,Opengl,Texture Mapping,对于基本纹理贴图,我有以下设置 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

对于基本纹理贴图,我有以下设置

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);
}
但是,屏幕上没有显示任何内容。如果我把我的frag着色器换成只设置静态颜色的,我会看到三角形。我已经确认我正在从图像中获取数据,并打印出一组看起来正确的RGBA数据样本(rgb不同,但alpha为常数0xFF)。我已经阅读了至少5篇教程,但似乎没有正确理解

我还确认,如果我这样做:

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

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

显然,这些texparam是某些实现所必需的

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

你确定着色器编译成功了吗,以防万一?是的。似乎我正在从调用纹理(…)返回vec4(0.0,0.0,0.0,1.0)。上传纹理图像后,尝试调用
glGenerateMipmap(GL\u texture\u 2D)
,这有帮助吗?哦,错误是您为
glTexParameter
的参数指定了
m_textureId
而不是
GL_TEXTURE\u 2D