Opengl 用顶点属性替换颜色

Opengl 用顶点属性替换颜色,opengl,Opengl,我有一大组顶点,目前使用glColorPointer指定它们的颜色。问题是,glColorPointer只接受3或4的大小作为其第一个参数,但每个顶点的R、G和B的值是相同的 当然,我可以使用glvertexattributepointer将每个颜色值指定为大小为1的属性,并在着色器中复制它,但我正在寻找一种在固定函数管道中实现这一点的方法。 不幸的是,鉴于顶点的数量,调用glColor1*是不可能的(是的,我尝试过) 任何将值压缩成其他内容的创造性解决方案也可以。您可以将颜色信息存储在1D纹理

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

当然,我可以使用
glvertexattributepointer
将每个颜色值指定为大小为1的属性,并在着色器中复制它,但我正在寻找一种在固定函数管道中实现这一点的方法。 不幸的是,鉴于顶点的数量,调用
glColor1*
是不可能的(是的,我尝试过)


任何将值压缩成其他内容的创造性解决方案也可以。

您可以将颜色信息存储在1D纹理中(仅使用一个通道),然后您可以使用顶点着色器,根据
gl\u vertexID

读取正确的颜色,我认为如果没有着色器,这是不可能的,因为,
glColorPointer
只接受3或4的大小,就像您已经发现的那样(也应该没有
glColor1
,只有
glColor3
glColor4

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

因此,没有着色器,您就没有多少创造力了。您可以使用大小为256的1D纹理,该纹理包含从(0,0,0)到(255,255,255)的所有灰色。然后,您可以使用逐顶点颜色作为该纹理的1D纹理坐标。但我不确定这是否真的能为你在空间或时间上买到任何东西


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

对不起,没有着色器。如问题所述。我知道限制是愚蠢的。别问了,谢谢你的建议。最后,我刚刚在那里破解了一个
constchar*
着色器,并在每个顶点上使用了一个float属性,并将其映射到一个颜色中。首先,人为地限制自己是错误的。@pmr因为您明确表示知道如何使用着色器,但不想这样做,所以我没有详细说明这个主题。这可能只是因为这种限制不是人为的,而是真实的(旧硬件或其他)。由于问题明确要求使用无着色器解决方案,因此答案也可以在不进行编辑的情况下被接受,但感谢您接受。不管怎样,编辑反映了我的想法。我在追求使程序“简单”的过程中弥补了这个限制。这种假设一开始是错误的,因此我最终称这种约束为人为的。真正的答案是认识到这一点,你的帖子帮助我看到了这一点。因此,这是应该接受的答案。这里是meta sunday。@pmr无论限制是虚构的还是真实的,都是限制答案的限制。因此,关于这一限制的问题是完全正确的。一个只说“使用着色器,伙计”(当然没有回答无着色器的问题)的答案反过来是无效的。无论你是否意识到问题是错的,答案仍然需要符合问题。如果您没有明确提到需要无着色器解决方案,情况会有所不同。