Directx教程(26) 简单的光照模型(5)
在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中。本章中我们尝试fragment光照(或者说叫ps光照),在vs中,我们把顶点在世界坐标系中的法向和位置都直接传输到ps中。
// 世界坐标系中的顶点法向.
float3 N = mul(input.normal, (float3x3)worldMatrix);
output.worldnormal= N;
//世界坐标系顶点位置
worldPosition = mul(input.position, worldMatrix);
output.worldposition = worldPosition;
vs光照和ps光照的区别到底是什么呢?
其实很简单,对于vs光照来说,我们在vs中对每个顶点计算出了颜色,然后gpu的固定管线,会在ps之前,根据顶点颜色值,实施双线性差值,计算得出每个pixel的颜色。而对于ps光照,则是会差值每个顶点位置和法向,从而每个pixel都有一个自己相对应的位置和法向,而光照的计算则是在ps中完成。
所以,使用ps光照,它的颜色过度会更柔和,没有vs光照那样的粗糙感。
现在我们的ps函数如下:
float4 LightPixelShader(PixelInputType input) : SV_TARGET
{
float3 P = input.worldposition.xyz;
float3 N = normalize(input.worldnormal);
//自发射颜色
float4 emissive = Ke;
//计算环境光
float4 ambient = Ka * globalAmbient;
//计算漫反射光
//用LightDirection就是纯平行光
//光源位置减顶点位置,是不考虑衰减的点光源
float3 L = normalize(lightPosition.xyz - P);
float diffuseLight = max(dot(N, L), 0);
float4 diffuse = Kd * lightColor * diffuseLight;
//计算高光
float3 V = normalize(cameraPosition.xyz - P);
float3 H = normalize(L + V);
float specularLight = pow(max(dot(N, H), 0), shininess);
if ( diffuseLight <= 0)
specularLight = 0;
float4 specular = Ks * lightColor * specularLight;
float4 finalcolor = emissive + ambient + diffuse + specular;
return finalcolor;
}
另外lightShaderClass中,我们还要把以前设置的vs材质光照常量缓冲,改成设置ps光照常量常量缓冲。
// 设置光照材质常量缓冲.
deviceContext->PSSetConstantBuffers(bufferNumber, 1, &m_lightmaterialBuffer);
其它的代码几乎不用改变,程序执行后的效果如下:
完整的代码请参考:
工程文件myTutorialD3D11_19
代码下载:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx教程(26) 简单的光照模型(5)的更多相关文章
- Directx教程(29) 简单的光照模型(8)
原文:Directx教程(29) 简单的光照模型(8) 现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...
- Directx教程(28) 简单的光照模型(7)
原文:Directx教程(28) 简单的光照模型(7) 现实生活中的点光源都是随着距离衰减的,比如一个电灯泡在近处会照的很亮,远处光线就很弱.本节中我们在前面光公式的基础上,再给漫反射和 ...
- Directx教程(27) 简单的光照模型(6)
原文:Directx教程(27) 简单的光照模型(6) 从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightCla ...
- Directx教程(25) 简单的光照模型(4)
原文:Directx教程(25) 简单的光照模型(4) 在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色. 前面的三个工程,我们都用的是方向光源(directional li ...
- Directx教程(24) 简单的光照模型(3)
原文:Directx教程(24) 简单的光照模型(3) 在工程myTutorialD3D11_17中,我们重新定义我们的cube顶点法向,每个三角形面的顶点法向都是和这个三角形的面法向是一致 ...
- Directx教程(23) 简单的光照模型(2)
原文:Directx教程(23) 简单的光照模型(2) 在工程myTutorialD3D11_16中,我在文件light.vs中定义了一个材质光源属性常量缓冲. //const buffer最好 ...
- Directx教程(22) 简单的光照模型(1)
原文:Directx教程(22) 简单的光照模型(1) 在前面的教程中,我们在顶点属性中直接给顶点赋颜色,这样生成的三维物体缺乏真实感,如下图中两个立方体,左边的是通过光照生成物体表面颜色的 ...
- 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...
- ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF ...
随机推荐
- 深入浅出 Java Concurrency (9): 锁机制 part 4[转]
本小节介绍锁释放Lock.unlock(). Release/TryRelease unlock操作实际上就调用了AQS的release操作,释放持有的锁. public final boolean ...
- 线段树区间更新+区间求和模板(数组实现)洛谷p3372,p3373
模板题目1:https://www.luogu.org/problemnew/show/P3372 懒惰标记讲解:https://www.cnblogs.com/wushengyang/p/11194 ...
- Elasticsearch快速开始
Elasticsearch是一个分布式RESTful风格的搜索和数据分析引擎 查询:Elasticsearch允许执行和合并多种类型的搜索——结构化.非结构化.地理位置.度量指标.搜索方式随心而变 分 ...
- reduce个数问题
reduce的数目到底和哪些因素有关 1.我们知道map的数量和文件数.文件大小.块大小.以及split大小有关,而reduce的数量跟哪些因素有关呢? 设置mapred.tasktracker.r ...
- Django项目:CRM(客户关系管理系统)--45--37PerfectCRM实现King_admin添加用户时密码加密
#views # ————————02PerfectCRM创建ADMIN页面———————— from django.shortcuts import render # ————————04Perfe ...
- TZ_09_常用jQuery操作
1.实现对chexkbox进行批量删除 checkbox属性 <td><input name="ids" type="checkbox" va ...
- uva 10036
10036 - Divisibility 额..直接复制不过来,只好叙述一下了...t组样例,n个数(1-10000),k(2-100)是要取余的数,然后给出n个数第一个数前不能加正负号,其他的数前面 ...
- hibernate 注解使用
实体类声明,需要引用 import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name=&quo ...
- spring springmvc 展示图片,静态资源的处理
jsp中显示一张照片 <img alt="静态图片" src="static/目录.png"> 然后在springmvc的配置中加上 <!-- ...
- Python各种转义符
文章来源:https://www.cnblogs.com/luckyplj/p/9792658.html 谢谢作者:雨后观山色