我将几何图形存储在显示列表中,但我希望能够在它们上绘制具有不同“色调”的相同显示列表。例如,如果我在显示列表中有一个黑色和白色的头骨,我想设置一个红色色调并绘制一个头骨,然后设置一个蓝色色调并绘制头骨。
如果我能获得RGBA值,我确切知道如何转换它们,但我不确定在哪里可以拦截它们。目前显示列表不包含纹理,但它们可能会在将来使用,所以如果答案适用于纹理或不使用纹理,那将会很好。
答案 0 :(得分:0)
从概念上讲,显示列表只是在glCallList
时出现的一堆命令。所以无论它包含什么,它就像你直接使用这些命令一样(但可能更高性能)。因此,如果您的显示列表包含一堆几何命令,那么如何为它们着色?是的,你猜对了,在调用列表之前使用通常的glColor
命令:
glColor(...);
glCallList(...);
当您希望对象具有纹理并且仍然可以着色时,您可以使用设置纹理环境GL_MODULATE
(我猜你不使用着色器,否则整个问题都会过时,无论如何) 。如果您希望对象亮起,请将glColor
改为glMaterial
,当然。
但是如果你在显示列表中设置颜色,你就没有机会获得它并进行更改。但无论如何,我不建议你使用显示列表。如果您使用它们来存储几何图形并减少CPU-GPU副本和drawcall开销,那么为什么不使用VBOs,这正是为此做的(并且不会遭受这种不确定的实现)。