我对立方体映射技术有一个奇怪的行为:我所有的像素着色器都返回黑色。所以我有一个黑屏。
情况如下:
我有一个仅由简单的立方体网格(天空盒)和轨迹球相机组成的场景。
现在让我们检查资源(6 个独立纹理的方面):
这是图像详细信息:
如您所见,这些纹理需要以 GL_RGB 格式加载。
现在,对于初始化部分,让我们看一下客户端 C++ 纹理加载代码(我使用“DevIL”库来加载我的图像):
glGenTextures(1, &this->m_Handle);
glBindTexture(this->m_Target, this->m_Handle);
{
glTexParameteri(this->m_Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(this->m_Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(this->m_Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(this->m_Target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(this->m_Target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
{
for (uint32_t idx = 0; idx < this->m_SourceFileList.size(); idx++)
{
ilLoadImage((const wchar_t*)this->m_SourceFileList[idx].c_str()); //IMAGE LOADING
{
uint32_t width = ilGetInteger(IL_IMAGE_WIDTH);
uint32_t height = ilGetInteger(IL_IMAGE_HEIGHT);
uint32_t bpp = ilGetInteger(IL_IMAGE_BPP);
{
char *pPixelData = (char*)ilGetData();
glTexImage2D(this->m_TargetList[idx], 0, GL_RGB8,
width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
}
}
}
}
}
glBindTexture(this->m_Target, 0);
关于主循环部分,这是我发送给着色器程序的信息(纹理和矩阵数据):
//TEXTURE DATA
scene::type::MaterialPtr pSkyBoxMaterial = pBatch->GetMaterial();
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_CUBE_MAP,
pSkyBoxMaterial->GetDiffuseTexture()->GetHandle());
this->SetUniform("CubeMapSampler", 1);
//MATRIX DATA
this->SetUniform("ModelViewProjMatrix", pBatch->GetModelViewProjMatrix());
如您所见,立方体贴图纹理绑定到纹理单元 1。
现在这里是顶点着色器:
#version 400
/*
** Vertex attributes.
*/
layout (location = 0) in vec3 VertexPosition;
/*
** Uniform matrix buffer.
*/
uniform mat4 ModelViewProjMatrix;
/*
** Outputs.
*/
out vec3 TexCoords;
/*
** Vertex shader entry point.
*/
void main(void)
{
TexCoords = VertexPosition;
gl_Position = ModelViewProjMatrix * vec4(VertexPosition, 1.0f);
}
最后是片段着色器:
#version 400
/*
** Output color value.
*/
layout (location = 0) out vec4 FragColor;
/*
** Vertex inputs.
*/
in vec3 TexCoords;
/*
** Texture uniform.
*/
uniform samplerCube CubeMapSampler;
/*
** Fragment shader entry point.
*/
void main(void)
{
vec4 finalColor = texture(CubeMapSampler, TexCoords);
FragColor = finalColor;
}
所以所有编译和执行的程序都显示以下结果:
但我想准确地说我使用的是 NVIDIA NSight 调试器,我想首先向您展示立方体贴图已正确加载到 GPU 上:
如您所见,它是在上面的代码中编写的,我的纹理是绑定到单元纹理 1 的 RGB 纹理,它是 GL_TEXTURE_CUBE_MAP 纹理类型。所以直到这里一切似乎都是正确的!
如果我在片段着色器中替换该行:
vec4 finalColor = texture(CubeMapSampler, TexCoords);
按行:
vec4 finalColor = vec4(TexCoords, 1.0f);
我有以下结果(我直接将模型空间中的顶点坐标渲染为颜色)没有线框:
与线框相同的结果:
另外,我想准确地说:
std::cout << glGetError() << std::endl;
总是返回“0”值,所以我没有错误!
所以我认为这最后两张图片表明矩阵信息是正确的,顶点坐标也是正确的(此外,我使用的是轨迹球相机,当我移动到我的场景中时,我可以识别立方体架构)。所以对我来说,我在着色器程序中恢复的所有信息都是正确的,除了立方体采样器!我认为问题出在这个采样器上。但是,正如您在上面看到的那样,立方体贴图似乎已正确加载。
在这种情况面前,我真的很迷茫。我不明白为什么所有像素着色器都返回 #000000 颜色(我也尝试使用 RGBA 格式,但结果是一样的)。