【问题标题】:Draw a cubemap in a single pass OpenGL在单程 OpenGL 中绘制立方体贴图
【发布时间】:2016-06-08 16:20:34
【问题描述】:

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

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

到目前为止,我已经尝试过这种方法,它只发射两个立方体贴图面(正 X 和负 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)(我使用了 ~,因为这些值不完全是这些值,而是近似值)。相反,负 x 面永远不会到达片段着色器阶段。


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

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:
    gl_Layer = 0;
    

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

    【讨论】:

    • 刚刚尝试在每个EmitVertex() 之前添加gl_Layer = 0; 用于正X 面,gl_Layer = 1; 在每个EmitVertex() 之前添加用于负X 面。正 X 面工作(就像以前一样)使负 X 面仍然没有收到任何颜色。看起来只有正 X 面被绑定,因为除了 0 之外的每一层都不起作用,但我已经为目标立方体贴图构建了帧缓冲区,使用 GL_TEXTURE_CUBE_MAP 为纹理目标和 glFramebufferTexture 将其附加到帧缓冲区.我仅将GL_TEXTURE_CUBE_MAP_POSITIVE_X+... 用于glTexImage2D
    • 我认为问题是由于我的glViewport() 调用,当我将帧缓冲区绑定为绘制缓冲区时,因为做一个愚蠢的测试,我试图在glBindFramebuffer 之后删除glViewport() 调用和像这样,负 X 是可见的,但是视口错误。此时,我应该如何设置立方体贴图的视口以进行渲染?
    • 原来我创建了大小为 256x256 像素的立方体贴图,当我将该纹理绑定为渲染目标并将视口设置为大于 181x181 像素的尺寸时,负 X 面不是渲染器.直到 181x181 一切正常,超过 181x181 它不再工作,我不明白为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多