【问题标题】:Write positions to texture OpenGL/GLSL将位置写入纹理 OpenGL/GLSL
【发布时间】:2015-05-30 05:53:03
【问题描述】:

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

如果您想查看更多代码,请告诉我。

【问题讨论】:

  • 您可以将模型顶点绘制为点(因此它们只处理一次),然后使用gl_VertexID计算gl_Position
  • 嗯,你能详细说明一下吗?我应该在管道的哪个阶段执行此操作,这将使我能够将位置写入 rgba 纹理吗?我的问题是我希望在着色器管道中同时拥有全屏四边形和模型空间顶点数据,并具有一个顶点数组输入的约束。 gl_VertexID 与输出纹理中的 UV 空间有何关系? @GuyRT
  • 使用我的想法,你不需要显式地绘制一个四边形,但是从顶点数据生成的点将被绘制(在一次绘制调用中)到纹理中。你会使用gl_VertexID 类似:gl_Position.xy = vec2( mod(gl_VertexID, textureWidth), floor(gl_VertexID / textureWidth) * vec2( 2.0 / textureWidth, 2.0 / textureHeight) - 1.0。第二部分映射到 -1 -> 1 剪辑空间范围。

标签: c++ opengl textures glsl


【解决方案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(); 
}

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2013-10-05
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多