我试图使用OpenGL中的几何阴影单次绘制到立方体贴图。
基本上需要我执行此操作以将一个多维数据集 map 的内容复制到另一个多维数据集 map 中,并且可能具有不同的分辨率和像素布局。

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

到目前为止,我已经尝试过仅发出两个立方体贴图面(正X和负X)的方法,以查看它是否可以工作,但不起作用。

使用NSight,我可以看到有问题。

这是源立方体贴图:
c++ - 在OpenGL中单次绘制一个立方体贴图-LMLPHP

这是结果立方体贴图:
c++ - 在OpenGL中单次绘制一个立方体贴图-LMLPHP

被吸引的唯一面孔是正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)值(我使用了~,因为这些值并非完全相同,而是近似值)。相反,负x面永远不会到达片段着色器阶段。

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

最佳答案

gl_Layer = 0;

这是一个Geometry Shader output。调用EmitVertex将导致所有输出变量的值变得不确定。因此,必须始终为输出适用的每个顶点设置每个输出。

关于c++ - 在OpenGL中单次绘制一个立方体贴图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37707875/

10-09 13:30