知识点!!Cocos3D 标准材质shader的计算是错的,应该这样改

先讲结论:

vec3 diffuseContrib = diffuse / PI;

改为

#if CORRECT_LIGHTS
vec3 diffuseContrib = diffuse / PI;
else
vec3 diffuseContrib = diffuse
#endif

使用IBL时勾CORRECT_LIGHTS,使用方向光和点光源时再取消勾选CORRECT_LIGHTS。

下面解释原因:
Cocos3D的标准材质用的是PBR,在使用IBL的时候,他计算是正确的,但是使用普通方向光时,他的表现其实是错误的,具体现象是颜色表现上会偏黑。

而这问题的本质是因为使用非精准光源(IBL)时,diffuse需要除以PI,因为光源在计算的时候做了积分需要除以PI来配平保持能量守恒,而使用精准光源(平行光和点光源)时,diffuse是不需要除以PI的,因为不存在积分不需要配平 。

另外我建了一个3D交流群475557897,专门来解决cocos的这些奇葩问题,欢迎志同道合的小伙伴加入

5赞

我就说我就怎么觉得模型导入进来游戏后颜色一直偏黑。居然是这样子!!!

引擎里的实现没问题,楼主的理解已经很接近了,但还是错了。因为对于平行光或点光源,虽然看上去没有积分的过程,其实是因为模型简化(本质上相当于在积分内引入了 dirac delta term),直接求积分的解析解了。所以无论对于程序光照还是 IBL,除以 PI 是不能省掉的。

模型偏黑可以调整光强和环境色,不能随便改渲染方程噢

那我就用积分来解释吧


大兄弟看一下公式

你有没看懂我的推导?你自以为我不知道这个pi的存在?

手写的看不太清~

你的思路的问题是没有考虑实际的光源模型,你的推理算的其实是 white furnance 模型,目标着色点受全方向均一的光照影响,而对于我们考虑的平行光或点光源,是有一个 dirac delta function 的,应该是这样:

$$
\begin{align}

L_i &= \delta(atten(X_i, X_o))) \tag{1}\

L_o &= \int_\Omega k_d\frac{c}{\pi}L_i\cos\theta d\omega \tag{2} \

&= k_d\frac{c}{\pi} \int_\Omega \delta(atten(X_i, X_o)))\cos\theta d\omega \

&= k_d\frac{c}{\pi} atten(X_i, X_o)\cos\theta \tag{3}

\end{align}
$$

cocos目前在shader中使用的光源模型用我上面写的atten(L)就可以概括了,你觉得哪里能体现出你说的dirac delta function

vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;

就这么一段代码

dirac delta function 在这里只是模型简化的公式体现,它是个概念函数,只对推导过程有影响,到 shader 里就已经是最终的计算流程了呀,就是上面的公式(3)了。

公式显示不出来的问题论坛维护同学在看,现在不方便的话可以先复制代码到输入窗口,这里可以正常预览

感谢官方大佬解答,cocos是正确的,大家在使用的时候将光照亮度提高一点就可以了,另外关于是否要除以PI的讨论也可以看下这篇文章

https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/

…一开始还真以为你对了,,,,,要虚心呀,,

你的思路的问题是没有考虑实际的光源模型,你的推理算的其实是 white furnance 模型,目标着色点受全方向均一的光照影响,而对于我们考虑的平行光或点光源,是有一个 dirac delta function 的,应该是这样:

\begin{align} L_i &= \delta(atten(X_i, X_o))) \tag{1}\\ L_o &= \int_\Omega k_d\frac{c}{\pi}L_i\cos\theta d\omega \tag{2} \\ &= k_d\frac{c}{\pi} \int_\Omega \delta(atten(X_i, X_o)))\cos\theta d\omega \\ &= k_d\frac{c}{\pi} atten(X_i, X_o)\cos\theta \tag{3} \end{align}

我没法修改我的帖子了,感谢论坛同学更新插件支持,公式看上面这里就好

你拿blinnphong,和官方的standard材质对比,你会发现官方的就是偏暗的,原因是官方全部除以了pi,从美术角度,我是不能接受的,但是你说从物理计算角度,那它的确没啥问题,只是材质换成standard时需要调高光照强度,看你自己怎么取舍?这个问题其他人也有在讨论,你可以看我发的链接

该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。