【发布时间】: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_textureCoord 或 vec3(~1.0, ~0.0, ~0.0)(我使用了 ~,因为这些值不完全是这些值,而是近似值)。相反,负 x 面永远不会到达片段着色器阶段。
更新
将我的顶点位置的定义从vec4(x, y, z, 0.0) 更改为vec4(x, y, z, 1.0) 使我的着色器正确渲染正X 面,但负X 面仍然是错误的,即使调试片段着色器我看到选择并应用了正确的颜色,但是然后变成黑色。
【问题讨论】: