[英]Write positions to texture OpenGL/GLSL
我想將3D網格的模型空間頂點位置寫入OGL中的紋理。 目前,為了寫入紋理,我將其設置為全屏四邊形,並使用單獨的通道(基於此處看到的教程)對其進行寫入。
問題是,據我了解,我無法將多個頂點列表傳遞給着色器,因為頂點着色器一次只能綁定到一個頂點列表,當前被屏幕空間四邊形占用。
頂點着色器代碼:
layout(location = 0) in vec4 in_position;
out vec4 vs_position;
void main() {
vs_position = in_position;
gl_Position = vec4(in_position.xy, 0.0, 1.0);
}
片段着色器代碼:
in vec4 position; // coordinate in the screenspace quad
out vec4 outColor;
void main() {
vec2 uv = vec2(0.5, 0.5) * position.xy + vec2(0.5, 0.5);
outColor = ?? // Here I need my vertex position
}
可能的解決方案(?):
我的想法是在此之前引入另一個着色器通道,以將位置輸出為r,g,b,以便可以從紋理中檢索當前紋理像素的位置(唯一的輸入格式足以存儲許多頂點)。
盡管不是100%准確,但此圖像可能會讓您對我想做什么:
有沒有一種方法可以在GPU上不使用全屏四邊形的情況下將位置編碼為紋理?
如果您想查看更多代碼,請告訴我。
與其生成四邊形CPU端,不如我附加一個幾何着色器並在那里創建四邊形,這將釋放出用於傳遞模型幾何的插槽。
幾何着色器:
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
out vec2 texcoord;
void main()
{
gl_Position = vec4( 1.0, 1.0, 0.5, 1.0 );
texcoord = vec2( 1.0, 1.0 );
EmitVertex();
gl_Position = vec4(-1.0, 1.0, 0.5, 1.0 );
texcoord = vec2( 0.0, 1.0 );
EmitVertex();
gl_Position = vec4( 1.0,-1.0, 0.5, 1.0 );
texcoord = vec2( 1.0, 0.0 );
EmitVertex();
gl_Position = vec4(-1.0,-1.0, 0.5, 1.0 );
texcoord = vec2( 0.0, 0.0 );
EmitVertex();
EndPrimitive();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.