将位置写入纹理OpenGL/GLSL

Write positions to texture OpenGL/GLSL

本文关键字:OpenGL GLSL 纹理 位置      更新时间:2023-10-16

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

问题是,据我所知,我不能传递多个顶点列表到着色器,因为顶点着色器一次只能绑定到一个顶点列表,当前由屏幕空间四边形占用。

顶点着色器代码:

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(); 
}