在我的游戏引擎中,我经常在绘制纹理和非纹理形状之间进行切换。我想知道,做出这种区分的最有效方法是什么?例如,假设我们有两个方法DrawRectangle(Color color)
和DrawRectangleTextured(int textureId)
,我们无法控制它们的调用顺序。
我想到了三种可能的解决方法:
1)有两个不同的着色器程序,一个采用纹理,另一个不采用纹理。然后在绘制之前选择适当的着色器。这在效率方面似乎是一个很好的解决方案,但我不确定一直交换程序的开销。此外,必须始终跟踪两个程序,使其难以维护和扩展,这很麻烦。
2)制作完全白色的纹理,并将非纹理图纸视为具有白色纹理的纹理图纸。这意味着无论何时我们使用颜色绘制,我们都必须上传冗余纹理坐标,片段着色器必须做一些额外的工作。
3)使用统一值指定是否使用纹理绘制。不确定这是否比选项2)有任何优势。
有没有一种通用而有效的方法来解决这个问题?