c++ - 将位置写入纹理 OpenGL/GLSL

标签 c++ opengl textures glsl

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

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

顶点着色器代码:

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
    }

可能的解决方案(?):

我的想法是在此之前引入另一个着色器 channel 以将位置输出为 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(); 
}

关于c++ - 将位置写入纹理 OpenGL/GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30492327/

相关文章:

c++ - 如何为 Linux 捆绑应用程序?

c++ - 带有 C++ 的 Mysql 不打印所有数据

c++ - 强制 cpp_dec_float 向下舍入

c++ - 使用 GLAD 时无法命名变量 "far"和 "near"

winapi - 使用 GL_RGBA 颜色缓冲区设置 Win32 OpenGL 窗口

c++ - 使用点积调整 glRotate

C++ 将类型 A 的变量分配给扩展 A 的类型 B

opengl-es - opengl制作许多纹理的2的幂

glsl - WebGL GLSL 着色器 : accessing texture2D overrides other texture

java - 纹理部分离开屏幕 - 性能差异