原文:Directx教程(25) 简单的光照模型(4)

     在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色。

    前面的三个工程,我们都用的是方向光源(directional light),它的特点是没有光源位置或者说光源位置位于无穷远处,且光线在各个方向都是平行的,所以在工程myTutorialD3D11_17中,我们看到的程序界面上,cube每个面上的颜色都是一样的[因为diffuse光占颜色的大部分]。

    方向光原理可用以下图表示:

     现在我们尝试点光源,点光源原理如下:

    因为计算漫反射时候,每个顶点的漫反射颜色都和到光源位置向量有关,所以我们可以修改light.vs如下:

   //自发射颜色
    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;

      output.color = emissive + ambient + diffuse + specular;

注意L的计算,我们这儿取归一化的光源顶点->光源向量。

程序的最终效果如下,看以看出比前一个工程中的方向光的效果要好一些:

完整的代码请参考:

工程文件myTutorialD3D11_18

代码下载:

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

Directx教程(25) 简单的光照模型(4)的更多相关文章

  1. Directx教程(29) 简单的光照模型(8)

    原文:Directx教程(29) 简单的光照模型(8)      现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...

  2. Directx教程(28) 简单的光照模型(7)

    原文:Directx教程(28) 简单的光照模型(7)        现实生活中的点光源都是随着距离衰减的,比如一个电灯泡在近处会照的很亮,远处光线就很弱.本节中我们在前面光公式的基础上,再给漫反射和 ...

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

    原文:Directx教程(27) 简单的光照模型(6)      从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightCla ...

  4. Directx教程(26) 简单的光照模型(5)

    原文:Directx教程(26) 简单的光照模型(5)     在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中.本章中我们尝试fragment光照(或者说叫ps光照),在 ...

  5. Directx教程(24) 简单的光照模型(3)

    原文:Directx教程(24) 简单的光照模型(3)      在工程myTutorialD3D11_17中,我们重新定义我们的cube顶点法向,每个三角形面的顶点法向都是和这个三角形的面法向是一致 ...

  6. Directx教程(23) 简单的光照模型(2)

    原文:Directx教程(23) 简单的光照模型(2)    在工程myTutorialD3D11_16中,我在文件light.vs中定义了一个材质光源属性常量缓冲. //const buffer最好 ...

  7. Directx教程(22) 简单的光照模型(1)

    原文:Directx教程(22) 简单的光照模型(1)      在前面的教程中,我们在顶点属性中直接给顶点赋颜色,这样生成的三维物体缺乏真实感,如下图中两个立方体,左边的是通过光照生成物体表面颜色的 ...

  8. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  9. [译]Vulkan教程(25)描述符布局和buffer

    [译]Vulkan教程(25)描述符布局和buffer Descriptor layout and buffer 描述符布局和buffer Introduction 入门 We're now able ...

随机推荐

  1. JavaSE_07_Collection接口的List和Set

    1.1 List接口介绍 java.util.List接口继承自Collection接口,是单列集合的一个重要分支 List接口特点: 它是一个元素存取有序的集合.例如,存元素的顺序是1.2.3.那么 ...

  2. 移动相关的css

    1.首先认识第一个apple-mobile-web-app-capable 删除默认的苹果工具栏和菜单栏. <meta name="apple-mobile-web-app-capab ...

  3. HDFS数据读写过程

  4. LINUX使用 su 命令临时切换用户身份

    1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用户没有这个权限,而这个权限恰恰由root ...

  5. Luogu P2679 子串(字符串+dp)

    P2679 子串 题意 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\ ...

  6. 如何将本地项目上传到Git 版本库

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  7. Redis 混合存储最佳实践指南

    Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...

  8. 再也不怕数据丢失!阿里云RDS MySQL 8.0上线回收站功能

    背景 MySQL 在生产环境使用过程中,会伴随着开发和运维人员的误操作,比如 DROP TABLE / DATABASE,这类 DDL 语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0 ...

  9. SpringBoot集成lombook让代码更简洁

    1)添加lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>l ...

  10. java.lang.UnsupportedClassVersionError: com/gargoylesoftware/htmlunit/WebClient : Unsupported major.minor version 52.0 (unable to load class com.gargoylesoftware.htmlunit.WebClient)

    java.lang.UnsupportedClassVersionError: com/gargoylesoftware/htmlunit/WebClient : Unsupported major. ...