zoukankan      html  css  js  c++  java
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

            这一章讲的是光照。光照(lighting)是Direct3D中很重要的概念。而与之相相应的是材质(material)的概念。假设没有材质的话。那么光照的作用也无法体现。

            在较早一些的关于DirectX 9的编程入门书籍里。通常是使用D3DLIGHT9结构体来建立一个光源。而用D3DMATERIAL9结构体来定义物体的材质。

    我们要做的就是一些非常琐碎的家务活。基本上就是创建这些结构体对象、设定当中的參数、启用光照之类的。至于详细实现的细节就非吾等所需(和所能)担心的了。

            只是在我们的“龙书”第二版中,我们是使用shader方法来进行光照处理的。

    这意味着这样两点内容:

    1、  这里面不会出现D3DLIGHT9和D3DMATERIAL9这两个结构体。相反,我们将使用自己的变量或者结构体来实现D3DLIGHT9以及D3DMATERIAL9的功能。

    2、  我们必须考虑实现光照的细节了。这意味着我们必须好好理解书上的理论知识,然后将公式用代码表示。只是从实际角度出发,我们仅仅须要把经常使用的关于光照处理的.fx文件保存好、以供以后随时查阅就OK 了。

            另外这也让我们可以发挥自己的创造性了:比方说,后面我们会发现。至少有两种不同的实现镜面反射的方法。

    另外。另一些特殊的渲染效果可以通过shader方法来实现,比方说卡通渲染风格。

       

            以下就进入习题解说部分吧!

            这一章的习题还是很有意思的,也是我自我感觉很惬意的一次。

    习题1部分:

    ===============================================================================

            这一道题引入了还有一种实现镜面反射的方面,我称之为halfway方法。由于它使用的是一个halfway向量。这种方法个人感觉非常好,在外部环境(模型)全部的參数保持不变的情况下。似乎这样的方法居然让模型变得更光滑了!

            闲话少说。我们来看看效果吧!这是书上讲过的经典方法的效果:


            而这个是halfway方法的效果:



            能够看出来,halfway方法的效果更加细腻了,光线不再刺眼了!

    为了方便,我设置了一个切换功能,仅仅要按下数字键1或者2。就能够在两种镜面反射方法之间进行切换,从而直观地观察到效果。

             当然, 我不会忘了给你们代码的:

    习题1代码

    ===============================================================================


    习题2部分:

    ===============================================================================

            这一道题又引入了一个令人兴奋的话题:卡通风格渲染!当然。这里可以做到的非常少。真实的卡通风格渲染不会这么简单。要实现那种轮廓分明、明暗变化快、纯色为主的卡通风格渲染,我们要做的事情还有非常多(并且本人还没有学会)。只是这里的函数貌似有点问题。而我订购的实体书一直没来货。所以我仅仅好将就将就了。

            另外我好奇的是这个函数到底怎么使用。我的理解是将它作为终于像素的一个放缩因子使用的,不知道你们意下怎样?

            无论怎么样。还是看看效果吧!


            以下的代码的下载地址:

    习题2下载地址

    ===============================================================================


    习题3部分:

    ===============================================================================

            这一道题非常easy。让我们将书上的一个程序略微进行变动,使得光源运动起来。这道题没什么可说的。

            以下是代码的下载地址:

    习题3下载地址

    ===============================================================================



    习题4部分:

    ===============================================================================

            这一道题有点意思,让我们在场景中同一时候设置两个光源。本来我以为这个非常easy的, 可是我弄了一天的时间才弄好。摸爬滚打,最后发现最基本的错误还是在更新了technique后忘了进行设置了。

            只是如今的代码我认为仍然有点缺陷,就是为了好玩,我让使用者可以在三种模式之下进行切换:按0键是启用第一个光源。按1键是启用第二个光源,而按2键则是同一时候启用两个光源。然后我发现。要实现这种效果。好像必须写3个techniques,分别相应这三种情况。我认为这有点浪费了。只是也没有想到更好的解决的方法。

    不知道读者有没有谁可以提出更好的解决方式呢?

            以下是程序执行时的截图:


            仍然是代码的下载地址:

    习题4下载地址

    ===============================================================================

    习题5部分:

    ===============================================================================

            这一道题非常easy,事实上书上最后一节已经把方法都告诉你了。

    我这里就不贴图了。以下把地址送上:

    习题5下载地址

            补充:尽管和第1题中的halfway方法一样都是让高亮部分更加柔和了,可是二者的差别还是蛮大的。


    ===============================================================================


    习题6部分:

    ===============================================================================

            这一道题说难不难。说简单也不简单。关键看你有没有学过微积分了。

    学过的话一切都好说。

    无论怎么样,我已经比較轻松地实现了这个程序,效果还不错。

            另外,为了让这个程序更加好玩。同一时候也为了更加方便地看到光与材质的相互作用,我增添了“调节光色”的功能:在程序执行时按住数字键1(2、3)。同一时候按空格键/左Control键就能够对红色(绿色、蓝色)成分的取值进行上调/下调了!

    效果非常炫啊,有木有。以下放几张截图:

     





            最后是代码的下载地址:

    习题答案6下载地址

    ===============================================================================

            好啦,这一期就到此结束啦!

  • 相关阅读:
    Zend Framework 2.1.5 中根据服务器的环境配置调用数据库等的不同配置
    在基于 Eclipse 的 IDE 中安装和使用 Emmet(ZenCoding)
    【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet
    【翻译】Emmet(Zen Coding)官方文档 之二 缩写
    【翻译】Emmet(Zen Coding)官方文档 之七 一览表
    【翻译】Emmet(Zen Coding)官方文档 之三 CSS 缩写
    【翻译】Emmet(Zen Coding)官方文档 之四 动作
    【翻译】Emmet(Zen Coding)官方文档 之一 web 编程的必备工具
    Zend Framework 2 时区设置警告问题的解决
    【翻译】Emmet (Zen Coding) 元素类型
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6943236.html
Copyright © 2011-2022 走看看