OpenGL GLSL纹理(...)函数总是返回v4(0,0,0,1)

WSk*_*ner 3 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
    {  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();
}
Run Code Online (Sandbox Code Playgroud)

顶点着色器:

#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;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 330 core

in vec2 texCoord;

out vec4 fColor;

uniform sampler2D mySampler;

void
main() {
  fColor = texture(mySampler, texCoord);
}
Run Code Online (Sandbox Code Playgroud)

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

我也确认如果我这样做:

fColor = vec4(texCoord.x, texCoord.y, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)

我得到一个渐变的颜色,我相信告诉我,我正确地插入了我的紫外线的内插值.

WSk*_*ner 5

显然,这些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 );
Run Code Online (Sandbox Code Playgroud)