Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

vo01github/ComputerGraphics

Repository files navigation

学习路线

主要讲的是 Renderer知识 的学习。

知乎文章:如何开始用 C++ 写一个光栅化渲染器?

http://www.zhihu.com/question/24786878

学习顺序

  • 01
    什么版本都不用管 先实现一遍底层的光栅化的3D渲染算法,只用一个画像素的功能,把插值,zbuffer,alpha,阴影,三角形的光栅化,全自己底层实现一遍,之后进阶挑nvidia 的sdk里的例子逐句看,siggraph早期的gpgpu的论文挑自己觉得有趣的去实现,shaderX,gpu gems里头拿感兴趣的实现,我就是这么过来的,后来去了皮克斯做R&D,现在在Weta Digital做R&D

  • 02
    2D部分: 光栅化2D点(就是在二维数组上画点,了解色彩基本原理,并解决影像输出问题)
    光栅化2D直线(布雷森漢姆直線演算法、吴小林直线算法等)
    2D直线的剪切算法(见Line clipping)
    光栅化2D三角形(scan conversion)。避免重复光栅化相邻三角形边界的像素(edge equation)。
    光栅化简单/复杂多边形
    3D部分:
    把顶点从三维世界空间变换至二维屏幕空间,绘画顶点(如银河星系数据),操控摄像机旋转模型。
    在剪切空间进行3D直线的剪切算法,把顶点连线(如各种三维正多面体)光栅化成wire frame模型
    以多边形来定义三维模型。使用画家算法来光栅化那些多边形。
    改为使用深度缓冲。
    实现简单的纹理映射,先做屏幕空间的插值,然后实现简单的perspective-correct texture mapping。
    实现简单的顶点光照,使用顶点颜色插值实现Gouraud shading。
    通过顶点法线插值,实现Phong shading。
    实现其他贴图技术,如mipmapping(也可试Summed area table)、bilinear/trilinear filtering、bump mapping、normal mapping、environment mapping等。

  • 05
    最经典的是《3D游戏编程大师》,不卖弄,纯干货,从零教你写软3D引擎,当然包括光栅化。我的观点一直是,当你迈出第一步,所有的东西都会水到渠成。

推荐书籍

《3D游戏编程大师》
《计算机图形学——几何工具算法详解》

矩阵基础

所谓变换,其实就是空间里从一个点(元素/对象)到另一个点(元素/对象)的跃迁。比如说,拓扑变换,就是在拓扑空间里从一个点到另一个点的跃迁。再比如说,仿射变换,就是在仿射空间里从一个点到另一个点的跃迁。附带说一下,这个仿射空间跟向量空间是亲兄弟。做计算机图形学的朋友都知道,尽管描述一个三维对象只需要三维向量,但所有的计算机图形学变换矩阵都是4 x 4的。说其原因,很多书上都写着"为了使用中方便",这在我看来简直就是企图蒙混过关。真正的原因,是因为在计算机图形学里应用的图形变换,实际上是在仿射空间而不是向量空间中进行的。想想看,在向量空间里相一个向量平行移动以后仍是相同的那个向量,而现实世界等长的两个平行线段当然不能被认为同一个东西,所以计算机图形学的生存空间实际上是仿射空间。而仿射变换的矩阵表示根本就是4 x 4的。又扯远了,有兴趣的读者可以去看《计算机图形学——几何工具算法详解》。

具体问题

因为今天基本上是直接用 D3D 或者 OGL,真正光栅化的部分不了解也不影响使用,所以大部分教材都直接跳过了一大段, 摄像机坐标系如何转换?
三角形如何生成?
CVV边缘如何检测?
四维坐标如何裁剪?
边缘及步长如何计算?
扫描线该如何绘制?
透视纹理映射具体代码该怎么写?
framebuffer zbuffer 到底该怎么用?
z-test 到底是该 test z 还是 w 还是 1/z 还是 1/w ?
这些都没讲。

系列教学文章

图形学基础教程 1〜10
用来复习的时候看好。

http://www.cnblogs.com/luming1979

文章

图形学杂谈

http://blog.csdn.net/zxx43/article/category/5617159

如何写一个软件渲染器?

http://www.skywind.me/blog/archives/1498

如何实现robust和高效的软件光栅化?

https://software.intel.com/en-us/articles/rasterization-on-larrabee

How to write a simple software rasterizer

http://www.cnblogs.com/hust-ruan/archive/2013/03/16/2962077.html

用JavaScript玩转计算机图形学(一)光线追踪入门[Milo Yip博客]

http://www.cnblogs.com/miloyip/archive/2010/03/29/1698953.html

开源光栅化渲染器SALVIA的漫长五年(准·干货)[空明流转-博客]

http://www.cnblogs.com/lingjingqiu/archive/2013/01/13/2858177.html

光栅化
http://www.lxway.com/14496616.htm
2D三角形光栅化算法
http://www.lxway.com/58886441.htm
基本图形的光栅化算法
http://www.lxway.com/92529802.htm
使用Barycentric Coordinates算法进行三角形光栅化
http://blog.atelier39.org/cg/533.html

开源项目

一个opengl的开源实现,代码很清晰,也比较容易懂。我记得它是很多平台上opengl的最初实现。 当时看的时候还不是很复杂的项目,记得还没有硬件加速的部分,或者我特地下了个老版本也说不定。觉得新版本太庞大也可以找老版本看看。

http://www.mesa3d.org/

SoftRenderer v0.2,一个软件渲染器,该项目为学习目的开发。

http://sr.codeplex.com/releases/view/97609

学习论坛

http://www.opengpu.org/bbs/forum.php?mod=forumdisplay&fid=15

About

计算机图形学-学习笔记

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /