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
- shader镜面反射(Reflection)
- Q86:镜面反射(Mirror Reflection)
- Unity Shader------遮罩反射(Masking Reflection)
- 一组自己写的实时折射、镜面反射shader
- Unity3d 镜面反射 vertex and frag Shader源码
- 反射(Reflection)
- 反射reflection
- 反射Reflection
- Reflection反射
- 反射 reflection
- 反射Reflection
- Reflection反射
- 反射reflection
- 反射(Reflection)
- Reflection 反射
- 反射(Reflection)
- 反射 Reflection
- 反射:reflection
- CNTK从入门到深入研究(8) - CNTK工程结构(CNTK Core)
- Eclipse常用快捷键
- dm9000网卡驱动分析(一)
- JavaScript原型链详细介绍
- 吝啬的国度
- shader镜面反射(Reflection)
- app与后台交互以及web与后台交互的比较(app简单测试环境)
- JAVA执行javascript方法
- 1. PDO简介
- C语言单链表实现栈
- 替换空格
- java 之自动装拆箱及final用法
- 奥斯卡影帝马修·麦康纳给毕业生的话
- java从字符串中提取数字