今天我们来学习下Direct3D里面的光源和材质.

四大光照类型:

环境光 Ambient Light 一个物体没有被光照直接照射,通过每一些物体反射的光线到达这个物体,它也有可能被看到.这种称为环境光
漫反射光 Diffuse Light 这种类型光沿着特定的方向传播,当达到某一个表面,它会向四周方向均匀反射(重点考虑反射光的空间位置和方向)
镜面反射光 Specular Light 当此类光到达一个表面时,严格地沿着一个方向反射。
自发光 Emissive Light 自发光就是对象自己发光

环境光的开启:

Device->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(50,50,36));

镜面反射光开启:

Device->SetRenderState(D3DRS_SPECULARENABLE,true);

三大光源类型:

点光源(Point Light)具有颜色和位置,但是没有方向,它向所有方向发射光都一样,光源不会因为距离而衰减

方向光源(direction Light) 在场景中以相同的方向传播,具有颜色和方向,不受到衰减和范围的影响.

聚光灯源, 在我们生活中有手电筒由一个内圆柱体和外圆柱体组成,光从最中心位置到外围逐渐衰减. Phi和Theta分别是两个圆锥体的里面夹角大小

 

创建点光源:

D3DLIGHT9 light;
::ZeroMemory(&light,sizeof(light));
light.Type = D3DLIGHT_POINT; //各种光源类型,现在是点光源
light.Ambient = D3DXCOLOR(0.8f,0.8f,0.8f,1.0f); //下面三个参数是环境光,漫反射光,镜面反射光的颜色值
light.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
light.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);
light.Position = D3DXVECTOR3(0.0f,200.0f,0.0f); //坐标位置
light.Attenuation0 = 1.0f; //下面三个参数是光随着距离衰减的系数
light.Attenuation1 = 0.0f;
light.Attenuation2 = 0.0f;
light.Range = 300.0f; //光照的范围,在某些光源中才有效果
Device->SetLight(0,&light); //设置光源
Device->LightEnable(0,true); //开启光源

创建方向光源:

//创建方向光源
D3DLIGHT9 light;
::ZeroMemory(&light,sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL; //方向光源
light.Ambient = D3DXCOLOR(0.5f,0.5f,0.5f,1.0f);
light.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
light.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);
light.Direction = D3DXVECTOR3(0.0f,0.0f,1.0f);
Device->SetLight(0,&light);
Device->LightEnable(0,true);

创建聚光灯:

D3DLIGHT9 light;
::ZeroMemory(&light,sizeof(light));
light.Type = D3DLIGHT_SPOT;
light.Position = D3DXVECTOR3(100.0f,100.0f,100.0f);
light.Direction = D3DXVECTOR3(-1.0f,-1.0f,-1.0f);
light.Ambient = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);
light.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
light.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,0.3f);
light.Attenuation0 = 1.0f;
light.Attenuation1 = 0.0f;
light.Attenuation2 = 0.0f;
light.Range = 300.0f;
light.Falloff = 0.1f;
light.Phi = D3DX_PI / 3.0f;
light.Theta = D3DX_PI / 6.0f;
Device->SetLight(0,&light);
Device->LightEnable(0,true);

 


材质:

光照和材质就像两个好基友,物体表面的材质属性决定了它能反射什么颜色的光线,以及能反射多少, 材质是属于某一个物体的,

来学习下如何创建材质

//创建材质:
D3DMATERIAL9 mtrl;
::ZeroMemory(&mtrl,sizeof(mtrl));
mtrl.Ambient = D3DXCOLOR(0.5f,0.5f,0.7f,1.0f); //表示物体表面对环境光的反射率,填写一个颜色,ARGB值在0-1之间
mtrl.Diffuse = D3DXCOLOR(0.6f,0.6f,0.6f,1.0f); //对漫反射光的反射率
mtrl.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,0.3f); //对镜面反射光的反射率
mtrl.Emissive = D3DXCOLOR(0.0f,0.0f,0.0f,1.0f); //对自发光颜色的反射率
mtrl.Power = 0.1f;
Device->SetMaterial(&mtrl); //设置材质

