我试图使用OpenGL中的几何阴影单次绘制到立方体贴图。
基本上需要我执行此操作以将一个多维数据集 map 的内容复制到另一个多维数据集 map 中,并且可能具有不同的分辨率和像素布局。
我正在尝试实现将单个点馈入顶点着色器,然后从几何着色器中选择每个图层(立方体贴图的面)并发出四边形和纹理坐标的结果。
到目前为止,我已经尝试过仅发出两个立方体贴图面(正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_textureCoord
的vec3(~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/