将位置写入纹理 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% 准确,这张图片可能会让您了解我想要做什么:
有没有办法在不使用 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();
}
我想将 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% 准确,这张图片可能会让您了解我想要做什么:
有没有办法在不使用 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();
}