【发布时间】:2018-02-15 23:52:29
【问题描述】:
我使用完全相同的 C++ 代码渲染相同的场景,一次渲染到 Windows 上的原生 OpenGL,一次使用 Emscripten 渲染到 WebGL。场景中的一切看起来都完全相同,除非我使用 alpha != 1.0 渲染某些东西。区别如下所示:
蓝色立方体颜色是(0.0, 0.0, 1.0, 0.5)
用于渲染立方体的着色器除了绘制颜色之外什么都不做。
右边是它在 OpenGL 中的样子,是预期的结果,只是蓝色,半透明。左边是 Emscripten+WebGL 的样子。看起来渲染的颜色实际上是(0.5, 0.5, 1.0, 0.5)
我使用的blend函数是标准的:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
WebGL 中的 alpha 有什么不同吗?什么可能导致这种情况发生?
【问题讨论】:
-
...关闭为题外话?请解释
-
它是否可能是预乘与非预乘的 alpha 问题?
-
@WacławJasper 我想过,但我真的不明白如何......预乘 alpha 会使其更暗,而不是更亮,不是吗?
-
@shoosh:这可能是 webgl 帧缓冲区中 alpha 通道的问题。在桌面 GL 中,帧缓冲区本身中的 alpha 值无效,除非您将它们读回或使用取决于目标 alpha 的混合函数,但在 webgl 中,它们实际上可能将画布与背景混合。尝试
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE)(并将 alpha 清除为 1)
标签: c++ opengl webgl emscripten