Opengl es 什么';glClient***和gl***的区别是什么?

Opengl es 什么';glClient***和gl***的区别是什么?,opengl-es,Opengl Es,我在学英语。有许多成对函数,如glClientActiveTexture/glActiveTexture。 他们之间有什么区别?(尤其是openGL中的glClientActivityTexture): glActiveTexture glActiveTexture选择后续纹理状态调用将影响的纹理单元 glClientActiveTexture选择要由glTexCoordPointer修改的顶点数组客户端状态参数 一方面,glClientActiveTexture用于控制后续的glTexCo

我在学英语。有许多成对函数,如
glClientActiveTexture
/
glActiveTexture
。 他们之间有什么区别?(尤其是openGL中的
glClientActivityTexture

  • glActiveTexture glActiveTexture选择后续纹理状态调用将影响的纹理单元
  • glClientActiveTexture选择要由glTexCoordPointer修改的顶点数组客户端状态参数

一方面,glClientActiveTexture用于控制后续的glTexCoordPointer调用(使用顶点数组)。另一方面,glActiveTexture影响对glTexCoord调用的后续调用(由显示列表或即时模式使用(在OpenGL ES(AFAIK)中不存在))。

除了Kenji的答案之外,还有更详细的内容(请记住,在ES中并非OpenGL中的所有内容都可用)

术语 但首先,我们需要一些快速的术语来避免所有纹理的东西之间的混淆(出于同样的原因过于简化)

  • 纹理单元:一组纹理目标(例如
    GL\u Texture\u 2D
    ),通过
    glActiveTexture
  • 纹理目标:纹理的绑定点。它指定一种纹理类型(例如2D)。它通过
    glBindTexture
    设置
  • 纹理:一种包含纹理图像的texel(图像数据,例如像素)和参数(例如包裹和过滤模式)的东西。它由一个键/name/ID标识,一个新的键/name/ID可以通过
    glGenTextures
    获得,它实际上是通过(首次调用)
    glBindTexture
    及其名称实例化的
摘要:纹理单元具有绑定到纹理的纹理目标

纹理单元激活 为了使用2D纹理进行多重纹理(例如),其中必须为绘图同时绑定多个2D纹理,使用不同的纹理单元-将一个纹理绑定到一个单元的2D目标上,并将下一个纹理绑定到另一个单元的2D目标上。
glActiveTexture
用于指定后续调用
glBindTexture
将应用于哪个纹理单元,以及
glBind纹理
用于指定哪个纹理绑定到活动纹理单元上的哪个目标

由于您有多个纹理,您可能也有多个texcoord。因此,您需要某种方式与OpenGL/GLSL通信,一组texcoord用于一个纹理/单元,另一组texcoord用于另一个纹理/单元。通常,您可以通过在顶点和相应着色器中具有多个texcoord属性来实现此目的。如果如果您使用的是依赖于着色器中预定义顶点属性的旧渲染技术,那么您必须做一些不同的事情,这就是
glClientActiveTexture
的原因。之所以会产生混淆,是因为它需要一个纹理单位参数,但它与的
glActiveTexture
没有相同的含义激活状态机中的纹理单元,但它指定哪个预定义的
gl\u MultiTexCoord
属性(在着色器中)将生成后续调用
glTexCoordPointer
中描述的texcoords

简而言之,
glActiveTexture
用于纹理更改,
glClientActiveTexture
用于texcoord更改。使用哪种API调用取决于使用哪种渲染技术:

  • glActiveTexture
    设置哪些纹理单元将受到后续上下文状态调用的影响,例如
    glBindTexture
    。它不会影响
    glMultiTexCoord
    glTexCoord
    glTexCoordPointer
    ,因为这些与texcoords有关,而不是纹理
  • glclientactivatetexture
    设置纹理单元后续顶点数组状态调用应用于哪个纹理单元,例如
    glTexCoordPointer
    。它不会影响
    glBindTexture
    ,因为这与纹理有关,而与texcoords无关。
    • 它也不影响使用DSA通过其目标参数选择纹理单元的
      glMultiTexCoord
      ,也不影响以纹理单元0为目标的
      glTexCoord
      GL_TEXTURE0
      )。这几乎只剩下
      glTexCoordPointer
      作为它影响的对象,而
      glTexCoordPointer
      被弃用,取而代之的是
      glvertexattributepointer
      ,它不需要
      glClientActiveTexture
      。正如您所看到的,
      glClientActiveTexture
      不是最有用的,因此也被弃用相关的glWhateverPointer调用
  • 您将使用
    glActiveTexture
    +
    glBindTexture
    all技术将每个纹理绑定到特定的纹理单元上。当您使用不带
    glvertexattributepointer
    的DrawArray/DrawElements时,您还将使用
    glClientActiveTexture
    +
    glTexCoordPointer
多文本示例 随着OpenGL多年来的发展,有许多方法可以实现多文本绘制。以下是一些最常见的方法:

  • 对针对130版或更高版本的GLSL着色器使用即时模式(
    glBegin
    /
    glEnd
    对),并使用
    glMultiTexCoord
    调用指定texcoords
  • 使用
    glBindVertexArray
    glBindBuffer
    +
    glDrawArrays
    /
    glDrawElements
    指定顶点数据,并调用
    GLVertexPointInter
    glNormalPointer
    glTexCoordPointer
    等,在绘制例程期间指定顶点属性
  • 使用
    glBindVertexArray
    +
    glDrawArrays
    /
    glDrawElements
    指定顶点数据,并调用
    GLVertexAttributePointer
    指定顶点