8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如 #1227 描述, 现在引擎 shader 中采样的纹理有很多 gammaToLinear 的操作,如果支持硬件级别的 sRGB 纹理格式,有以下优点:
gammaToLinear
pow
pow(2.2)
一般跟视觉相关的纹理都需要 sRGB 格式,用户可以选中纹理,自己切换为 sRGB 格式,以下引擎内置的纹理也需要改为 sRGB:
camera_OpaqueTexture
params.isSRGBColorSpace
isSRGBColorSpace
sRGB
sRGB 开关
R8G8B8
R8G8B8A8
R16G16B16A16
Alpha8
sRGB 在 WebGL2.0 中默认支持,在 WebGL1.0 中可以通过 EXT_sRGB 插件支持。在生成纹理时,ext.SRGB_EXT对标 gl2.SRGB8;ext.SRGB_ALPHA_EXT对标gl2.SRGB8_ALPHA8;在生成 MSAA 时,使用gl2.SRGB8_ALPHA8。
ext.SRGB_EXT
gl2.SRGB8
ext.SRGB_ALPHA_EXT
gl2.SRGB8_ALPHA8
当存在 webgl1.0 插件都不支持的机型 时,是否还需要兼容这块逻辑写 toLinear 的shader 代码?
GAMMAALBEDO
texture.gammaSpace
由于 webgl1.0 可能仍无法舍弃, 在 shader 代码里面写一大坨 #if 又非常恶心,建议增加 CPU 处理的方法,当识别到不支持 sRGB 时再走这块逻辑,虽然开销很大,但是踩中几率非常小只有不到1%,且以后方便删除。
只有 WebGL2.0 的 SRGB8_ALPHA8格式才支持自动生成 Mipmap,否则会报错,这个是 WebGL 底层的缺陷,无法绕过去。
SRGB8_ALPHA8
我们可以判断当前纹理 sRGB 组合是否支持 mipmap,如果不支持的话,关闭 mipmap 开关;在未来,我们还可以在编辑器支持手动生成 mipmap 的能力。
mipmap 报错:
three 检查格式:
其他格式忽略 sRGB:
Babylon gammaSpace 和 sRGB 配合
The text was updated successfully, but these errors were encountered:
srgb8_alpha8_ext
Sorry, something went wrong.
是的,编辑器需要重点考虑一下体验提升,现在 sRGB会影响到 Sprite、UI、Spine、Lottie 8000 、Material 等所有用到纹理的元素,影响有点大
是的,编辑器需要重点考虑一下体验提升,现在 sRGB会影响到 Sprite、UI、Spine、Lottie、Material 等所有用到纹理的元素,影响有点大
解决方案是否可以默认开启 sRGB。 我看 Unity 拖拽进去的图片,都默认开启 sRGB,的确满足了大部分场景,只有法线、粗糙金属等纹理才需要手动关闭 sRGB 开关,并且 Unity 的法线部分还有个提示:
zhuxudong
Successfully merging a pull request may close this issue.
背景和价值
如 #1227 描述, 现在引擎 shader 中采样的纹理有很多
gammaToLinear
的操作,如果支持硬件级别的 sRGB 纹理格式,有以下优点:pow
等计算指令次数。pow(2.2)
更准确,保证美术资源色彩一致性。gammaToLinear
那一坨代码了。(待定,可能仍需要考虑 webgl 1.0)关键问题和解决方案
1. 哪些纹理需要 sRGB 格式
一般跟视觉相关的纹理都需要 sRGB 格式,用户可以选中纹理,自己切换为 sRGB 格式,以下引擎内置的纹理也需要改为 sRGB:
camera_OpaqueTexture
)。2. Loader 新增 sRGB
params.isSRGBColorSpace
,默认 falseparams.isSRGBColorSpace
,默认 falseisSRGBColorSpace
为 nextUint83. 开关设计
sRGB
开关。sRGB 开关
。R8G8B8
和R8G8B8A8
格式生效,当纹理格式为R16G16B16A16
,Alpha8
等非 sRGB 格式时,和调研结果一致,都以纹理格式为准,忽略 sRGB 开关。4. 兼容性问题
sRGB 在 WebGL2.0 中默认支持,在 WebGL1.0 中可以通过 EXT_sRGB 插件支持。在生成纹理时,
ext.SRGB_EXT
对标gl2.SRGB8
;ext.SRGB_ALPHA_EXT
对标gl2.SRGB8_ALPHA8
;在生成 MSAA 时,使用gl2.SRGB8_ALPHA8
。当存在 webgl1.0 插件都不支持的机型 时,是否还需要兼容这块逻辑写 toLinear 的shader 代码?
GAMMAALBEDO
等宏开关,配合texture.gammaSpace
来决定是否需要 toLinear;当开启 sRGB 后,会关闭GAMMAALBEDO
等宏开关,不考虑 sRGB 都不支持的设备由于 webgl1.0 可能仍无法舍弃, 在 shader 代码里面写一大坨 #if 又非常恶心,建议增加 CPU 处理的方法,当识别到不支持 sRGB 时再走这块逻辑,虽然开销很大,但是踩中几率非常小只有不到1%,且以后方便删除。
5. Mipmap 支持问题
只有 WebGL2.0 的
SRGB8_ALPHA8
格式才支持自动生成 Mipmap,否则会报错,这个是 WebGL 底层的缺陷,无法绕过去。我们可以判断当前纹理 sRGB 组合是否支持 mipmap,如果不支持的话,关闭 mipmap 开关;在未来,我们还可以在编辑器支持手动生成 mipmap 的能力。
6. 压缩纹理
WEBGL_compressed_texture_s3tc_srgb
附录
mipmap 报错:


three 检查格式:


其他格式忽略 sRGB:



Babylon gammaSpace 和 sRGB 配合
The text was updated successfully, but these errors were encountered: