【问题标题】:How should I manage glActiveTexture with regard to initializing textures?关于初始化纹理,我应该如何管理 glActiveTexture?
【发布时间】:2012-04-28 16:32:20
【问题描述】:

我正在使用 WebGL (≈ OpenGL ES 2.0)。目前,我的应用程序使用纹理单元 0 作为每个模型的纹理,并将 1 和 2 作为着色器使用的常量纹理。

为了加载和设置纹理,我这样做了

var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(...);
gl.texParameteri(...);

但是,这会影响纹理绑定到当前纹理单元的状态。为了避免这个程序,我添加了

gl.activeTexture(gl.TEXTURE0);

到上述代码的开头,这样它只会影响纹理单元 0 的绑定,无论如何在绘制任何几何图形之前都会重置它。

有没有更好的方法,即不涉及碰巧有可用的“临时”纹理单元?是否有针对此状态管理问题的既定最佳实践?

【问题讨论】:

    标签: opengl-es-2.0 webgl


    【解决方案1】:

    对我来说,这个问题与其他几个问题属于同一类别:您可以假设程序中某些点的 GL 状态是什么?

    AFAICT 你基本上有两种选择:

    1. 什么都不做,按照您需要的方式设置状态。即按照您目前的方式致电glActiveTextrure()
    2. 为 GL 在程序中的某些点应处于何种状态设置规则。例如对于您的情况,完成后让绘图部分调用glActiveTexture(gl.TEXTURE0),因此预绘图部分可以假设它是这样设置的。

    但真的,不要想太多。在 OpenGL 中,您可以通过最大化(在某些实际限制内)多边形与函数调用的比率来优化程序,您也可以通过传递大量多边形来执行 glDrawArrays() 调用等。

    【讨论】:

    • 谢谢,但我不是在问“活动纹理单元的策略应该是什么?” — 我已经遵循了您描述的原则 — 但是“我应该如何在对纹理单元的其他用途的干扰最小的情况下初始化纹理?”,这可能暗示了对规则的限制。
    • 您可以将其视为我所说的另一个实例。在 GL 中有很多状态可以像这样被“踩”。您可以为这项工作使用单独的纹理单元,这意味着您不必重置任何内容,但您必须调用 glActiveTextureUnit() 两次。或者你可以破坏当前的纹理单元,然后将设置纹理状态的责任传递给绘图部分。无论哪种方式,您的程序的一部分(有点)都有一些额外的工作要做。
    • 选择一种方式或另一种方式归结为效率和可维护性之间的权衡。
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2018-11-09
    相关资源
    最近更新 更多