我试图将纹理绑定到我程序的片段着色器中的统一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我可以看到我希望在屏幕上看到的纹理。
所以我得到一个黑屏,但调试程序告诉我没有错。有没有人见过类似的东西?