我正在玩一个生成阴影球体的简单代码。我还没有完全理解数学,但是当我使用代码时,我正在弄清楚它。我想知道如何基于此代码实现镜面着色。有什么建议吗?
for (y=0;y<screenHeight;y++)
for (x=0;x<screenWidth;x++)
if (sqr((x-xcenter)*(x-xcenter)+(y-ycenter)*(y-ycenter))<radius)
{
vx=(x-xcenter);
vy=(y-xcenter);
vz=sqr(radius*radius-vx*vx-vy*vy);
vl=sqr(vx*vx+vy*vy+vz*vz);
co_angle=(lx*vx+ly*vy+lz*vz)/(ll*vl);
pixel=co_angle*255;
}
我正在看这个帖子,第二张图片就是我所追求的。但我也不完全理解那里的数学:Trouble with Phong Shading
提前致谢。
答案 0 :(得分:0)
要首先添加反射,您需要通过曲面法线
的镜像光矢量l
- (黄色)光源n
- (aqua)表面正常r
- (绿色)反射光线方向e
- (橙色)到眼睛/相机方向p
- (红色) - 渲染像素位置q
- (洋红色) - 反射中点那怎么办?
n,p,e,l
是知情的或可以轻松计算l
对于所有像素都是恒定的l=light_pos-p; l/=|l|;
e=eye_pos-p; e/=|e|;
q
我为这个q=p+(n*dot(l,n));
r
向量很简单r=(p+l)+2*(q-(p+l))-p=2*(q-p)-l;
现在你有了反射向量r
m=light_color*dot(r,e)+ambient_light;
r
附近出现的最大反射ca=cos(ang)=dot(r,e);
你不需要ang
直接余弦很好ca=pow(ca,5.0)
可以使用任何指数m=(light_color*0.5*(ca+dot(r,e)))+ambient_light;
p
color=surface_color*m;
希望我没有忘记过一段时间我编写了类似这样的内容......