将位置写入纹理 OpenGL/GLSL

Write positions to texture OpenGL/GLSL

我想将 3D 网格的模型-space 顶点位置写入 OGL 中的纹理。目前为了写入纹理,我将其设置为全屏四边形并使用单独的通道写入它(基于看到的教程 here。)

问题是,据我所知,我不能将多个顶点列表传递给着色器,因为顶点着色器只能绑定到一个顶点列表时间,当前被屏幕占用space quad.

顶点着色器代码:

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% 准确,这张图片可能会让您了解我想要做什么:

Model space coordinate map

有没有办法在不使用 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(); 
}