2011-12-01 216 views
2

我有一大组顶点,目前使用glColorPointer指定它们的颜色。问题是,glColorPointer只接受3或4的大小作为其第一个参数,但每个顶点的R,G和B的值是相同的。用顶点属性代替颜色

当然,我可以使用glVertexAttribPointer指定每个颜色值作为大小为1的属性,并在着色器中复制它,但我正在寻找一种方法在固定功能管道中执行此操作。 调用glColor1*是不幸的问题给定的顶点的数量(是的,我试过了)。

任何将价值挤入其他东西的创造性解决方案也是可以的。

回答

3

我想如果没有着色器,这将是不可能的,因为,很好,glColorPointer只接受大小为3或4,像你已经发现了(也应该有不glColor1,只有glColor3glColor4)。

您可以通过指定大小3而不是1(ubyte)或4(float)的步幅来欺骗glColorPointer以使用紧密排列的数组。但是,这会给你一个(Ri, Ri+1, Ri+2)的顶点i的颜色,并且无法将其调整为(Ri, Ri, Ri),因为颜色矩阵并不适用于每个顶点的颜色,而只适用于像素图像。

所以没有着色器,你没有太多的创造力了。你可以做的是使用尺寸为256的一维纹理,其中包含从(0,0,0)到(255,255,255)的所有灰色依次。然后,您可以将每个顶点颜色作为1D纹理坐标使用到该纹理中。但我不确定这是否真的会在空间或时间上为您购买任何东西。

简单而直接的方法是使用顶点属性和着色器来实现将属性解包为片段颜色。这只需要几行着色器代码,应该是首选解决方案。这里真正的困难是人为限制,而不是问题空间本身。这种情况应该通过解除限制来解决。

+1

感谢您的建议。最后,我只是在那里砍了一个const char *着色器,然后用每个顶点的一个float属性去映射成一个颜色。人为地限制自己首先是错误的。 – pmr

+0

@pmr既然你明确地说过你知道如何用着色器做,但不想,我没有详细说明这个话题。它可能只是这个限制不是人为的,而是真实的(旧硬件或其他)。由于该问题明确要求提供无着色解决方案,因此也可以在未经编辑的情况下接受答案,但无论如何都要接受。无论如何编辑反映了我的想法。 –

+0

为了让程序变得“简单”,我制定了这个约束条件。这个假设是错误的,因此我最终称人为约束。真正的答案是实现这一点,你的文章帮助我看到了这一点。因此,这是应该被接受的答案。这是荟萃星期天在这里。 – pmr

0

您可以将颜色信息存储在1D纹理中(只有一个通道),然后您可以使用基于gl_vertexID读取适当颜色的顶点着色器。

+0

对不起,没有着色器。正如问题中提到的那样。我知道限制是愚蠢的。不要问。 – pmr