在单个传递中绘制立方体贴图OpenGL

时间:2016-06-08 16:20:35

标签: c++ opengl

我正在尝试使用OpenGL中的几何阴影在单个通道中绘制立方体贴图。 基本上我需要这样做才能将立方体贴图的内容复制到另一个立方体贴图中,并且可能没有相同的分辨率和像素布局。

我正在尝试实现我希望将单个点提供给顶点着色器的结果,然后从几何着色器中选择每个图层(立方体贴图的面)并发出四边形和纹理坐标。

到目前为止,我已经尝试过这种方法只发出两个立方体贴图面(正面和负面X)来查看它是否可以正常工作,但事实并非如此。

使用NSight我可以看到出现了问题。

这是源立方体贴图: enter image description here

这是立方体贴图的结果: enter image description here

被吸引的唯一面孔是正X,但仍然不正确。

这是我的几何着色器:

#version 330 core

layout(points) in;
layout(triangle_strip, max_vertices = 8) out;

in vec3 pos[];
out vec3 frag_textureCoord;

void main()
{
    const vec4 positions[4] = vec4[4] ( vec4(-1.0, -1.0, 0.0, 0.0),
                                        vec4( 1.0, -1.0, 0.0, 0.0),
                                        vec4(-1.0,  1.0, 0.0, 0.0),
                                        vec4( 1.0,  1.0, 0.0, 0.0) );

    // Positive X
    gl_Layer = 0;

    gl_Position = positions[0];
    frag_textureCoord = vec3(1.0, -1.0, -1.0);
    EmitVertex();

    gl_Position = positions[1];
    frag_textureCoord = vec3(1.0, -1.0,  1.0);
    EmitVertex();

    gl_Position = positions[2];
    frag_textureCoord = vec3(1.0,  1.0, -1.0);
    EmitVertex();

    gl_Position = positions[3];
    frag_textureCoord = vec3(1.0,  1.0,  1.0);
    EmitVertex();                    
    EndPrimitive();

    // Negative X
    gl_Layer = 1;

    gl_Position = positions[0];
    frag_textureCoord = vec3(-1.0, -1.0,  1.0);
    EmitVertex();

    gl_Position = positions[1];
    frag_textureCoord = vec3(-1.0, -1.0, -1.0);
    EmitVertex();

    gl_Position = positions[2];
    frag_textureCoord = vec3(-1.0,  1.0,  1.0);
    EmitVertex();

    gl_Position = positions[3];
    frag_textureCoord = vec3(-1.0,  1.0, -1.0);
    EmitVertex();                    
    EndPrimitive();
}

这是我的片段着色器:

#version 150 core

uniform samplerCube AtmosphereMap;

in vec3 frag_textureCoord;

out vec4 FragColor;

void main()
{
    FragColor = texture(AtmosphereMap, frag_textureCoord) * 1.0f;
}

UPDATE 使用NSight进一步调试显示,对于正x面,每个片段的值frag_textureCoord都为vec3(~1.0, ~0.0, ~0.0)(我使用~,因为值不是那些值,而是近似值)。负x面不会到达片段着色器阶段。

UPDATE 将我的顶点位置的定义从vec4(x, y, z, 0.0)更改为vec4(x, y, z, 1.0)会使我的着色器正确渲染正X面,但负面仍然是错误的,即使调试片段着色器我看到选择了正确的颜色并应用,但随后变黑。

1 个答案:

答案 0 :(得分:3)

gl_Layer = 0;

这是Geometry Shader output。调用EmitVertex将导致所有输出变量的值变为未定义。因此,您必须始终为该输出应用的每个顶点设置每个输出。