基本镜面着色

时间:2015-05-23 05:54:42

标签: c++ graphics 3d

我正在玩一个生成阴影球体的简单代码。我还没有完全理解数学,但是当我使用代码时,我正在弄清楚它。我想知道如何基于此代码实现镜面着色。有什么建议吗?

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

要首先添加反射,您需要通过曲面法线

的镜像光矢量
  • reflections
  • 所有这些都是单位向量:
  • 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)可以使用任何指数
  • 这会将值降低到1以下,因此它远低于原始余弦
  • 指数越大,现在锥形尺寸越小:
  • m=(light_color*0.5*(ca+dot(r,e)))+ambient_light;
  • 您还可以添加混合系数以更改镜面反射和正常反射光强度之间的比率
  • 现在使用p
  • 渲染像素color=surface_color*m;

希望我没有忘记过一段时间我编写了类似这样的内容......