【发布时间】: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% 准确,但这张图片可能会让您了解我想要做什么:
有没有一种方法可以在不使用 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 剪辑空间范围。