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

现在我们将在场景中增加第二个光源,位置放在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的右侧面也有了不错的光照效果。


完整的代码请参考:
工程文件myTutorialD3D11_20
代码下载:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx教程(27) 简单的光照模型(6)的更多相关文章
- Directx教程(29) 简单的光照模型(8)
原文:Directx教程(29) 简单的光照模型(8) 现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...
- Directx教程(28) 简单的光照模型(7)
原文:Directx教程(28) 简单的光照模型(7) 现实生活中的点光源都是随着距离衰减的,比如一个电灯泡在近处会照的很亮,远处光线就很弱.本节中我们在前面光公式的基础上,再给漫反射和 ...
- Directx教程(26) 简单的光照模型(5)
原文:Directx教程(26) 简单的光照模型(5) 在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中.本章中我们尝试fragment光照(或者说叫ps光照),在 ...
- 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 作者:毛星云 ...
- [译]Vulkan教程(27)Image
[译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...
随机推荐
- ajax发送验证码
$.ajax({ url:url, type:"POST", data:data, dataType:"JSON", s ...
- mysql 索引优化,不走索引的原因
1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引 2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…) ...
- PAT甲级——A1062 Talent and Virtue
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- LeetCode简单算法之分割平衡字符串 #1221
在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...
- debian下编译安装poco
系统环境: debian版本:Linux localhost.localdomain 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC ...
- redis学习笔记05-发布订阅模式
由于redis消息队列并不支持多播机制,即生产者产出一次,由中间件复制发送给多个消费者的机制,为了弥补这个不足,单独引入了发布订阅模式的模块.使用方式如下: #生产者 import redis cli ...
- java随机生成字符串工具类
package aA; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; /** * 字符随机 ...
- mysql导出数据库某些表的数据
# 导出数据,一般从从库导出,减少主库的压力.mysqldump -hhostname -P3306 --single-transaction --master-data= database_name ...
- [BZOJ2729]排队
数学知识 排列 A(n,m)从n个元素中选出m个的不同的排列数 A(n,m)=n!/(n-m)! 组合 C(n,m)从n个元素中选出m个的不同的方案数 C(n,m)=n!/(m!*(n-m)! ...
- Matlab中的cell、size函数
参考网址:http://blog.sina.com.cn/s/blog_5efed5800100exmj.html Cell函数 如果p为一个数,那么h(1)=p,是没有问题的. 如果p为一个向量,那 ...