我正在学习GLES。有许多配对函数,例如glClientActiveTexture
/ glActiveTexture
。
他们之间有什么区别? (特别是glClientActiveTexture
)
答案 0 :(得分:4)
来自openGL documentation:
一方面,glClientActiveTexture用于控制后续的glTexCoordPointer调用(使用顶点数组)。另一方面,glActiveTexture会影响对glTexCoord调用的后续调用(由显示列表或立即模式使用(在OpenGL ES(AFAIK)中不存在)。
答案 1 :(得分:1)
添加Kenji的答案,这里有更多细节(请记住,并非所有OpenGL都可用于ES)。
但首先是一些快速的术语,试图防止所有纹理事物之间的混淆(出于同样的原因而过度简化)。
GL_TEXTURE_2D
)。它通过glActiveTexture
glBindTexture
设置的。glGenTextures
获得一个新的名称/ ID,它实际上是通过(第一次调用)glBindTexture
及其名称实例化的。摘要:纹理单元具有绑定到纹理的纹理目标。
为了使2D纹理具有多重纹理(例如),其中必须同时绑定多个2D纹理以进行绘制,您使用不同的纹理单元 - 将一个纹理绑定在一个单元的2D目标上,以及在另一个单位的2D目标上绑定下一个。 glActiveTexture
用于指定后续调用glBindTexture
将应用于哪个纹理单元,glBindTexture
用于指定哪个纹理绑定到活动纹理单元上的哪个目标。
由于你有多个纹理,你可能还有多个texcoords。因此,您需要某种方式与OpenGL / GLSL进行通信,一组texcoords用于一个纹理/单元,另一组texcoords用于另一个。通常你可以通过在顶点和相应的着色器中使用多个texcoord属性来完成此操作。如果你正在使用依赖于着色器中预定义顶点属性的旧渲染技术,那么你必须做一些不同的事情,这就是glClientActiveTexture
所在的地方。混乱发生是因为它需要一个参数一个纹理单元,但它与激活状态机中纹理单元的glActiveTexture
没有相同的含义,而是指定哪个预定义的gl_MultiTexCoord
属性(在着色器中)将获取texcoords在随后的glTexCoordPointer
调用中描述。
简而言之,glActiveTexture
用于纹理更改,glClientActiveTexture
用于texcoord更改。您使用哪些API调用取决于您使用的渲染技术:
glActiveTexture
设置受后续上下文状态调用影响的纹理单元,例如glBindTexture
。它不会影响glMultiTexCoord
,glTexCoord
或glTexCoordPointer
,因为这些与texcoords有关,而不是纹理。glClientActiveTexture
设置后续顶点数组状态调用应用于哪个纹理单元,例如glTexCoordPointer
。它不会影响glBindTexture
,因为这与纹理有关,而与纹理有关。
glMultiTexCoord
,也不会影响glTexCoord
,它会定位纹理单元0({ {1}})。这几乎只留下GL_TEXTURE0
作为它影响的内容,并且glTexCoordPointer
已弃用,而不是glTexCoordPointer
,这不需要glVertexAttribPointer
。正如您所看到的,glClientActiveTexture
并不是最有用的,因此不推荐使用相关的glWhateverPointer调用。glClientActiveTexture
+ glActiveTexture
与所有技术结合使用,以绑定特定纹理单元上的每个纹理。当您在没有glBindTexture
的情况下使用DrawArrays / DrawElements时,您还会使用glClientActiveTexture
+ glTexCoordPointer
。随着OpenGL多年来的发展,有很多方法可以实现多纹理绘制。以下是一些最常见的内容:
glVertexAttribPointer
/ glBegin
对),并使用glEnd
调用来指定texcoords。glMultiTexCoord
和glBindVertexArray
+ glBindBuffer
/ glDrawArrays
指定顶点数据,并调用glDrawElements
,glVertexPointer
,{{1在绘图例程期间指定顶点属性。glNormalPointer
+ glTexCoordPointer
/ glBindVertexArray
指定顶点数据,调用glDrawArrays
以在init例程中指定顶点属性。以下是使用这些技术中的两个2D纹理进行多纹理的API流程的一些示例(为简洁而修剪):
使用即时模式:
使用DrawElements但不使用VertexAttribPointer:
使用DrawElements和VertexAttribPointer:
glDrawElements
将未使用的坐标填充为0,0,0,1。
例如glVertexAttribPointer
== s,t,0,1 glMultiTexCoord
+ i ,而不只是 i 。glMultiTexCoord2f
+ i 时,我必须在0 - GL_TEXTURE0
- 1之内。GL_TEXTURE0
依赖于实现,但必须至少为2,并且至少是OpenGL 4.0中的80。GL_MAX_TEXTURE_COORDS
GL_MAX_TEXTURE_COORDS
之间致电glMultiTexCoord
或glActiveTexture
。而是在绘制调用之前将所有需要的纹理绑定到所有需要的纹理单元。