最近这一个月的闲暇时间在边学习《3D编程大师技巧》边做自己的Soft Renderer,一个月下来总算有了个“基本原型”的样子。主要是在编写图形管线的过程式代码,简单明了为第一个阶段的目标。

今天加入了“透视校正纹理映射”这个必不可少的图形基本特性,计算公式抠自《Real-Time Rendering》2th的第十五章“透视校正插值”一节的引用文章Blinn大拿的《W Pleasure W Fun》。即对UV纹理坐标进行所谓的双曲线插值。。。用起来倒是很简单,大致意思就是:

透视投影变换不是一个仿射变换,它会扭曲投影后的图形,使得原本在eye space呈线性的z值在投影空间不再线性,故而推出直接使用模型属性(UV,顶点颜色等)来进行投影空间的线性插值是错误的。而投影空间z值根据推导对于1/z是线性的,所以只要根据u/z,v/z进行插值就正确了,这就是透视校正纹理映射。

我思考了下,我们在投影变换后的齐次除法这一步,将顶点坐标x,y,z除以w,就能将顶点从投影空间变换到[-1,1]的CVV空间,最终的UDC坐标是线性的。而根据OpenGL透视投影矩阵:

                          

可知,点(x,y,z,1)经变换后为(x1,y1,z1,-z),即w=-z,所以齐次除法似乎也是利用了关于1/z线性这个公式。这完全是我的瞎推测,不对请高手指出。。。

总结起来就是,透视投影变换不是一个仿射变换,而是让变换后的点关于1/z呈线性的变换。

下面是未进行透视校正和进行了校正的两张对比图:

Sponza场景的校正和未校正比较图:

只是使用Blinn大神在1998年给出的这个计算公式的话,是很简单的,几句代码的事。厘清整个理论的数学推导就不那么容易了。。。这也是Blinn大拿之所以称为大师的原因。详细数学推导我这里上传一份文档,是大师的《Jim Blinn’s Corner:Notation,Notation,Notation》,在第十章《W Pleasure W Fun》中。没什么花哨的,跟往常一样。。。大拿行云流水的玩弄着数学公式,展示着数学图表,我这个数学彩笔一如既往的痛不欲生。不过感觉还是比以前好些了,我弄明白了很多基本问题,如什么是线性z,透视投影变换的更多细节等。不要浮躁,我们需要的是端正的在键盘旁摆上一个艹搞本。。用直尺和铅笔模仿大师的思路进行推导。。

Blinn's Corner.pdf

对于Blinn爷爷,高爷爷这样的老学究,感觉一个气质啊,霸气,随性。出书都是无比霸气的封面。。。。。如下(绝对没有黑的意思!):

做Soft Renderer很有趣很有收获,我觉得这是图形程序员都应该锻炼的一关。我这里收集了一些可供参考的大牛前辈(大家通常都活跃于OpenGPU论坛)的软渲作品,真的是各有千秋啊,也让我有了前进的动力。

1.鬼火(Irrlicht)引擎的SoftRenderer和BurningVideo软渲染器.前者是作者自己写的,比较不完善,后者是爱好者加入的,更完善,所以称为"on steroids(打了鸡血的渲染器)"...

2.空明大的软渲染器salviar.
http://www.cppblog.com/lingjingqiu/archive/2009/12/07/102698.html

3.乔捷大的Hybrid3D软渲染器,可惜好像没开源,不能学习精华.
http://www.cnblogs.com/Hybird3D/archive/2013/02/11/Rasterization_in_Hybird3D.html

4.易恺铭大的软渲染器.
http://sr.codeplex.com/

5.姚勇大的软渲染器.
http://www.cnblogs.com/puzzy3d/archive/2008/07/25/1251656.html

5.<<Real-Time Rendering>> + <<3D编程大师技巧>>. 理论与实践的完美结合。。

update:

2013-8-7 :目前已完成Phong逐像素光照模型,光栅化实在已经感觉吃不消了,帧数从Gouraund的10几帧降到了1帧,果然是CPU计算密集型应用啊。。那 些还加入了法线贴图,SSAO等高级效果的软渲,本屌真心给跪了!。。。。现在开始进入第二阶段:性能优化乃至管线优化,重点思考怎么利用多核多线程甚至 SIMD来并行计算,来解决光栅化部分的过高瓶颈问题。

2013-8-19:加入多线程支持(线程池,生产者-消费者模型)。不过貌似加速比为1啊。。。嗯,看来我的多线程有问题。

2013-11-9:加入了法线贴图,效果一下子让我眼前一亮,果然要有法线贴图人生才完整呢。。。。。

