使用OpenGL / GLSL,多维数据集映射无法正常工作

时间:2015-02-07 18:14:19

标签: opengl glsl shader skybox

我对Cube Mapping技术有一种奇怪的行为:我的所有像素着色器都返回黑色。所以我的结果是黑屏。

情况如下:

我的场景只由一个简单的立方体网格(天空盒)和一个跟踪球相机组成。

现在让我们检查资源(6个独立纹理的方面):

enter image description here

这是图片细节:

enter image description here

因此,您可以看到这些纹理需要以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;
}

因此编译和执行的所有程序都显示以下结果:

enter image description here

但我想要精确地使用NVIDIA NSight调试器,我想首先向您展示多维数据集地图在GPU上正确加载:

enter image description here

正如您所看到的,因为它是在我的纹理上面的代码片段中写的,RGB纹理绑定到单位纹理1并且它是GL_TEXTURE_CUBE_MAP纹理类型。所以直到这里似乎都是正确的!

如果我在片段着色器中替换行:

vec4 finalColor = texture(CubeMapSampler, TexCoords);

按行:

vec4 finalColor = vec4(TexCoords, 1.0f);

我有以下结果(我直接渲染模型空间中的顶点坐标作为颜色)没有线框:

enter image description here

与线框相同的结果:

enter image description here

另外,我想精确地说明这一行:

std::cout << glGetError() << std::endl;

始终返回'0'值,因此我没有错误!

所以我认为这两张最后的图片显示矩阵信息是正确的,顶点坐标也是正确的(而且我使用轨迹球相机,当我移动到我的场景中时,我可以识别立方体结构)。所以对我来说,我在着色器程序中恢复的所有信息都是正确的,除了立方体采样器!我认为问题来自这个采样器。但是正如您在上面看到的那样,立方体贴图似乎正确加载。

我真的迷失在这种情况面前。我不明白为什么所有像素着色器都返回#000000颜色(我也尝试使用RGBA格式,但结果是一样的)。

0 个答案:

没有答案