OpenGL-在带纹理或不带纹理的图形之间交替

OpenGL-在带纹理或不带纹理的图形之间交替,opengl,textures,shader,Opengl,Textures,Shader,在我的游戏引擎中,我经常在绘制纹理和非纹理形状之间切换。我想知道,做这种区分最有效的方法是什么?例如,假设我们有两个方法,DrawRectangle(Color)和DrawRectangleTextured(int-textureId),我们无法控制调用它们的顺序 我想到了三种可能的处理方法: 1) 有两个不同的着色器程序,一个采用纹理,另一个不采用纹理。然后在绘制之前选择适当的着色器。就效率而言,这似乎是一个很好的解决方案,但我不确定始终交换程序的开销。此外,必须始终跟踪两个程序很麻烦,这使得

在我的游戏引擎中,我经常在绘制纹理和非纹理形状之间切换。我想知道,做这种区分最有效的方法是什么?例如,假设我们有两个方法,
DrawRectangle(Color)
DrawRectangleTextured(int-textureId)
,我们无法控制调用它们的顺序

我想到了三种可能的处理方法:

1) 有两个不同的着色器程序,一个采用纹理,另一个不采用纹理。然后在绘制之前选择适当的着色器。就效率而言,这似乎是一个很好的解决方案,但我不确定始终交换程序的开销。此外,必须始终跟踪两个程序很麻烦,这使得维护和扩展很困难

2) 制作一个完全白色的纹理,并将非纹理图形视为具有该白色纹理的纹理图形。这意味着每当我们使用颜色绘制时,我们必须上传冗余的纹理坐标,片段着色器必须做一些额外的工作

3) 使用统一值指定是否使用纹理绘制。不确定这是否比选项2)有任何优势


是否有一种通用且有效的方法来处理此问题?

在这种情况下,状态排序是关键。首先根据着色器进行排序。这意味着您永远不会交错纹理和未纹理的基本体。接下来,确定有多少纹理对象共享同一纹理,并根据该纹理进行排序。这样,一次只绑定一个纹理。基本上就是这样。但是要小心-如果对着色器和对象进行排序的开销高于暴力方法,那么这样做就没有多大意义。感谢您的回答:)如前所述,我正在构建一个游戏引擎,我希望允许用户创建自定义着色器。我不确定这些着色器将如何工作,但有理由相信排序将很困难。您认为使用白色纹理并仅使用一个纹理着色器有意义吗?基本上,上传这些纹理坐标会有很大的开销吗?不管着色器是由您提供还是由用户提供。您仍然可以确定要使用哪些着色器渲染哪些对象-因此您可以始终以某种方式按着色器排序。如果着色器中没有任何其他逻辑,除了“从sampler2D xy在此UV坐标处采样并将值指定为片段颜色”,则可以使用该单个着色器和绑定到采样器的各种2D纹理对提供UV坐标的任何对象进行纹理化。只要需要更复杂的逻辑,就需要更多的着色器。