opengl - 每个三角形的独特颜色

时间:2015-03-07 02:53:44

标签: c++ opengl glsl

我试图遮蔽我的模型,使得每个三角形都是基于其在缓冲区中的位置的纯色,独特颜色。我想知道这是否是一种正确的方法。

如果您不需要有关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

2 个答案:

答案 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的最正确的数字(一个地方),请执行以下操作:

<强>步骤:

  1. [1729 / (10^0)] % 10
  2. [1729 / (1)] % 10
  3. 1729 % 10
  4. ans = 9
  5. 使这个公式更抽象:

    radix 是基数的奇特术语。示例:在正常数字(0 - 9;基数10)中,基数为10

    [n / (radix ^ place)] % radix
    

    我的问题的应用程序:

    在做了一些额外的研究之后,OpenGL中的rgb值从0.0f1.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.0f1.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.0f254/255.0f之间。我们想要的是在(包括)0/255.0f255/255.0f之间,如上所示。

    如果我们查看r的计算并将其与公式进行比较,我们就会看到为什么会得到一系列我们不想要的数字。问题源于这一部分:(gl_PrimitiveID % 255)。由于模数的工作方式,nn&gt; 1)的模数只能在0n-1之间给出整数。在这种情况下或n255,它会向我们提供0254的问题范围。要解决此问题,我们只需将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);
    }