HLSL之漫反射光
整整忙了一个月了,总算清闲下来了,从上次写完环境光后又过了这么长时间,继续学习......加油!!今天整理下漫反射光并记录下来,那就直接进入主题吧,开始漫反射光的学习。
漫反射光是在环境光的基础上添加一个定向光让物体看起来更真实,定向光照射到物体表面,会根据物体表面不同的凹凸程度呈现出强度差异的反射光,让物体看起来更有立体感;当光线方向固定后,决定反射光强度的就是物体表面的法线方向。如果光线方向平行于物体表面(即和物体表面的法线垂直时)这时候的反射光是最弱的,如果光线方向垂直于物体表面(即和物体表面的法线平行时)这时候的反射光是最强的。
漫反射光的公式:I = Aintensity*Acolor + Dintensity*Dcolor *N.L
公式说明:前面的Aintensity*Acolor仍然是环境光的公式,后面一部分表示添加的反射光,其中Dintensity表示光照强度,Dcolor 表示颜色,N表示物体表面的法线,L表示光线方向,N.L则是N和L两向量的点乘,等价于:N.L=|N|*|L|*cos(a)(a为两法线夹角).注意:L的方向是自顶点指向光源的。
下面看看相对于环境光代码相关变动的地方,除了Draw中的变化,其他代码均无变化,所以这里主要看看Draw里面的代码
effect.CurrentTechnique = effect.Techniques["DiffuseLight"]; //读取fx
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
foreach (ModelMesh mesh in model.Meshes)
{
foreach (ModelMeshPart part in mesh.MeshParts)
{
effect.Parameters["World"].SetValue(modelTransform[mesh.ParentBone.Index] * Matrix.CreateScale(30.0f) * Matrix.CreateRotationY((float)angle) * Matrix.CreateRotationX((float)angle));
effect.Parameters["View"].SetValue(viewMatrix);
effect.Parameters["Projection"].SetValue(projectionMatrix);
effect.Parameters["AmbientColor"].SetValue(new Vector4(0.0f, 0.5f, 0f, 1.0f));
effect.Parameters["DiffuseColor"].SetValue(new Vector4(1.0f, 0.4f, 0.24f, 0.1f));
effect.Parameters["AmbientIntensity"].SetValue(0.5f);
effect.Parameters["LightDirection"].SetValue(Vector4.Normalize(new Vector4(, , 0.0f, 1.0f)));
graphics.GraphicsDevice.SetVertexBuffer(part.VertexBuffer);
graphics.GraphicsDevice.Indices = part.IndexBuffer;
graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.VertexOffset, , part.NumVertices, part.StartIndex, part.PrimitiveCount);
}
}
}
代码中可以看出环境光AmbientColor:Vector4(0,0.5,0,1)这样做的目地是为了可以在下面的截图中看到意图,同时光线方向是平行于X轴指向X轴正半轴的。下面看看运行效果
其中橘黄色是反射光的颜色也即是DiffuseColor:Vector4(1.0f, 0.4f, 0.24f, 0.1f),而绿色是环境光的颜色AmbientColor:Vector4(0,0.5,0,1)光线方向是沿着X轴。可以看到未被照射到的地方色差明显。此时我们修改下LightDirection将其改成Vector4(0, 0, 1.0f, 1.0f) 沿着Z轴正方向(对比两张效果图即可明白光线方向的不同对最终效果的影响)
接下来我们看看fx里面的代码:
float4x4 World;
float4x4 View;
float4x4 Projection;
float4 AmbientColor;
float4 DiffuseColor;
float AmbientIntensity;
float4 LightDirection; // TODO: add effect parameters here. struct VertexShaderInput
{
float4 Position : POSITION0;
}; struct VertexShaderOutput
{
float4 Position : POSITION0;
float3 N:TEXCOORD0;
}; VertexShaderOutput VertexShaderDiffuse(float4 Position:POSITION0,float3 N:NORMAL)
{
VertexShaderOutput output; float4 worldPosition = mul(Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection); output.N=normalize(mul(N,World)); return output;
} float4 PixelShaderDiffuse(VertexShaderOutput input) : COLOR0
{
return AmbientColor*AmbientIntensity+1.0f*DiffuseColor*saturate(dot(LightDirection,input.N));
} technique DiffuseLight
{
pass Pass0
{
// TODO: set renderstates here.
VertexShader = compile vs_2_0 VertexShaderDiffuse();
PixelShader = compile ps_2_0 PixelShaderDiffuse();
}
}
除了公式不同以外,在这里我们看到一个TEXCOORD0,TEXCOORDN是可以存放任何数据的寄存器,在相应位置没有存放纹理坐标的时候可以用来存储任何数据,并在以后读取出来。
漫反射光的知识也就这么多了,期待下节镜面反射光照的学习.......
HLSL之漫反射光的更多相关文章
- HLSL之镜面反射光照
今天学习的是镜面的反射光照,其实一般在场景中基本环境光和漫反射光照已经可以表现出一个不错的照明了,今天的镜面反射光照其实仅仅适合于需要在表面添加抛光或者闪耀的物体上,例如金属.玻璃等等,同时也是基于之 ...
- 【转载】Direct3D HLSL介绍(上)
原文路径:http://www.csharpwin.com/csharpspace/3087.shtml 写过Direct3D程序的朋友们可能还记得,在以往,大家常为如何表现更多真实的材质(如玻璃.金 ...
- DirectX HLSL 内置函数
Intrinsic Functions (DirectX HLSL) The following table lists the intrinsic functions available in HL ...
- HLSL学习笔记(一):基础
http://www.cnblogs.com/rainstorm/archive/2013/05/04/3057444.html 前言 五一在家无事,于是学习了一下HLSL,基于XAN4.0的.学习完 ...
- HLSL Shader编程基础总结
转自:https://blog.csdn.net/Blues1021/article/details/47093487 基本前提概念 Shader是一种映射到GPU硬件汇编语言上的高级语言,Shade ...
- HLSL效果框架-多光源效果
原文:HLSL效果框架-多光源效果 昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心 手机淘宝二维码 扫描 或者打开连接:程序设计开发 ,掌声鼓励,欢迎光临. 高级着色器语言(HLS ...
- [Unity] Shader - CG语言 和 HLSL语言
CG 跟 HLSL几乎是一摸一样的. (HLSL官方参考,包含语法格式,函数库,关键字,在这个地方: http://msdn.microsoft.com/en-us/library/bb509638( ...
- [ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )
http://www.phoronix.com/scan.php?page=news_item&px=OTI2NA Note: Something very instersting to w ...
- 微软的HLSL Shader Model 6.0 compiler要转向LLVM了,开源的节奏. Apple/Khronos都有各自计划
So, Microsoft is making an opensource HLSL-to-almost-LLVM compiler, and Khronos is making an opensou ...
随机推荐
- 每天一个 Linux 命令(13):less 命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性. 在 more 的时候,我们并没有办法向前面 ...
- 清理Oracle安装目录里的一些日志信息
最近测试环境服务器上磁盘空间紧张,表空间里面的数据也不知道开发哪些需要哪些不需要,而且因为此测试库运行时间比较久远,起码有三年了.于是就从清理Oracle安装目录下的日志下手. 发现在一般这几个日志, ...
- power
http://software.intel.com/en-us/articles/power-efficiency-analysis-and-sw-development-recommendation ...
- fw: openstack
OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...
- lua 基础库
数学库: 三角函数:math.sin, math.cos, math.tan, math.asin, math.acos 都以弧度为单位: 指数和对数函数:exp, log, log10: 取整函数: ...
- DEV中dx:ASPxPopupControl 控件的使用(在窗口关闭或隐藏时,清楚文本框中的内容)
//在窗口关闭或隐藏时,清楚文本框中的内容(核心代码) function(s, e) { ASPxClientEdit.ClearGroup('entryGroup'); } <asp:Cont ...
- 计算hashCode的常见方法
把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中. 2.对于对象中每一个关键域f(值equals方法中考虑的每一个域),完成以下步骤: a.为该域计算int类型的散列吗c: ...
- 使用imap协议接收邮件
之前一直使用PHPMail类进行发送邮件,这个是一个非常强大的类,但是其实底层就是使用mail()函数来进行发送的. 但是现在公司有个需求是 写个程序需要实时的接收邮件,主要是判断邮件发出去了,并且 ...
- 在SWING里嵌入SWT的组件
http://zhanghan3366.blog.163.com/blog/static/6966305220110505351568/ ——————————————————————————————— ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...