Three.js 在上传到 GPU 之前不会将您的纹理映射到另一个空间。一切都使用块在着色器中就地完成。
将输入值转换为线性:
作为一个例子,看看 Three.js 如何处理 map 属性 here。你基本上会看到这一行:
texelColor = mapTexelToLinear( texelColor );
而mapTexelToLinear基本上是在WebGLProgram.js file中创建的。
你明白了。
总而言之,您基本上可以在着色器顶部包含this chunk:
#include <encodings_pars_fragment>
然后你需要根据你的纹理所在的空间来解码你的纹素。例如,如果你使用 sRGB 纹理:
vec4 color = sRGBToLinear(texel);
输出伽马校正值:
您还需要在着色器顶部包含encodings_pars_fragment:
#include <encodings_pars_fragment>
然后您需要包含自动修改碎片颜色的块。看看this line。
通过在自定义着色器末尾包含块 encodings_fragment,它将根据您在 THREE.WebGLRenderer 上使用的参数自动映射您的片段。
要了解这项工作的原因,您可以查看encodings chunk,其中仅包含:
gl_FragColor = linearToOutputTexel( gl_FragColor );
然后您可以查看WebGLProgram.js file 以了解linearToOutputText 函数的工作原理。这与纹素解码的工作方式基本相同。
希望这有用!