我试图对模型进行阴影处理,以使每个三角形根据其在缓冲区中的位置都是唯一的纯色。我想知道这是否是适当的方法。
如果您不需要有关OpenGL的信息,则可以浏览到最后一段
这是我的片段着色器,它将基于缓冲区中三角形的索引进行着色。
#version 420 core
out vec3 color
void main(){
float r, g, b;
r = (gl_PrimitiveID % 255) / 255.0f;
g = ((gl_PrimitiveID / 255) % 255) / 255.0f;
b = ((gl_PrimitiveID / (255 * 255)) % 255) / 255.0f;
color = vec3(r, g, b);
}
它使用
gl_PrimitiveID
实质上给出了其阴影的三角形缓冲区中的位置。因此,如果我执行命令绘制缓冲区并说缓冲区中有三角形,则gl_PrimitiveID
会说第一个三角形是0
,然后第二个三角形是1
,第n个三角形是n-1
。OpenGL具有其RGB值,因此它们在0.0f和1.0f之间浮动(我不知道1.0f是否包含在内,这是我的问题的一部分)。
如果包含1.0f end,则我认为上面显示的方法可以正确运行,但是如果包含exf,我认为我可能必须除以
256.0f
而不是255.0f
。哪一个合适?替换示例:
r = (gl_PrimitiveID % 255) / 256.0f; // notice 256.0f instead of 255.0f
最佳答案
我建议另一种选择可能会更简单。你写了:
OpenGL具有其RGB值,使得它们在0.0f和
1.0f(我不知道1.0f是否包含在内并且是我的问题的一部分)。
那是不对的。 OpenGL支持各种不同的格式,浮点数,归一化整数和非归一化整数。对于您的用例,我只建议使用格式GL_R32UI
,以便您可以直接将gl_PrimitiveID
分配给着色器的输出变量。