原文: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)的更多相关文章

  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教程(25) 简单的光照模型(4)

    原文:Directx教程(25) 简单的光照模型(4)      在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色.     前面的三个工程,我们都用的是方向光源(directional li ...

  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. ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF ...

随机推荐

  1. 13 个最佳 JavaScript 数据网格库

    13 个最佳 JavaScript 数据网格库   转自:开源中国 www.oschina.net/translate/best-javascript-data-grid-libraries Java ...

  2. 五、Hive-HBase接口表性能分析

    设想: Hbase不支持join,不能做复杂统计类: Hive可以. Hive-hbase接口表岂不两全其美? 用户画像表有300个字段,每天都使用: 1.在业务系统里实时根据uid调取用户的画像信息 ...

  3. 2019-8-31-dotnet-通过-WMI-获取指定进程的输入命令行

    title author date CreateTime categories dotnet 通过 WMI 获取指定进程的输入命令行 lindexi 2019-08-31 16:55:59 +0800 ...

  4. 2018-2-13-解决-vs-出现Error-MC3000-给定编码中的字符无效

    title author date CreateTime categories 解决 vs 出现Error MC3000 给定编码中的字符无效 lindexi 2018-2-13 17:23:3 +0 ...

  5. 解决ios移动端双击页面下移

    ios移动端在双击弹出层的时候会出现页面下移,露出底层页面的现象 解决办法: <!DOCTYPE html> <html> <head> <meta char ...

  6. [Array]628. Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  7. django模块安装环境变量

    django 模块 一 安装: 方法一: (在 JetBrains PyCharm 2017.2 软件的) 设置 (里找到) 项目:python +(添加) (搜索) django Install p ...

  8. swiper 报错 ‘ Can't find variable: Dom7’

    一般报这个错是因为浏览器兼容问题,例如低版本的IE 现在通过npm install swiper 安装的版本都是4.x的 我的解决方法就是安装低版本的swiper, npm install swipe ...

  9. web前端学习(四)JavaScript学习笔记部分(9)-- JavaScript面向对象详解

    1.认识面向对象 1.1.概念 1.一切事物皆是对象 2.对象具有封装和继承特性 3.信息隐藏(类的信息隐藏,包括属性和方法) <!DOCTYPE html> <html lang= ...

  10. php5 常量

    <?php define("GREETING", "Welcome to w3cschool.cn!", true); echo greeting; ?& ...