游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8115|回复: 19

Shader开发交流贴:像素高光效果的实现

[复制链接]

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-10-25 11:33:00 | 显示全部楼层 |阅读模式
最近研究了下高光等效果,这里总结一下。
算法:
一、计算得到像素到眼睛的射线单位向量,该单位向量等于眼睛位置减去象素的位置,然后归1化:EyeVec = Normalize( EyePosition - VertexPosition );另外,有一种简化模式效果也不错,偶就是采用这种模式:假设眼睛在无限远,则EyeVec为常量,所以,EyeVec = Normalize( EyePosition - 物体Position ),在这种模式下,无需在VS中对物体进行Per-Vertex的EyeVec计算。

二、计算Halfway Vector(中间向量、中途向量),HalfwayVec = Normalize( EyeVec + LightVec ),其中LightVec的方向是从光照处指向灯光,该向量表示了在当前眼睛所在位置,该像素若发生高光全反射时的法向量(即HalfwayVec)

三、将HalfwayVec与实际的像素法向量比较得到当前像素反光度,越与HalfwayVec接近,反光越强烈,所以可以利用点乘来达到这一目的,反光度 = HalfwayVec 点乘 Normal。

四、调整光亮度,可以将反光度进行N次方运算,以缩小光斑,得到不同材质的效果

五、将物体Diffuse颜色加上( 反光度, 反光度, 反光度 )的颜色。Diffuse.r += 反光度;Diffuse.g += 反光度;Diffuse.b += 反光度;
sf_20051025113232.jpg

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-25 11:34:00 | 显示全部楼层

像素高光的缺点

该算法的缺点关键是数据精度问题,由于第四步的多次乘方造成了高光区落在了一个很小的区间里,而出现了高光离散的块状现象,下图用平滑化的表面展示了这一问题。
sf_20051025113337.jpg

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-25 11:37:00 | 显示全部楼层

高光反射贴图(Specular Map / Gloss Map)的应用

在像素高光反光度的计算中,如果将最后得到的反光度再进行某种强弱变化,就形成了一种新的效果,比如将其再乘以一个浮点数,就可以再次控制反光强度,如果我们通过一张新的贴图给每个像素准备一个反光度系数,则该贴图称为高光贴图(Specular Map or Gloss Map),该贴图只有一个通道数据,0-1表示反射强度由弱到最强。

因为只有一个通道,所以在PS运算中,我们可以把该SpecularMap的数据合并到NormalMap中去,(RGB:法向量,A:反射度),这样只用一张贴图就可以完成NormalMap和SpecularMap的作用。
sf_20051025113712.jpg

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-25 12:22:00 | 显示全部楼层

光照衰减贴图(Specular Attenuation Map)的应用

SpecularMap是相对于物体表面而言,反映的是物体表面不同位置的反光程度,而Spec衰减图则是针对物体材质而言,反映了该物体材质的反光能力,比如,陶瓷的高光区域很集中,高光区的亮斑变化急剧;而一个乒乓球表面的高光区域则变化比较平缓。

具体算法是在第3步经过点乘得到反光度后不再执行第4步,而是根据该反光度去一张2D高光衰减纹理进行高光取样,最终将取样到的高光应用(add)到最终渲染结果上。

这张2D高光衰减贴图只需要做成512X1等高度为1的尺寸(此处为了表述清晰而将贴图变成了256*128大小),就可以用来扫描整个高光段的变化情况。同时,由于高光衰减只有一个通道的数据,高光衰减贴图另外3个通道还可以充分利用来做Diffuse漫反射光的衰减变化,以完成其他特效。
sf_20051025122135.jpg

11

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2005-10-26 08:14:00 | 显示全部楼层

Re:Shader开发交流贴:像素高光效果的实现

不错!

0

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2005-10-26 17:33:00 | 显示全部楼层

Re:Shader开发交流贴:像素高光效果的实现

好贴

38

主题

1581

帖子

1614

积分

金牌会员

Rank: 6Rank: 6

积分
1614
QQ
发表于 2005-10-27 09:53:00 | 显示全部楼层

Re:Shader开发交流贴:像素高光效果的实现

效果很棒的说

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-27 10:49:00 | 显示全部楼层

Re:Shader开发交流贴:像素高光效果的实现

效果的问题主要还是精度问题,看ATI的说法是用32位纹理来解决。

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-27 10:51:00 | 显示全部楼层

Re: Shader开发交流贴:像素高光效果的实现

再贴个合成GlossMap和高光衰减贴图的效果

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-10-28 10:31:00 | 显示全部楼层

Re:Shader开发交流贴:像素高光效果的实现

PS2.0以上就用pow来做高光了,查纹理肯定会有精度问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 07:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表