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下载地址

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

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

  • 相关阅读:
    springboot对JPA的支持
    Hibernate-什么是orm思想
    利用Struts拦截器完成文件上传功能
    Struts2的CRUD
    struts2的初步认识
    Maven搭建
    java虚拟机
    Map集合
    Set集合(TreeSet)
    Set集合的
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6943236.html
Copyright © 2011-2022 走看看