物体的顶点颜色的亮度总和有一个公式:

颜色总和 = 环境光 + 漫反射光 + 镜面反射光 + 自发光

Direct3D 光照和材质的更多相关文章

  1. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——四大变换&光照与材质

    第13章 四大变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的 ...

  3. DIRECT3D状态详解

    Microsoft® Direct3D®设备是一个状态机.应用程序设置光照.渲染和变换模块的状态,然后在渲染时传递数据给它们. 本节描述图形流水线用到的所有不同类型的状态. 渲染状态 取样器状态 纹理 ...

  4. GLSL 中的光照计算

    理论知识转载地址:http://blog.csdn.net/ym19860303/article/details/25545933 1.Lambert模型(漫反射) 环境光: Iambdiff = K ...

  5. OpenGL ES 2.0 光照

    基本的光照 光照分成了3种组成元素(3个通道):环境光.散射光以及镜面光. 材质的反射系数实际指的就是物体被照射处的颜色,散射光强度指的是散射光中的RGB(红.绿.蓝)3个色彩通道的强度. 环境光 指 ...

  6. Three.js开发指南---使用three.js的材质(第四章)

    材质就像物体的皮肤,决定了几何体的外表,例如是否像草地/金属,是否透明,是否显示线框等 一 材质 THREE.js的材质分为多种,Three.js提供了一个材质基类THREE.Material, 该基 ...

  7. OpenGL光照设置

    一.设置光源 (1)光源的种类 环境光 环境光是一种无处不在的光.环境光源放出的光线被认为来自任何方向.因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度. 点光源 由 ...

  8. 实验7 OpenGL光照

    一.实验目的: 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果. 二.实验内容: (1)下载并运行Nate Robin教学程序包中的lightmaterial程序,试 ...

  9. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

随机推荐

  1. Java Instanceof

    Java Instanceof Instanceof是一个非常简单的运算符,前一个操作通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的 ...

  2. Unity怎样在Editor下运行协程(coroutine)

    在处理Unity5新的AssetBundle的时候,我有一个需求,须要在Editor下(比方一个menuitem的处理函数中,游戏没有执行.也没有MonoBehaviour)载入AssetBundle ...

  3. LG 2.2.1 P350安卓系统刷机,问题总结,希望对需要的朋友有助

    手机误删软件导致短信,键盘等无声音提醒 我的手机前几天被我误删了一个软件,导致电话接不了,别人打电话的时候,老提示我在通话中,但是我可以在通话中看到对方的打电话记录.短信,键盘,USB连接,等等都没有 ...

  4. [RxJS] Reactive Programming - Clear data while loading with RxJS startWith()

    In currently implemention, there is one problem, when the page load and click refresh button, the us ...

  5. 将宿主机东西拷贝到dokcer容器中去

    1,获取容器名称或者id : docker ps 2,获取整个容器的id,其实键盘tag就可以补全的. docker inspect -f  '{{.Id}}'  步骤A获取的名称或者id 3,在主机 ...

  6. openssl 非对称加密算法RSA命令详解

    1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...

  7. C# XML 根级别上的数据无效

    XmlDocument加载xml方法 XmlDocument doc = new XmlDocument(); //加载xml 字符串 doc.LoadXml(_Store); //加载xml文件 d ...

  8. angular 指令梳理 —— 前端校验

    angular js内置校验的扩展 校验成功则 scope.formName.$valid=true 校验失败  元素的class: ng-invalid 成功:.ng-valid /** * 校验指 ...

  9. 浅谈Block传值-匿名函数(代码块)

    block传值是从后往前传值---代理也是 // 使用block时, 不能访问self, 也不能直接访问属性, self.属性, 用self调用方法; 只要这样做了, block都会对其强引用一份, ...

  10. 【android】修改android默认应用图标

    我自己做的一个小程序,想更改程序安装后的默认显示图片,但是我发现只能改一次,以后再改还是显示第一次更改后的图片(此时我已把最后一次更改前的全部图片都删除了,所以不会是名称填错),这是为什么??求高人指 ...