用顶点属性替换颜色

时间:2011-12-01 13:43:39

标签: opengl

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

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

将价值压缩到其他东西的任何创造性解决方案都可以。

2 个答案:

答案 0 :(得分:3)

我认为没有着色器,这是不可能的,因为glColorPointer只接受3或4的大小,就像你已经发现的那样(也应该没有glColor1,只有{ {1}}和glColor3)。

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

所以没有着色器,你就没有太多的创造力了。你可以做的是使用大小为256的1D纹理,它按顺序包含从(0,0,0)到(255,255,255)的所有灰色。然后,您可以将每顶点颜色用作该纹理中的一维纹理坐标。但我不确定这是否真的会在空间或时间上给你带来任何东西。

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

答案 1 :(得分:0)

您可以将颜色信息存储在一维纹理中(只有一个通道),然后您可以使用顶点着色器根据gl_vertexID读取正确的颜色。