[英]Draw a cubemap in a single pass OpenGL
我試圖在OpenGL中使用幾何陰影在單個通道中繪制立方體貼圖。 基本上我需要這樣做才能將立方體貼圖的內容復制到另一個立方體貼圖中,並且可能沒有相同的分辨率和像素布局。
我正在嘗試實現我想要將單個點提供給頂點着色器的結果,然后從幾何着色器中選擇每個圖層(立方體貼圖的面)並發出四邊形和紋理坐標。
到目前為止,我已經嘗試過這種方法只發出兩個立方體貼圖面(正面和負面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)
值vec3(~1.0, ~0.0, ~0.0)
(我已經使用過~
因為這些值不是那些但是近似的值)。 負x面反而永遠不會到達片段着色器階段。
更新我的頂點位置的定義從vec4(x, y, z, 0.0)
更改為vec4(x, y, z, 1.0)
使我的着色器正確渲染正X面,但負面仍然是錯誤的,即使調試片段着色器我看到選擇並應用了正確的顏色,但隨后變為黑色。
gl_Layer = 0;
這是幾何着色器輸出 。 調用EmitVertex
將導致所有輸出變量的值變為未定義。 因此,您必須始終為該輸出應用的每個頂點設置每個輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.