我想将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%准确,但这张图片可能会让您知道我想要做什么:
有没有办法在不使用GPU上的全屏四边形的情况下将位置编码到纹理?
如果您想查看更多代码,请与我们联系。
答案 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();
}