簡體   English   中英

將位置寫入紋理OpenGL / GLSL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM