OpenGL和D3D的灯光法线计算和渲染

法线计算函数

原来总觉得这个公式是错的。渲染出来的图感觉是烂的,事实上的确是烂图,不过公式却是对的,只是还少了最后一步,我网上找了3个多月,没人给出答案,现在我找到点碎玉,抛出了希望引得一些砖头。。

function g3NormalV(p1, p2, p3:Tg3DVector3d):Tg3DVector3d;
begin
    Result.x := (p2.y-p1.y)*(p3.z-p1.z) - (p2.z-p1.z)*(p3.y-p1.y);
    Result.y := (p2.z-p1.z)*(p3.x-p1.x) - (p2.x-p1.x)*(p3.z-p1.z);
    Result.z := (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);

end;

//下图是直接使用法线值,渲染出的效果,很烂。
   

 

统一规范化后,渲染出的效果基本可以接受了。
   

以下是统一规范化的函数。通过感觉,随手写的,结果基本可以接受。应该有更好的算法。希望大能回复指正。

function g3NormalStandard(p1:Tg3DVector3d):Tg3DVector3d;
var zx,zy,b:Double;
begin
  Result := p1;
//  zx := Max(abs(p1.z), abs(p1.x));
//  zy := Max(abs(p1.z), abs(p1.y));

  zx := abs(p1.z) + abs(p1.x);
  zy := abs(p1.z) + abs(p1.y);
  b := Max(zx,zy);
  if b = 0 then Exit;
  b := 1/b;

  Result.x := p1.x * b;
  Result.y := p1.y * b;
  Result.z := p1.z * b;
end;

应该有更好的算法。希望大能回复指正。

应该有更好的算法。希望大能回复指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值