我试图遮蔽我的模型,使得每个三角形都是基于其在缓冲区中的位置的纯色,独特颜色。我想知道这是否是一种正确的方法。
如果您不需要有关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结束是包容性的,我假设我上面显示的方法将准确地工作,但如果它是独占的,我认为我可能必须除以256.0f
而不是255.0f
。哪一个是正确的?
替换示例:
r = (gl_PrimitiveID % 255) / 256.0f; // notice 256.0f instead of 255.0f
答案 0 :(得分:1)
我建议另外一种可能更简单的方法。你写道:
OpenGL具有RGB值,使得它们在0.0f和0之间浮动 1.0f(我不知道1.0f是否包容,是我问题的一部分。)
事实并非如此。 OpenGL支持各种不同的格式,浮点,规范化整数和非标准化整数。对于您的使用案例,我建议您使用GL_R32UI
格式,以便直接将gl_PrimitiveID
分配给着色器的输出变量。
答案 1 :(得分:0)
我决定将我对base 256的使用情况与基数10的情况进行比较:
[n / (10^digit_place)] % 10
此公式将在digit_place的位置给出数字0到9(仅限整数)。
例如,如果您想获得n = 1729
的最正确的数字(一个地方),请执行以下操作:
<强>步骤:强>
[1729 / (10^0)] % 10
[1729 / (1)] % 10
1729 % 10
ans = 9
使这个公式更抽象:
radix 是基数的奇特术语。示例:在正常数字(0 - 9;基数10)中,基数为10
[n / (radix ^ place)] % radix
我的问题的应用程序:
在做了一些额外的研究之后,OpenGL中的rgb值从0.0f
到1.0f
包含。这意味着rgb
(1.0f, 1.0f, 1.0f)
为白色,rgb
(0.0f, 0.0f, 0.0f)
为黑色。
以字节形式(0 - 255;基数/基数256),白色和黑色的rgb
值如下(按顺序),(255, 255, 255)
和(0, 0, 0)
。将这些值转换为0.0f
和1.0f
之间的数字(再次按顺序)(255/255.0f, 255/255.0f, 255/255.0f)
,(0/255.0f, 0/255.0f, 0/255.0f)
。
与我的初始着色器相比:
r = (gl_PrimitiveID % 255) / 255.0f;
此示例中的r
只能介于(包含)0/255.0f
和254/255.0f
之间。我们想要的是在(包括)0/255.0f
和255/255.0f
之间,如上所示。
如果我们查看r
的计算并将其与公式进行比较,我们就会看到为什么会得到一系列我们不想要的数字。问题源于这一部分:(gl_PrimitiveID % 255)
。由于模数的工作方式,n
(n
&gt; 1)的模数只能在0
和n-1
之间给出整数。在这种情况下或n
是255
,它会向我们提供0
到254
的问题范围。要解决此问题,我们只需将255
替换为256
(这是我们正在使用的基数/基数),这使得此计算有效。
固定着色器:
#version 420 core
out vec3 color
void main(){
float r, g, b;
// notice the 256's instead of 255
r = (gl_PrimitiveID % 256) / 255.0f;
g = ((gl_PrimitiveID / 256) % 256) / 255.0f;
b = ((gl_PrimitiveID / (256 * 256)) % 256) / 255.0f;
color = vec3(r, g, b);
}