我试图对模型进行阴影处理,以使每个三角形根据其在缓冲区中的位置都是唯一的纯色。我想知道这是否是适当的方法。

如果您不需要有关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分配给着色器的输出变量。

07-28 03:06
查看更多