OpenGL:Sampler2D绑定,但为空

时间:2018-01-13 17:42:26

标签: c++ opengl textures

我试图将纹理绑定到我程序的片段着色器中的统一sampler2D,但是当我从纹理中读取时,我得到的只是黑色。然后,我使用了一个名为RenderDoc的图形化调试器来检查我上传的纹理,有趣的是RenderDoc找到了纹理,确认它已被绑定,并且它包含了我希望它包含的内容。

这就是我按照我的顺序做的事情:

使用glTexImage2D创建纹理:

GLuint m_buffers[2];
glGenTextures(2, this->m_buffers);


glBindTexture(GL_TEXTURE_2D, this->_m_buffers[0]);
glTexImage2D(
    GL_TEXTURE_2D,
    0,                      //Mipmaps
    GL_RGBA,                //Internal format
    this->m_texture_width,
    this->m_texture_height,
    0,                      //Border
    GL_RGBA,                //Format read
    GL_UNSIGNED_BYTE,       //Type of values in read format
    NULL                    //source
);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);       //When shrunk go blurry
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);       //When enlarged go blurry
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);    //Set wrapping to clamp to edge
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);    //Set wrapping to clamp to edge

在着色器中修复制服(uniform_name是" texture_computed0")

GLint uniLoc = glGetUniformLocation(this->m_program, uniform_name.c_str());
if(uniLoc == (GLint)-1) {
   //If it does not, write out an error
   std::cout << "ERROR::SHADER::" << uniform_name << "::UNIFORM_NOT_FOUND" << std::endl;
}

将纹理绑定到纹理单元6(COMPUTE_TEX)

Bind2DTextureTo(this->m_buffers[0], COMPUTE_TEX);

使用此功能

enum TextureEnums {
 POS_TEX,        //0
 NOR_TEX,        //1
 DIFFSPEC_TEX,   //2
 LGTPOS_TEX,     //3
 MESHDIFF_TEX,   //4
 MESHSPEC_TEX,   //5
 COMPUTE_TEX,    //6
 DEPTH_TEX,      //7
 NUM_OF_TEX
};

inline void Bind2DTextureTo(GLuint texture_id, TextureEnums target_unit) {
 glActiveTexture(GL_TEXTURE0 + target_unit);
 glBindTexture(GL_TEXTURE_2D, texture_id);
}

然后在片段着色器中接收它,如:

layout (binding=6) uniform sampler2D texture_computed0;

最后尝试使用它:

out_col = texture(texture_computed0, v_uvs);

现在out_col是一个vec4,它被绘制到屏幕上并试图从其他纹理中获取颜色非常合适。然后我进入了RenderDoc,它向我展示纹理 texture_diffuse0 绑定到纹理单元6,它具有正确的比例,具有预期的格式rgba8,如果我打开绑定纹理RenderDoc我可以看到我希望在屏幕上看到的纹理。

所以我得到一个黑屏,但调试程序告诉我没有错。有没有人见过类似的东西?

0 个答案:

没有答案