1

我对立方体映射技术有一个奇怪的行为:我所有的像素着色器都返回黑色。所以我有一个黑屏。

情况如下:

我有一个仅由简单的立方体网格(天空盒)和轨迹球相机组成的场景。

现在让我们检查资源(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 格式,但结果是一样的)。

4

0 回答 0