C++ 在单遍OpenGL中绘制立方体贴图

C++ 在单遍OpenGL中绘制立方体贴图,c++,opengl,C++,Opengl,我正在尝试使用OpenGL中的几何阴影在一次过程中绘制立方体贴图。 基本上,我需要这样做是为了将一个立方体贴图的内容复制到另一个立方体贴图中,而这个立方体贴图可能没有相同的分辨率和像素布局 我正在尝试实现我想要的结果,即向顶点着色器提供一个点,然后从几何体着色器中选择每个层(立方体贴图的面),并发射一个四边形和纹理坐标 到目前为止,我已经尝试过这种方法,只发射两个立方体贴图面(正X和负X),看看它是否能工作,但它不能 使用NSight,我可以看出有什么不对劲 这是源cubemap: 这是立方体

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

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

到目前为止,我已经尝试过这种方法,只发射两个立方体贴图面(正X和负X),看看它是否能工作,但它不能

使用NSight,我可以看出有什么不对劲

这是源cubemap:

这是立方体映射的结果:

唯一被吸引的面是正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_textureCoord
of
vec3(~1.0,~0.0,~0.0)
(我使用了
~
,因为这些值不是精确值,而是近似值)。相反,负x面永远不会到达片段着色器阶段


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

gl_Layer = 0;

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

刚刚尝试添加
gl\u Layer=0gl_层=1,在每个
EmitVertex()之前进行编码>EmitVertex()之前执行code>。正片的X光脸(就像以前一样)但是负片的X光脸仍然没有任何颜色。看起来只有正X面是绑定的,因为除了0之外的每一层都不工作,但是我已经为目标立方体贴图构建了帧缓冲区,使用
GL\u TEXTURE\u CUBE\u MAP
为纹理目标,并
glFramebufferTexture
将其附加到帧缓冲区。我只在
glTexImage2D
中使用
GL\u纹理\u立方体\u贴图\u正片\u X+…
我认为问题是由于我在将帧缓冲区绑定为绘图缓冲区时调用了
glViewport()
造成的,因为我做了一个愚蠢的测试,试图删除
glViewport()
glBindFramebuffer
之后调用,像这样,负X是可见的,但视口错误。在这一点上,我应该如何设置立方体贴图的te视口以便渲染到它?事实证明,我创建的立方体贴图大小为256x256像素,当我将该纹理绑定为渲染目标并将视口设置为大于181x181像素的尺寸时,负X面不是渲染器。直到181x181一切正常,超过181x181它不再工作,我不明白为什么