将位置写入纹理OpenGL / GLSL

时间:2015-05-27 20:16:31

标签: c++ opengl textures glsl

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

问题是,根据我的理解,我不能将多个顶点列表传递给着色器,因为顶点着色器一次只能绑定到一个顶点列表,当前由屏幕空间四。

顶点着色器代码:

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上的全屏四边形的情况下将位置编码到纹理?

如果您想查看更多代码,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我不会生成四核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(); 
}