Directx教程(27) 简单的光照模型(6)

简介: 从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightClass中我设置为m_position = D3DXVECTOR4(5.0, 5.0, -3.0,1.0),所以我们渲染的cube,在前面,右侧,上面都没有问题,但是,我们通过A键移动摄像机后,会发现右侧的面没有光照效果。

     从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightClass中我设置为m_position = D3DXVECTOR4(5.0, 5.0, -3.0,1.0),所以我们渲染的cube,在前面,右侧,上面都没有问题,但是,我们通过A键移动摄像机后,会发现右侧的面没有光照效果。这是因为右侧面的法向是-x方向,漫反射光和高光都为0,所以效果很差。

image

现在我们将在场景中增加第二个光源,位置放在SetLightPosition(-8.0, -4.0, 5.0,1.0);,代码的主要改动如下:

     1、除了摄像机位置外,材质光源等其它属性设置,都放在LightShaderClass类中,我们可以看到Render和SetShaderParameters两个函数的参数变少了很多。

bool Render(ID3D11DeviceContext* , int , D3DXMATRIX , D3DXMATRIX , D3DXMATRIX , D3DXVECTOR4);
bool SetShaderParameters(ID3D11DeviceContext* , D3DXMATRIX , D3DXMATRIX , D3DXMATRIX, D3DXVECTOR4);
    

    2、在common.h中定义一个宏表示光源的数量。

#define NUM_LIGHTS 2

 

      现在,LightShaderClass中材质光源结构变成了:

struct  LightMaterialBufferType
    {
    D3DXVECTOR4 lightPosition[NUM_LIGHTS]; //光源位置
    D3DXVECTOR4 lightColor[NUM_LIGHTS];   //光源颜色
    D3DXVECTOR4 globalAmbient[NUM_LIGHTS]; //光源的环境光反射系数
    D3DXVECTOR4 cameraPosition; //摄像机的位置
    D3DXVECTOR4 Ke[NUM_LIGHTS];  //材质的自发光
    D3DXVECTOR4 Ka[NUM_LIGHTS];  //材质的环境光系数
    D3DXVECTOR4 Kd[NUM_LIGHTS];  //材质的漫反射系数
    D3DXVECTOR4 Ks[NUM_LIGHTS];  //材质的高光系数
    D3DXVECTOR3 lightDirection[NUM_LIGHTS]; //平行光方向
    float shininess[NUM_LIGHTS]; //高光指数
     };

     3、同样,light.ps中的材质光源常量缓冲也要做相应的改变,然后在生成光照颜色时,我们通过一个for循环来累加每个光源的贡献。

     程序执行后的效果如下,我们可以看到cube的右侧面也有了不错的光照效果。

image

image

完整的代码请参考:

工程文件myTutorialD3D11_20

代码下载:

http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

相关文章
快速生成软著申请时所需的60页代码文档的免费工具
本篇文章主要讲解,制作软著代码文档的高效方法,当然不可能手动一个个复制了,这显然太笨拙,他浪费时间了。这里我给大家介绍一个更快的方式。
9313 0
五分钟带你玩转sonar(五)教你使用SonarLint插件
五分钟带你玩转sonar(五)教你使用SonarLint插件
5298 0
五分钟带你玩转sonar(五)教你使用SonarLint插件
|
9月前
|
前端开发 算法 API
鸿蒙特效教程08-幸运大转盘抽奖
本教程将带领大家从零开始,一步步实现一个完整的转盘抽奖效果,包括界面布局、Canvas绘制、动画效果和抽奖逻辑等。
327 0
鸿蒙特效教程08-幸运大转盘抽奖
|
9月前
|
人工智能 供应链 监控
千星计划如何解决引流裂变留存复购的难题?
千星计划通过零成本裂变引擎、指数级收益设计、AI风控及私域闭环,解决引流、裂变、留存和复购难题。其核心策略包括3人裂变层级叠加、强制任务机制、清流算法和视频号带货绑定等,大幅降低获客成本(从50元降至10元),提升留存率(85%以上)和复购频次(2.1次/月)。实际案例显示,采用该模型的企业30天内用户LTV从89元提升至217元。
|
编解码 前端开发 JavaScript
前端界的黑科技:掌握这些技术,让你的网站秒变未来感十足!
【10月更文挑战第31天】前端技术日新月异,黑科技层出不穷,让网页更加美观、交互更加丰富。本文通过响应式布局与媒体查询、前端框架与组件化开发等案例,展示这些技术如何让网站充满未来感。响应式布局使网站适应不同设备,前端框架如React、Vue则提高开发效率和代码质量。
243 3
|
11月前
|
前端开发 Java 开发者
【springboot】中使用--WebMvcConfigurer
通过实现 `WebMvcConfigurer` 接口,Spring Boot 开发者可以灵活地自定义和扩展 Spring MVC 的配置。无论是视图解析、拦截器、跨域请求处理,还是静态资源和消息转换器配置,`WebMvcConfigurer` 都提供了一致的接口来实现这些功能。掌握这些配置方法,可以使开发者在 Spring Boot 项目中更加游刃有余地进行各种定制化需求的开发。
596 14
|
SQL 关系型数据库 MySQL
京东面试:什么情况下 mysql RR不能解决幻读? RR隔离mysql如何实现?
老架构师尼恩在其读者交流群中分享了关于MySQL事务隔离级别的深入解析,特别针对RR级隔离如何解决幻读问题进行了详细讨论。文章不仅解释了ACID中的隔离性概念,还列举了四种事务隔离级别(未提交读、提交读、可重复读、串行读)的特点及应用场景。尼恩通过具体的例子和图表,清晰地展示了不同隔离级别下的并发事务问题(脏读、不可重复读、幻读)及其解决方案,特别是RR级隔离下的MVCC机制如何通过快照读和当前读来防止幻读。此外,尼恩还提供了相关面试题的解答技巧和参考资料,帮助读者更好地准备技术面试。更多详细内容和实战案例可在《尼恩Java面试宝典》中找到。
|
机器学习/深度学习 人工智能 物联网
智能家居技术的未来:从自动化到智能化的跨越
本文将探讨智能家居技术的发展趋势,从早期的自动化设备到现代的智能系统,分析其背后的技术驱动因素和市场动态。文章将详细讨论物联网(IoT)、人工智能(AI)、机器学习等技术如何推动智能家居的发展,并展望智能家居未来的发展方向。
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
3619 6
|
开发框架 监控 测试技术
【软件工程】走进瀑布模型:传统软件开发的经典之路
【软件工程】走进瀑布模型:传统软件开发的经典之路

热门文章

最新文章