终于完全理解了切空间的几何意义:

p = ux * T + uy * B

一言以蔽之,这个等式的几何意义就是把该点的UV(位于texture sapce)在object space线性表示出来~

推广到坐标系,故而TB就是texture space坐标基(1,0)(0,1)在object space的表示,故而MatrixTBN是从texture space变换到object space。

以前总在疑惑,这个切空间为什么可以把uv和position强扯上关系呢,现在明白了,这个地方我们不要用局部的视角(即某点的uv,position)来看待,而要用整体的视角(texture space, object space),这也是矩阵的整体-局部思想的一个体现吧。

切空间的完善计算流程也是值得学习的,鬼火的做法貌似过时了。。。OGRE倒是与时俱进,参考下面两篇文章:

http://www.terathon.com/code/tangent.html

http://www.sssa2000.com/?p=686

                         没有法线贴图

                   开启法线贴图

Soft Renderer的乐趣的更多相关文章

  1. CG&Game资源(转)

    cg教程下载: http://cgpeers.com http://cgpersia.com http://bbs.ideasr.com/forum-328-1.html http://bbs.ide ...

  2. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  3. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

  4. linux內核輸出soft lockup

    創建的內核線程長期佔用cpu,一直內核認為線程soft lockup,如無法獲取自旋鎖等:因此線程可適度調用schdule(),以進行進程的調度:因為kwatchdog的執行級別低,一直得不到執行 [ ...

  5. Ext中renderer用法及参数

    转载处:http://blog.csdn.net/yangxiaojun9238/article/details/8240139 setHeader是设置http恳求的头是MIME 和谈的拓展可以实现 ...

  6. 撤销git reset soft head操作

    一不小心在eclipse的git库中执行了Reset Soft(HEAD ONLY)操作,不料界面中竟然没有找到撤销方法(于是心中五味俱全,经过一番折腾,无果还是回归Git本身),最终通过命令行,很快 ...

  7. QQ表情动图,增加写博客的乐趣

    QQ表情动图,增加写博客的乐趣 body{margin:0px;}

  8. 扩展HT for Web之HTML5表格组件的Renderer和Editor

    在HT for Web提供了一下几种常用的Editor,分别是: slider:拉条 color picker:颜色选择器 enum:枚举类型 boolean:真假编辑器 string:普通的文本编辑 ...

  9. GJM : 【技术干货】给The Lab Renderer for Unity中地形添加阴影

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. 在CENTOS下安装ORACLE 11g(LT项目开发参考)

    前段时间为K3CLOUD项目安装ORACLE服务器,因有同事对LINUX和ORACLE不熟,现整理文档,方便后面维护人员参考 ORACLE的安装 1.首先安装依赖包(新安装的centos需要,现服务器 ...

  2. 25个完美的Opencart模板,让顾客无法抗拒!

    在线开展业务是当前的流行趋势.OpenCart(点击这里下载),作为一个流行的开源PHP电子商务系统,获取OpenCart模板不在像以前那么困难了.OpenCart容易安装,模板支持良好,扩展功能包十 ...

  3. PySpark操作HBase时设置scan参数

    在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...

  4. 20151227感知机(perceptron)

    1 感知机 1.1 感知机定义 感知机是一个二分类的线性分类模型,其生成一个分离超平面将实例的特征向量,输出为+1,-1.导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,从而求得此超平面,该 ...

  5. 《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列

    第四章涉及三种数据存储类型:栈,队列,优先级队列 1.概括:他们比数组和其他数据存储结构更为抽象,主要通过接口对栈,队列和优先级队列进行定义.这些 接口表明通过他们可以完成的操作,而他们的主要实现机制 ...

  6. 我所改造的JSocket适用于任何DELPHI版本

    JSOCKET是异步选择模式的通信控件,简单而强大,传奇的早期版本就是使用它作通信. { ******************************************************* ...

  7. JQ避免出现多次执行一个事件的解决方案

    点击按钮之后会多次执行一个事件的话,就在方法结尾加入如下代码,这样的话事件就可以只执行一次了 //避免出现多次执行事件的问题 event.stopPropagation(); 此外,时间的重复绑定也有 ...

  8. react native listview 一个有用的属性,用作两列布局

    contentContainerStyle:设置listview包裹内容的属性 <ListView contentContainerStyle={{flexDirection:'row',fle ...

  9. Spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  10. Use jQuery to hide a DIV when the user clicks outside of it

    http://stackoverflow.com/questions/1403615/use-jquery-to-hide-a-div-when-the-user-clicks-outside-of- ...