欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

shader镜面反射(Reflection)

发布时间:2024/1/8 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 shader镜面反射(Reflection) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

这里用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(下载地址)

总结

以上是生活随笔为你收集整理的shader镜面反射(Reflection)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。