graphics - 光线追踪中正确的着色模型

标签 graphics shader raytracing

我想知道计算几种不同光源和环境光生成的阴影的最准确方法。 环境光是存在于整个“世界”中的具有相同强度且没有特定方向的光,而漫射光是由于点光源的直接照明而产生的照明。

假设Ka是表面环境反射率的系数,Ia是环境光的强度,Kd是表面漫反射反射率,Ip1 是第一个(相应的)点光源的强度,N 是表面法线,L1 是(相应的第一个来源)方向。

根据我的引用资料,该点的颜色强度应该是:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2)) 其中“.”是点积。

但根据我的理解,真实的光强度应该在光源之间进行某种平均,而不仅仅是将它们相加,因此,如果只有两个光源,则方程应如下所示:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/2

如果有 3 个光源,但第三个光源被遮挡并且不会直接照亮表面:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/3 (这样,如果某个地方所有 3 盏灯都起作用,它就会变得更亮。

我的假设正确吗?

最佳答案

嗯,不,光线不应该被平均。想一想。如果只有一个强大的光源,然后添加另一种非常微弱的光源,物体的颜色会减弱吗?例如,假设强光的强度为 10,则颜色(为简单起见,假设方向垂直于法线,并且没有环境光)将为 10。然后在添加第二个微弱的光(强度为 0.1)后,颜色将为 (10 + 0.1)/2,即 5.05。因此,添加更多的光会使物体看起来更暗。这没有道理。

关于graphics - 光线追踪中正确的着色模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4586031/

相关文章:

c++ - GD 图片库 : Range of colour component arguments for TrueColor images

java - java中还有另一种方法来执行repaint()吗?

java - 一个对象中的图形正在影响另一个对象的图形 - JAVA

c++ - 读取dll文件中的文本文件

c++ - 顶点着色器的支持有多广泛?

C++使用指向父类(super class)的指针查找子类的类型

java - 射线球相交法不起作用

math - 两条线段相交或重叠

c++ - 渲染中的区域采样与 BRDF 采样

opengl - 在 OpenGL 中,一个着色器程序是否可以在一次绘制调用中同时渲染到 FBO 和默认帧缓冲区?