HLSL 学习笔记7 Light Mode
Light Mode
根据现有参数(lightVec, eyeVec, normal…)计算最终颜色的算法
Blinn Phong
前面所学的Ambient+Diffuse+Specular
Phong
区别在于高光计算
高光:镜面反射。但大部分材质只能反射最亮的部分,反射带有模糊
所以真实的模拟高光:需要reflection map,做一些处理去掉过于暗的部分,然后像全局光照中的Cube Map 那样贴到物体上
所以在Phong中使用更真实的方法计算高光
①计算光向量和眼睛向量夹角中线和法线的夹角
float R=-reflect(L,N); //计算出射光线
float RdotV=saturate(dot(R,V));//计算出射光线和眼睛向量的夹角
float SpecPower=pow(RdotV,gloss);
②计算光泽范围
float SpecPower=pow(RdotV,gloss);
③Specular=SpecPowerSpecularColorSpecularTexture;
Blinn更适合计算金属材质
Phong更适合塑料材质
Cook/Torrence
最初用于模拟金属
光滑的物体,微观下也是不平的。所以镜面反射式存在损失的
N:法线
L:光向量
V:眼睛向量
H:眼睛和光线夹角中线
float CookTorrance(float NdotL, float NdotV, float NdotH,float VdotH, float Roughness1, float Roughness2)
{ Roughness*=3.0f;//Compute geometric termfloat G1 =(2.0f*NdotH*NdotV)/VdotH;float G2 =(2.0f*NdotH*NdotL)/VdotH;float G=min(1.0f,max(0.0f,min(G1,G2)));//选择G1和G2中最小的那个但要在[0.0f,1.0f]的范围内//Compute fresnel term 光在模型边缘的作用float F=Roughness2+(1.0f-Roughness2)*pow(1.0f-NdotV,5.0f);//Compute the roughness term 计算表面的粗糙度float R_2=Roughness1*Roughness1;float NdotH_2= NdotH* NdotH;float A=1.0f/(4.0f*R_2*NdotH_2*NdotH_2);float B=exp(-(1.0f-NdotH_2)/(R_2*NdotH_2));float R=A*B;return ((G*F*R)/(NdotH*NdotV));}float4 pixel(vertex2pixel In, unifrom float4 lightColor)
{Ambient=AmbientColor*ColorTexture;Specular=CookTorrance(......)*SpecularColor*SpecularTexture;float4 final_light=lightColor*diffuselight*((ColorTexture*DiffuseColor)+Specular)+Ambient;
}
Roughness即可使用变量输入:整个物体的粗糙度一样
也可使用贴图输入:Roughness1,Roughness2存在R和G通道
可以精细控制同一物体不同地方的粗糙度
Oren Nayar
模拟漫反射
一般的漫反射:用法线和光向量的夹角来表示,这种情况漫反射模拟的表面比较光滑
实际上:许多材质非常粗糙
HLSL 学习笔记7 Light Mode相关推荐
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...
- HLSL学习笔记(一):基础
前言 五一在家无事,于是学习了一下HLSL,基于XAN4.0的.学习完了也就总结一下,纯粹是新手学习的经验之谈,纰漏之处还望见谅,不喜勿喷. HLSL是一种使用GPU渲染出图像的技术,不仅可以改变最终 ...
- HLSL 学习笔记5 光照2
Light Attenuation 光源离物体越远,光所照到的部分越少 (适用于点光源,方向光不衰减,聚光灯的衰减不一样) float d=length(In.light.xyz); //以线性衰减 ...
- HLSL 学习笔记1 vertex shader, pixel shader
VERTEX SHADER 模板 //v2f 是输出结构,在前面定义了 v2f v(a2v In, uniform float4 lightPosition)//uniform 说明该数据来自shad ...
- HLSL 学习笔记9 Reflection Mapping
镜面反射 光线追踪:物体每个像素发出光线,与物体交互,然后返回颜色-代价太高 reflection mapping:模拟反射的简易方法 ①制作一个Cube Map ②定义CubeMap和其采样器 te ...
- HLSL 学习笔记4 光照1
由三部分组成 1 ambient 环境光 :没有固定来源,来自周围 2 diffuse 漫反射 :来自光源,但反射向各个方向:需要计算光线和物体表面法线的夹角: !!!:计算向量时确保坐标是在同一空间 ...
- HLSL 学习笔记3 法线映射
法线贴图 法线用x,y,z三个向量来表示,在三维空间中的方向 法线贴图的rgb通道分别储存法线在xyz三个方向上的分量 r:[0,255]代表 与x轴成[-90,90]度角 g: y轴 b:z轴 法线 ...
- unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)
Unity3D学习笔记(四)天空.光晕和迷雾 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里.当时在艾泽拉斯大陆还不能使用飞行坐骑,试 ...
- Unity学习笔记1-键盘控制开关灯(Point Light)
Unity学习笔记1-键盘控制开关灯(Point Light) 实现开关灯用键盘上的两个按键控制,效果如下所示 1-创建材质球(Material):HighLight和OffLight **: )Li ...
最新文章
- 分享7个我常去的国外AjaxJquery网站
- 模型仅1MB,更轻量的人脸检测模型开源,效果不弱于主流算法
- 为何多线程就能提高Java程序的执行效率
- Linux 下安装python软件包(pip、nose、virtualenv、distribute )
- Linux管理磁盘配额
- vqa mcb_MCB的完整形式是什么?
- MySQL多线程备份工具mydumper
- CATIA—机电产品数字化设计工具
- sql根据经纬度计算距离
- FTP-文件传输协议
- 良心教程教你如何使用Excel简单绘制数据图表。
- 5. Podspec 文件分析
- Java实现 LeetCode 513 找树左下角的值
- T5 模型:NLP Text-to-Text 预训练模型+数据清洗
- java url参数转map_url参数和map之间的转换
- 小程序开发:调用百度文字识别接口实现图文识别,Node.js开发
- k近邻算法——kd树
- Nginx 之 realip模块 使用详解
- 短视频评论的抓取及分析
- 使用STC15系列单片机操作sht30
热门文章
- DJ2-2 进程管理
- 【Qt】QT鼠标和键盘事件
- l2高斯分布_L1正则先验是Laplace分布,L2正则先验分布是高斯分布
- 中庸----做人的智慧
- 【Optimizaition/x86】Intel CPU的CPUID指令获取的C实现
- {“errcode“:48001,“errmsg“:“api unauthorized, hints: [ req_id: xxxxxxx]“}
- Mesh组网之单线复用与VLAN网口复用
- 解决TIM版无法修改个人文件夹位置
- Linux开机启动、bashrc、定时任务
- Java中带返回值的线程池Future