【问题标题】:Prevent DataTexture value normalization in THREE防止三个中的 DataTexture 值规范化
【发布时间】:2015-07-06 20:23:12
【问题描述】:

在 THREE 中,您可以指定具有给定数据类型和格式的 DataTexture。我的着色器管道基于一些用户控制的制服规范化原始值。

以 Float32Array 为例,非常简单:

data = new Float32Array(...)
texture = new THREE.DataTexture(data, columns, rows, THREE.LuminanceFormat, THREE.FloatType)

而且,在着色器中,混合后的值具有非标准化值。但是,如果我使用:

data = new Uint8Array(...)
texture = new THREE.DataTexture(data, columns, rows, THREE.LuminanceFormat, THREE.UnsignedByteType);

然后纹理在 0.0 和 1.0 之间进行归一化,作为管道的输入。不是我所期待的。有没有办法防止这种行为?

这是一个示例 jsfiddle,展示了对意外情况的快速测试(至少对我而言):http://jsfiddle.net/VsWb9/3796/

three.js r.71

【问题讨论】:

  • 我相信目前这是不可能的,基于此评论的回复和假设:stackoverflow.com/questions/13041830/… 涉及类似问题,但不在 WebGL 下。在发布我自己的问题的答案之前,我需要进一步研究它。

标签: three.js


【解决方案1】:

为了将来的参考,目前这在 WebGL 中是不可能的。它需要使用 GL_RED_INTEGER 和不受支持的 usampler2d

the internalformat of Texture 的这条评论还描述了 GL 中内部格式的问题。

就此而言,GL_LUMINANCE 的格式表示您正在通过 浮点数据或归一化整数数据(类型说 它是标准化的整数数据)。当然,因为没有 GL_LUMINANCE_INTEGER (这就是你说你传递整数的方式 数据,用于整数内部格式),你不能真正使用 像这样的亮度数据。

使用 GL_RED_INTEGER 作为格式,使用 GL_R8UI 作为内部格式 如果您真的想要纹理中的 8 位无符号整数。注意 整数纹理支持需要 OpenGL 3.x 类硬件。

话虽如此,您不能将 sampler2D 与整数纹理一起使用。如果 您正在使用使用无符号整数纹理格式的纹理, 你必须使用 usampler2D。

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 2013-05-29
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多