shader镜面反射(Reflection)

来源:互联网 发布:b站mac客户端下载视频 编辑:程序博客网 时间:2024/04/30 11:55

这里用DXUT 实现的一个反射的Demo(下载地址)


镜面反射:

要实现场景中类似镜面反射的场景,是一种很美妙的事,列如水中的倒影,玻璃上面的反射.下面我们来实现这种功能.我们来看一下实现的效果.


实现步骤:

需要先用一张立方体环境贴图,实现环境的颜色,.渲染立方体环境.这个在这里就不啰嗦了.

我们重点是实现对环境的反射.


以上的现象遵循物理反射定律,反射角等于入射角,即 角a = 角b

在HLSL 中有refect 反射函数 返回入射光线i对表面法线n的反射光线。

在反射物体中,通过使用每个像素点上的反射向量来索引到立方体纹理上的像素,就能近似模拟反射效果了.

Pixel Shader 里面的代码
float3 vLight;float AmbientIntensity;float DiffuseIntensity;float SpecularIntensity;float4 AmbientColor;float4 DiffuseColor;float4 SpecularColor;float SpecularPow;samplerCUBE Environment;struct PS_INPUT {      float3 Normal   : TEXCOORD0;      float3 Eye      : TEXCOORD1;};float4 ps_main( PS_INPUT Input ) : COLOR0{      float3 light = normalize(vLight);      float3 eye = normalize(Input.Eye);      float3 normal = normalize(Input.Normal);            float ndl = saturate(dot(light, normal));      //光线的反射方向      float3 r = normalize(reflect(-light, normal));      float rdv = pow(saturate(dot(r, eye)), SpecularPow);            //环境贴图       //这两行主要功能      float3 reflectEye = reflect(-eye, normal);      float4 reflectColor = texCUBE(Environment, reflectEye);            //光照方程      float4 color = AmbientColor * AmbientIntensity + DiffuseColor * DiffuseIntensity * ndl + SpecularColor * SpecularIntensity * rdv;      return reflectColor * color;}

主要代码就是
      float3 reflectEye = reflect(-eye, normal);      float4 reflectColor = texCUBE(Environment, reflectEye);


实现的原理是反射物体的效果文件不再是取自身的纹理,而是取环境立方体的纹理了.


同时我们看一下Vertex Shader 里面的代码吧,这个和以前的没有什么区别,姑且看看吧
float4x4 matWorldViewProjection;float4x4 matWorldInverseTranspose;float4x4 matWorld;float4 vViewPosition;struct VS_INPUT {      float4 Position : POSITION0;      float4 Normal   : NORMAL0;};struct VS_OUTPUT {      float4 Position : POSITION0;      float3 Normal   : TEXCOORD0;      float3 Eye      : TEXCOORD1;};VS_OUTPUT vs_main( VS_INPUT Input ){      VS_OUTPUT Output;         Output.Position = mul( Input.Position, matWorldViewProjection );      //法线变换要用世界矩阵逆矩阵的转置矩阵,但除了做非等比例的缩放时,直接用世界矩阵也可以      Output.Normal = mul ( Input.Normal, matWorldInverseTranspose );      //视线      Output.Eye = vViewPosition - mul(Input.Position, matWorld);            return( Output );      }



这里用DXUT 实现的一个反射的Demo(下载地址)

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机密码忘记了打不开怎么办 手机解压包不知道密码怎么办 手机屏图标没了怎么办 b站页面卡顿怎么办 被全景视觉骗了怎么办? 逆战进去没声音怎么办 Mac电脑ai卡住了怎么办 pr字幕打不了字怎么办 pr手写字多笔画怎么办 家中挖矿噪音很大怎么办 学了栏目包装不想干怎么办 在文本打字乱了怎么办 体考后觉得成绩有出入怎么办 荧光棒进眼睛里怎么办 无法读源文件或磁盘怎么办 爱剪辑视频横着怎么办 pr界面字体太小怎么办 0p手机卡槽坏了怎么办 pr视频有水波纹怎么办 手机耳机插口插上没声音怎么办 xp系统电脑没有声音怎么办 win10笔记本耳机没声音怎么办 电脑插耳机还是外放怎么办 主机电脑耳机插孔坏了怎么办 苹果6plus有点卡怎么办 手机拨通电话后黑屏怎么办 手机拨通后没声音怎么办 苹果手机铃声不响了怎么办 婴儿喘气粗好像有痰怎么办 金毛呼吸声很大怎么办 回看福建导视该怎么办 楼上木地板走路声音都很响怎么办 班里团支不搭理我我该怎么办 客户买家具说贵怎么办 英雄联盟超出显示范围怎么办 脸上有斑点怎么办内条 脖子扭到了一动就疼怎么办 杭州限行在路上怎么办 在路上限行了怎么办 微信号不能进群怎么办 在微信约妹子被骗2000怎么办