繁体   English   中英

在单通道OpenGL中绘制立方体贴图

[英]Draw a cubemap in a single pass OpenGL

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

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

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

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

这是源立方体贴图: 在此输入图像描述

这是立方体贴图的结果: 在此输入图像描述

被吸引的唯一面孔是正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;
}

更新使用NSight的进一步调试显示,对于正x面,每个片段都获得frag_textureCoordvec3(~1.0, ~0.0, ~0.0)vec3(~1.0, ~0.0, ~0.0) (我已经使用过~因为这些值不是那些但是近似的值)。 负x面反而永远不会到达片段着色器阶段。


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

gl_Layer = 0;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM