我对Cube Mapping技术有一种奇怪的行为:我的所有像素着色器都返回黑色。所以我的结果是黑屏。
情况如下:
我的场景只由一个简单的立方体网格(天空盒)和一个跟踪球相机组成。
现在让我们检查资源(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上正确加载:
正如您所看到的,因为它是在我的纹理上面的代码片段中写的,RGB纹理绑定到单位纹理1并且它是GL_TEXTURE_CUBE_MAP纹理类型。所以直到这里似乎都是正确的!
如果我在片段着色器中替换行:
vec4 finalColor = texture(CubeMapSampler, TexCoords);
按行:
vec4 finalColor = vec4(TexCoords, 1.0f);
我有以下结果(我直接渲染模型空间中的顶点坐标作为颜色)没有线框:
与线框相同的结果:
另外,我想精确地说明这一行:
std::cout << glGetError() << std::endl;
始终返回'0'值,因此我没有错误!
所以我认为这两张最后的图片显示矩阵信息是正确的,顶点坐标也是正确的(而且我使用轨迹球相机,当我移动到我的场景中时,我可以识别立方体结构)。所以对我来说,我在着色器程序中恢复的所有信息都是正确的,除了立方体采样器!我认为问题来自这个采样器。但是正如您在上面看到的那样,立方体贴图似乎正确加载。
我真的迷失在这种情况面前。我不明白为什么所有像素着色器都返回#000000颜色(我也尝试使用RGBA格式,但结果是一样的)。