检查direct3d8失败是什么

OpenGL Performance Optimization
这篇文章比较长,希望大家能够看完。^_o
OPenGL State Machine
Typical D3D9 Hardware architecture
Le State Change
GL_TRIANGLE_STRIP i tead of GL_TRIANGLES
Texture Loading
Texture Composite
Texture MipMap
Multi Pa vs. Single Pa
Texture Compre ion
Avoid Pixel Operatio
Vertex Array, Di lay List,
Vertex Buffer Object
Advanced Tech: VS and Ps.
Le Operatio for Depth Test, Stencil Test, Alpha Test,
Fast Shadow
MISC: LOD, cull, SwpaBuffers, wglMakeCurrent etc
上一个讲座是关于OpenGL Driver 体系结构,估计大家都有很多疑问,而且我自己又看
了一遍,发现一些问题讲得不够清晰,而且没有交代讲驱动程序体系结构的目的。其主要目
的是,当我们了解了驱动程序的体系结构,我们更好地写出一个OpenGL 应用程序框架结构。
今天我将结合OpenGL 状态机和一个典型的D3D9 硬件体系结构探讨如何对OpenGL 应
用程序的性能进行优化。MSDN 的 OpenGL 帮助也提到了关于性能优化方面的问题,但是
这已经是多年以前的article,而随着图形加速硬件的发展,许多新的技术不断涌现,我们应
该跟上时代发展的步伐。
我今天讲的内容应该是不全面的,希望大家踊跃指正和补充。
1 OpenGL 状态机(State Machine)
OpenGL 状态机的目前只有1.1 版本,也是最经典的,大家可以参考下述链接:
ftp://ftp.sgi.com/opengl/doc/opengl1.1/state.pdf
ftp://ftp.sgi.com/opengl/doc/opengl1.1/state. 它们是内容相同而格式不同的状态机表达。整个文件中只有一张 Postscript 的图。这张
图实际上就是SGI RealityEngine 的硬件程序流程描述。
首先硬件接受应用程序输入的顶点信息,(Color, Normal, Texture, EdgeFlag,Vertex,
经过世界坐标变换(glTra late, glRotate, glScale),接着进行User Clip Plane,之后进入视图
变幻和裁减(Projection
Matrix),然后视口变换(ViewPort),经过Primitive
Setup,光栅化
处理(Flat 或 Phong)生成片断 Fragment,下面的对每个依次作纹理贴图计算,纹理混合
(Texture Blend),深度测试(Depth Test),模板测试(Stencil 测试),透明测试(Alpha Test),
透明混合(Apha Blend),然后写入颜色缓冲区,深度缓冲区,模板缓冲区。整个流程如下:
A lication
Vertex Information (Material , Normal,
Textcoord,
EdgeFlag, Vertex Position)
Lighting
World Matrix Tra form
User Clip Plane Cli ing
Projection Matrix Tra form and Clip
ViewPort
Primitive Setup (
point, Line, Triangle)
Rasterization( Flat or Phong ) == > Generate Fragment
Fragment Texture Addre ing ()
Texture In Video memory
Fragment Texture Blend ( blend Diffuse, Specular and Texture
of Fragment )
Depth Test
== with Depth Buffer
Stencil Test
== with Stencil Buffer
Alpha Test
== with alpha cha el of color buffer
Alpha Blend
== with color buffer
Fragment write to FrameBuffers
我们可以看到OpenGL 每处理一个几何图元,需要经过大量的处理过程。大家应该对这
个图的每个步骤地工作相当清晰。这里有几个概念需要说明。
第一个概念是Fragment,片断或者片元。每一个片断对应屏幕上的一个像素点,它是光
栅化(Rasterization)引擎使用FLAT shading 或
Phong Shading 生成的。Rasterization 引擎产
生的片断包含一下信息:
屏幕坐标;
颜色信息,Diffuse 和Specular;
深度信息和模板信息;
纹理坐标,u,v
第二个概念是纹理混合(Texture
Blend),它是指纹理颜色和片断颜色(Diffuse 和
Specular)合成的方式。就是指glTexEnv 的效果,根据不同的参数决定片断只保留Texel
(纹理元)还是使用Texel(纹理元)和片断的颜色做混合。
第三个概念是透明融合Alpha
Blend。如果一个片断经过深度测试,模板测试和透明测
试,那么它将和缓冲区对应位置的像素作透明融合。
相信大家对OpenGL
状态机有了一定的了解,实际上这也是Direct3D8 以前的图形流水
线的主要参考模型(graphics proce ing pipeline)。
==================================================================
如果我们能够在流水线中减少一个操作,我们就能够获得性能的提高,当然前提是我
们能够绘制正确的图像。
典型的D3D9 硬件体系结构
上面的OpenGL状态机实际上就是SGI 的Reality Engine 和其他Direct3D7 及其一下版本
的图形硬件流水线结构。下面我向大家介绍 D3D9 的典型硬件体系结构(或者说
Direct3D9 的参考模型)。
A lication
IDirect3DDevice9::DrawIndexedPrimitive
Driver (Di lay Driver ) Send Commands to Hardware by AGP
following is hardware
Command Interpreter
“Fetch” Indexed Primitive data to Vertex Shader Cache
(acce index buffer and
Vertex Buffer)
“Put“ Cached data to Vertex Shader I ut
Vertex Shader do Tra form, Light and Vertex Blend
Vertex Shader Output Vertices in Screen coordinate Space,
Screen Pos, Diffuse,
Texture Coord
User Clip plane
Guard band clip
Primitive Setup (Point, Line, Triangle)
Rasterizaiton(flat or Phong)
Pixel Shader (Texture addre ing and texture blend)
Depth Test
Stencil Test
Alpha Test
Alpha Blend
Frame Buffers
我们可以看到D3D9 的流水线和OpenGL 1.1 的流水线有很大的不同。
OpenGL 的顶点数据是通过调用OpenGL
API 一个个的送到流水线的几何变换处理
单元,立即模式(immediate mode),而D3D9 通过
Fetch 和Put 两步工作,从Vertex
Buffer 中读出送入Vertex Sahder 的I ut 寄存器;
1.1 的光照计算和几何变换是通过传统的固定流水线(TnL:
Tra form
Lighting)完成的—fixed
function
graphics
proce ing(FGP),而D3D9 时通过Vertex
Shader 实现,它比FFGP 更为复杂,可以完成更多的功能;
1.1 的Texture
ma ing 和Texture
Blend 独立的两个步骤,而D3D9 是通过
Pixel Shader,PS 是可编程的(Programmable Graphics Proce ing)。
D3D8/D3D9 的Vertex
Shader 和Pixel
Shader 是两个图形体系结构巨大的进步,当然使得图
形程序设计更为灵活,也更为困难和复杂。
对于 D3D8/D3D9 的硬件体系结构,我们的程序优化工作有多了两个内容,优化 Vertex
Shader 和Pixel Shader。
今天我的重点放在传统图形流水线(TnL)的性能优化上。
基本优化方法
减少OpenGL 的状态变化
如果我们应用程序不断地改变OpenGL 的状态,那么驱动程序和AGP 数据传输,图形
硬件的负担会则增加很多。因为每当我们改变一个OpenGL 状态,可能会涉及到硬件的多个
寄存器的数据,那么驱动程序就必须将修改的硬件寄存器通过AGP 总线发送到硬件,占用
大量的CPU 资源和AGP 带宽和硬件命令解释器时间。
Advice1:尽可能将状态相近的图形绘制命令放在一起,减少OpenGL 状态变化。
Advice2:使用状态集合,降低驱动程序的CPU 处理时间,
避免光照计算特别是高光计算(Specular)
Specular 的计算是光照计算中最为耗时的运算之一。Diffuse 计算相对比较普通,一般图
形硬件都会对Diffuse 运算进行优化。
图元类型优化
我们使用的大多数图元类型都是 Triangle。如果我们每次都是用 GL_TRIANGLES,我
们将浪费大量的CPU 时间和AGP 带宽和图形硬件资源。原因如下:
(1)使用GL_TRIANGLES,我们每绘制一个三角形,我们就会发送三个定点的数据,
如果我们使用G:_TRIANGLE_FAN 或者GL_TRIANGLE_STRIP,那么我们可以平均每个三
角形一个顶点。
(2)一般的硬件设计中都开辟一定的Cache 区域,如果使用GL_TRIANGLE,我们将
无法使用图形硬件的Cache,浪费大量的图形硬件TnL 时间。
(3)使用GL_TRIANLGES 将比GL_TRIANGLE_STRIP 多耗费200%的硬件TnL 时间。
根据测试,我三年前在 Geoforce
Geoforce
3 上对 OpenGL 做的测试,
GL_TRIANGLE_STRIP 比GL_TRIANLGES
快100% ~ 200%。
建议:尽可能地使用GL_TRIANGLE_STRIP 替代GL_TRIANGLES。
三角形Stripe 的成熟软件:
http://www.cs.suny .edu/~stripe/
光照条件下使用glMaterial 替代glColor
在光照条件下,如果程序使用 glMaterial,那么驱动程序只加载 Material 属性一遍到硬
件,使用glColor 将使得驱动程序对每个定点加载颜色信息。将会占用更多的CPU 时间
和AGP 带宽。
纹理优化
这方面的话题比较多,所以我把它作为一个独立的话题。
优化纹理加载
初学OpenGL 一个常见的性能优化方面的问题是每次使用一个纹理的时候,都重新
设置纹理参数并且调用glTexImage2D 函数。事实上,OpenGL 对纹理和Di lay List 都
有一个命名机制,glBindTexture,glDeleteTexture,glBindTexture。下面我们比较一下效
方法一:每次使用纹理前调用glTexImage2D,并重新设置纹理参数。那么驱动程序将
不断地调用 IDirectDraw7::CreateSurface 并且将数据从用户内存区拷贝到驱动程序系统
内存区,然后再从系统内存区域复制到video memory。
方法二:使用glTexEnv 和 glTexImage2D 设置当前的纹理参数和纹理内容,,然后
调用glBindTexture,例如5 号纹理;如果需要使用该纹理,再次调用 glBindTexture 函
数,glBindTexture 会把5 号纹理设置为当前的纹理,并且参数上次设置的参数,你可以
根据需要决定是否修改参数。方法二的主要优点在于应用程序仅仅调用glTexImage2D,
从而节省大量的CPU和AGP时间,因为从CPU往video memory复制是最耗时,overhead
is very high。
Advice:
当应用程序需要多个Textures,在调用wglMakeCurrent 成功后,调用glGenTextures
产生命名纹理,并且使用glBindTexture 分别进行纹理绑定;
在wglDeleteContext 之前使用glDeleteTexture将所有的纹理从驱动程序内存和video
memory 释放。
每次需要使用纹理时,再次调用glBindTexture
进一步阅读:
OpenGL Spec & OpenGL manual:
http://www.opengl.org/developers/documentation/ ecs.html
Glut examples:
http://www.opengl.org/developers/documentation/glut.html
尽量使用MipMap 纹理
一般图形硬件都支持 Mipmap,如果应用程序使用 Mipmap,那么图形硬件会根据
当前的片断对应的纹理LOD 计算Texel,这样能够节省大量的纹理元video
memory 寻
址时间,而且图形硬件对纹理元做Cache,mipmap 中尺寸较小的纹理(Level 比较大的)
能够节约大量的计算时间。如果应用程序仅仅提供Level 0 的最大的纹理,那么图形硬
件每次都将使用这个纹理作纹理元计算,不但会浪费大量的计算资源,而且消耗很多的
图形芯片带宽。
Advice:1.
不要使用特别大的纹理. > 256 X 256
2.使用MipMap。
gluBuild*DMipma 能够将非 2^n 的纹理转化带有 MipMa 的标准 OpenGL
纹理。不过gluBuild*DMipMa 不支持压缩纹理的自动Mipmap。
进一步阅读:glu Manual:
ftp://ftp.sgi.com/opengl/doc/opengl1.2/glu1.3.pdf
纹理组合
在游戏或者可视化应用中,我们总是会遇到许多非常小的纹理,一种比较好的办法是我
们把这些纹理组合成一个比较大的纹理,例如 256X256,这样驱动程序在加载纹理的 video
memory 的地址时候,驱动程序仅仅需要加载一次家可以了。这种方法在多个造型软件中也
经常见到,例如人体造型软件Pose,它将一个人的头发,脸,眼睛,等组合为一个纹理。
Advice:
将多个小纹理组合为一个大纹理,然后修改对应三角形定点的纹理坐标,或者使
用glMatrixMode(GL_TEXTURE)对定点的纹理坐标作几何变换。
使用MultiTexture 替代Multi-Pa OpenGL 1.2.1 exte ion: GL_ARB_multitexture
Direct3D7(OpenGL
.2.1)及更高版本支持的显示卡都支持MutliTexture 功能,我们可以充分
利用这个特性做多纹理贴图替代Multi-Pa 。
例如我们希望会绘制一个可乐瓶子,而且这个可乐瓶子需要两层标签,利用 Multi-Pa 我
们可以分三次绘制,
//绘制瓶子的本色,例如绿色,
glMaterial (…) ;
glDisable(GL_BLEND);
glDepthFunc(GL_LEQUAL);
glBegin(GL_TRIANGLE_STRIP);
//Texture
glNormal();
glVertex(); ….
glEnd();
//绘制里面的标签
glDpethFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBindTexture(0,);
glBegin();
glTextCoord();
glVertex();
glEnd();
//绘制第二层标签
glDpethFunc(GL_EQUAL);
glEnable(GL_BLEND);
glBindTexture(1,);
glBegin();
glTextCoord();
glVertex();
glEnd();
如果使用MutliTexture(OpenGL.2.1 扩展),我们只需要Single Pa 完成这项工作:
glMaterial();
glDepthFunc(GL_LEQUAL);
glDisable(GL_BLEND);
glActiveTExtureARB(GL_TEXTURE0_ARB);
glTexEnv(,,GL_MODULATE);
glBindTExture(0);
glActiveTExtureARB(GL_TEXTURE1_ARB);
glTexEnv(,,GL_MODULATE);
glBindTExture(1);
glBegin(GL_TRIANGLE_STRIP);
glNormal();
glMultiTexCoord2fARB (GL_TEXTURE0_ARB,u0,
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, u1,
glVertex();
glEnd();
Mutlitexture 的方法将比第一种方法节约流水线的4 个运算步骤,Depth Test,Alpha Test,
Alpha Blend,和
write to frame Buffers。
Advice:检查OpenGL exte ion 支持,尽可能使用MultiTexture。
进一步阅读:
OpenGL ecs:
http://www.opengl.org/developers/documentation/ ecs.html
OpenGL exte ion Registry:
http://o .sgi.com/projects/ogl-sample/registry
使用压缩纹理
OpenGL 支持的压缩纹理包括:
GL_COMPRESSED_RGB_S3TC_DXT1_EXT
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
压缩纹理比非压缩纹理具有更快的运算速度和更小的存储空间要求,而且很容易使用图
形硬Onward, through the Fog!
随笔-33 文章-0 评论-13 转载自 感谢
from 以我现在的水平观之
图形学分
大块的学习内容
空间几何数学
空间几何变换
加速算法
多边形技术
曲线和曲面
相交测试
碰撞测试。 b.
光照着色系统
纹理贴图
高级象素着色光照
艺术性渲染
程序技术性应用
公告板
天空盒
体绘制
材质系统
场景图
渲染队列
在实际学习过程中
个部分相互制约
故不能单方面突进
应保持一种平衡发展
使得相互促进
深化理解
达到比较流畅的学习曲线
相对重要性以
时间将无情淘汰现有的程序技术性应用
深刻掌握图形学基础才是王道。
个部分都略有小成后
大量快速阅读网上各方面的杂家资料
应用基础知识去分析理解
在短时间内掌握各种程序性技巧。
再次通观全局基础
遍览所有细节
以图有更深的理解
最近很多人在问,我该如何学习
?我学完了
了,该怎么用?我想在回答这些类似的问题以前先和大家谈谈怎么学习
的方法,或许谈完了,我就不需要回答了。  首先,我认为
是工具,不是本质,
OpenGL/Direct3D
的本质是图形学
而不是
OpenGL/Direct3D
的本身
的本身只是一些
Interface
如果你明白图形学的原理
那么你很容易这些接口的作用
以及为什么要有这些接口的存在
我要说的第一点是
你要学习
不是学会了
OpenGL/Direct3D
就可以了。甚至会不会这些
都不是那么的重要
虽然这么说
或许很多人不太赞同
最重要的
最根本的是
你要明白这些
背后的图形学的原理
因为那才是根本中的根本
. 下面我来介绍我对
学习的看法
. 我认为
的学习有两种方法
一是正向学习
二是反向学习
正向学习
所谓的正向学习
就是学习
的本身
我觉得这种方法是一种
Brute Force
不是很好
我们只要看看
的特性
有那些部分
就可以了。比如学习
Direct3D
的时候
我们要知道它如何初始化
以及它和
的结合
Direct3D8
里引入了
最后就是创建一个
Direct3D
应用的步骤和方法
这些就足够了。要不然
.Direct3D
那么多的函数
一个几十个参数。每一个都会要了我的命
. 正向学习的第二个作用就是你在熟悉了图形学和大概了解了
有空就来看看
的细节
然后思索一下
里提供的一些特性对你的程序有什么作用
Direct3D
Two Side Stencil.OpenGL
TextureCombine
等。 二
逆向学习
这是根本的方法
到了这一步
你就可以真正的算是图形学入门了。这要求你要有一定的图形学基础
你现在开始做一个
你预计你的
里有一堆眩眩的效果
当然你也要明白你的这些眩眩的效果要怎么实现的
然后你去找
里对应的功能
我想如果你的想法正常
一般的功能在
Direct3D/OpenGL
里应该都会有的
当然你也会碰到你想要的功能在这些
里没有
但是这不重要
重要的是你又学到新东西了
这个特性在
里不支持
^_^. 通常我是采用先正向
再逆向
同时再进行正向学习的方法
希望以上的建议
对各位初学者有一定的帮助
. 关于计算机图形学的学习
注意:
本文尽量避免理论化的描述,试图用最通俗的语言介绍一下计算机图形学的学习,以及一些参考书目和网络资源;
本文不涉及对概念的定义,以免陷入学术讨论之中
本文是作者学习计算机图形学的体会,如果有不同的意见,请不要攻击和漫骂
本文合适的题目应当是
白话说学计算机图形学?
. 引言
什么是计算机图形学? 本文尽量避免给它做严格的定义,但是通常来说,计算机图形学是数字图象处理的逆过程,这只是一个不确切的定义,后面我们会看到,实际上,计算机图形学、数字图象处理和计算机视觉在很多地方的区别不是非常清晰的,很多概念是相通的。
计算机图形学是用计算机来画东西的学科,数字图象处理是把外界获得的图象用计算机进行处理的学科。在法国,图形图象是一门课程。
如何学习计算机图形学呢?除了计算机图形学的基础知识以外,你还需要有以下的知识,你懂的越多,当然做的越好。
* 英语, 你一定要把英语学好,如果你想学习计算机图形学的话,尽量看英文的书籍和资料
* 数学, 计算机图形学里面的数学用的比较多,,我们可以列举一些常用的:
高等数学,数值分析,微分几何,拓扑,概率, 插值理论,(偏)微分方程
&helli * 物理, 如果你要进行基于物理的建模,一些物理理论是要学习的:
力学(运动学,动力学,流体力学
&helli ),光学,有限元
&helli * 编程语言: C
是计算机图形学最通用的
普通话
* 数据结构: 你需要数据结构来描述你的图形对象,除了通用的链表、树等数据结构外,图形学还有自己特殊的数据结构
* 其他类别: 有的时候你需要其他学科的知识,根据你的需要去学习吧
上面列举的不是你必须学习的东西,而是计算机图形学可能会用到的东西,一定要记住,不要指望通过一本教材就学会计算机图形学,它比你想象的要复杂的多。
. 图形学的问题
每个学科都有自己学科的特定问题,图形学要解决的是如何画出图来,得到需要的效果,当然这是图形学最大的一个问题。
在开始学习计算机图形学的时候,找一本简单的书看,对计算机图形学有个大概的认识,你就可以开始图形学之旅了:
OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versio 1.4, Fourth Edition
OpenGL SuperBible (3rd Edition) 是比较好的学习计算机图形学的入门教材,在练中去学,一开始就去啃
Computer Graphics: Principle and Practice, Second Editio i C 不是好主意,会看的一头雾水,一本什么都讲的书的结果往往是什么都没讲清楚。
当你把
的基本内容掌握之后,你对图形学就有了大概的了解了
那么下面你可以来学习一下计算机图形学的数据结构和算法,下面的书比较适合
Joseph O'Rourke 的
Computational Geometry i C
,书里面有
的源代码,讲述简单,清晰,适合程序员学习
总的来说,计算机图形学涉及到
大部分:建模和渲染
你想画一个东西,首先要有它的几何模型,那么这个几何模型从什么地方来呢?下面的书很不错的:
Gerald Fari 的
Curve and Surface for CAGD: A Practical Guide
这本书就有一点的难度了,呵呵,要努力看啊
这本书算是
计算机辅助几何设计
的经典图书,
方面的全貌,还有
本很好的讲述曲面的书
Nur 的书
Le A. Piegl, Wayne Tiller 的
The Nur Book 书里面有
曲线、曲面的程序伪代码,很容易改成
的,书讲的通俗、易懂,但是你要有耐心看的:)
曲线与曲面的数学
这本书是法国人写的中文翻译版,里面还有
本人写的序
,翻译的很不错的,看了你就掌握
曲面技术了
另外一些你想知道的事情:其他的造型方式
注意:在后面会有这样的章节,标明
另外一些你想知道的事情:其他的造型方式
另外一些你想知道的事情:其他的造型方式
里面是我认为的一些高级话题,跳过他们不影响你学习计算机图形学,但是要学好就要注意了,呵呵
还有其他的一些造型技术,比如:
隐式曲面
(Implicit Surface)
的造型:
就是用函数形式为
F( x ,y ,z ) = 0
的曲面进行造型,这样的造型技术适合描述动物***一样的肉乎乎的东西,有
本书推荐大家
Jule Bloomenthal
编辑的
Introductio to Implicit Surfaces
,是一本专著,讲述了
Implicit Surface
建模型
(Modeling)
,面片化
(Polygonization)
,渲染
(Rendering)
的问题
Luiz Velho 的 Implicit Object Computer Graphic 也是一本专著,讲述个更新的一些进展
细分曲面(
Subdivisio Surface
)造型
做造型的时候,曲面拼接是复杂的问题,在动画的时候,可能产生撕裂或者褶皱,
Subdivisio Surface
用来解决这个问题
Joe Warren
Subdivisio Method for Geometric Design: A Co tructive A roach
就是这方面的专著
从实际物体中得到造型,现在的技术可以用三维扫描仪得到物体表面的点,然后根据这些点把物体的表面计算出来,称为重建
(Reco truction)
,因为这些技术之在文章中论述,所以我们省略对它的描述
另外一些你想知道的事情:其他的造型方式
下面还是一个高级话题:)
另外一些你想知道的事情:光有造型是不够的!
在你的几何模型做好之后,有一些问题需要对这个模型进一步处理,得到适合的模型,当面片很多的时候,或者模型很复杂的时候,需要对几何模型进行简化,才可以满足一些实时绘制的需要,这个技术叫做层次细节(
LOD-Level of Detail
)。下面的书就是讲这个的:
David Luebke
编著的 Level of Detail for 3D Graphics
另外一些你想知道的事情:光有造型是不够的!
有了模型,怎么把这个几何模型画出来呢?这个步骤就是渲染啦
如果你看了上面的
的书,那么你就知道一些渲染的知识了,但是别高兴的太早,
使用的是局部光照模型(
Local Illuminatio Model
),不要被这个词吓住了
Local illuminatio Model
指的是在做渲染的时候只考虑光源和物体之间的相互作用,不考虑物体和物体之间的影响,所以
不支持阴影,一个(半)透明物体的效果
,这些需要考虑物体之间的影响才可以实现。
另外一些你想知道的事情:
可以实现阴影
本身不支持,但是通过一些方法可以实现的:),用
搜索一下
Shadow Volume, OpenGL
就找到***啦
另外一些你想知道的事情:
可以实现阴影
Global Illuminatio Model 这类模型考虑的就比较全啦。现在关于
Global Illumination
的技术有
大类,具体的技术就不在这里介绍了,如果想了解,可以联系我,大家一起讨论:
光线追踪
(Ray Tracing)
Ray Tracing
的好书有
Andrew Gla er 的
A Introductio to Ray tracing Gla er
是图形界的名人,这本书也是
Ray Tracing
的经典
R. Keith Morley, Peter Shirley 的
Realistic Ray Tracing, Second Edition
这本书第一版是伪代码,第二版是
代码。它的结构不是很清楚,虎头蛇尾的感觉。
辐射度
(Radiosity)
Radiosity
的好书有
Michael Cohe 的
Radiosity and Realistic Image Synthesi , Cohen
SIGGRAPH 1998
计算机图形学成就奖,他把
Radiosity
变成实际可用,现在
Francoi X. Sillion
Radiosity and Global Illuminatio , Sillion
是法国人,他的主要研究方向是
Radiosity
,这本书写的很不错的,非常清晰
Phili Dutre 的新书
Advanced Global Illuminatio ,看起来还不错,刚拿到手,还没看,呵呵,所以不好评价
Ia Ashdown
Radiosity: A Programmer' Per ective 有源代码的书啊!! 就凭这个,得给
Photo ma ing
这个我也不知道怎么翻译,呵呵。这个技术出现的比较晚,一本好书!
Henrik Wa Je en
Realistic Image Synthesi Using Photo Ma ing
Henrik Wa Je en
Photo ma ing
技术的发明者
这些也是图形学吗? 图形和图象的区别模糊了:(
除了上面讲的
的计算机图形学,还有下面的一些东西,它们也叫计算机图形学吗?是的!!!
非真实性图形学(
Non-Photorealistic Graphics
真实性不是计算机图形学的唯一要求,比如:你给我画一个卡通效果的图出来,或者我要用计算机画水彩画怎么办?或者:把图象用文字拼出来怎么做?,解决这些问题要用到非真实性图形学, 好书继续推荐!!!
Bruce Gooch, Amy Ashurst Gooch
的 Non-Photorealistic Rendering 3.3.2
体图形学
(Volume Graphics)
机做很多切片(比如头骨),那么能通过这些切片得到
的头骨吗?
Volume Graphics
就是解决这样的问题的
Mi Che 编著的
Volume Graphic 上面的
个图形学技术就和图象的界限不明显了,实际上他们是图形图象的综合
还有其他的书吗?
还有一些好书啊,呵呵,好书看不完的:),继续放送:
Graphic Gem I ~ V
,一大帮子人写的书,包括研究人员,程序员
&helli 有计算机图形学的各种数据结构,编程技巧
Toma Akenine-Moller 等人编著的
Real-Time Rendering (2nd Edition) 许多最新的计算机图形学进展
David Ebert
等人的
Texturing am Modeling: A Procedural A roach, Third Editio 讲述如何通过程序实现纹理、山、地形等图形学要素
F. Kento Musgrave
号称分形狂
(Fractal Mania)
Ke Perlin
噪声的发明者,用过
软件的人对
Perli Noise
不会陌生的
关于图形学的特定对象,有特定的专题图书,
Eva Pipho Focu O 3D Models,
对于图形学的常用模型格式,进行了讲解
Trent Polack
的 Focu O 3D Terrai Programming ,讲地形的
Donald H. House 的
Cloth Modeling and Animatio ,讲布料的
Nik Lever
Real-time 3D Character Animatio with Visual C++ ,讲角色动画的
&helli helli 还有:)
Richard Parent
的 Computer Animation: Algorithm and Techniques
,当然是讲动画的啦,呵呵。
David H. Eberly
3D Game Engine Desig : A Practical A roach to Real-Time Computer Graphic ,有代码的啊!呵呵:)
最后,没事情的时候,看看下面的书吧
Ala H. Watt
, 3D Computer Graphic (3rd Edition) Jame D. Foley
等人的 Computer Graphics: Principle and Practice i C (2nd Edition) ,这本圣经没事的时候再看吧,呵呵
累了:( 不说了,上面的书差不多了,还有一些
的书,我不了解,以后会补上的:)
从哪里找到这些书啊?还有什么资源啊?
我保证,上面的书在
www.amazon.com 都可以买到:) 别打我
那好,大部分的书在国家图书馆可以复印到,北京的兄弟有福啦,
年前的书借出来复印,
页,但是新书要早图书馆里复印,
页,还是比
便宜啊,呵呵。
不行大家就到国外买,合买吧,还负担的起。
DirectX
不了解,所以没有涉及关于
DirectX
的内容:) 【重剑注:
clayman
写的这个很赞】 与玩游戏相比
写游戏要复杂上千万倍
除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。 首先你要精通一门高级语言,比如
,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为你遇到的大部分资源都将是英文的,不要总等着别人为你翻译。慢慢尝试着阅读英文资料,你会发现其实也并没有那么难
:) 刚开始,你要做的就是选择一门图形
,一般就是
DirectX
之间选一个。如果考虑到跨平台,那么
是首选
如果只在
的平台,则
是首选。我对
并不是很了解,所以下面大部门资料都是和
相关的。 当然,作为准备工作之一,你首先要到
DirectX Develop Center
下载最新版的
DirectX SDK
。 入门书籍非常重要,推荐
Introduction to 3D Game Programming with DirectX 9.0
(好像去年出了中文版)也就是传说中的龙书,这可以说是最好的
入门教材,
Frank Luna
从浅入深,讨论了
的方方面面。另外再配上
Advanced 3D Game Programming With DirectX 9.0
,书名虽然是
advanced
,但实际上没有多少
advanced
级别的内容。看完这两本书,你基本上已经对
DirectX
比较熟悉了。如果你希望学习
,也是一样的,毕竟
为基础。 不要一开始就看图形学的书,这个时候你对图形编程还没有一个基本的感性认识,因此八成看的云里雾里。不要以网上的教程和论坛提问作为主要学习途径,找一本好书,系统学习,效率才最高。不要马上看
里的例子,很多图形学的基本原理仅仅通过读代码是不会明白的。某些年代太过久远的书就不要看了,比如《
windows
游戏编程大师技巧》(总看到有人在找这本书)。有人说基本的思想总是不变的,可惜对于现代
来说,很多早期的技术和优化技巧早就过时了。图形编程是发展的非常快的技术,看看
的发展速度,
年就是一代产品的革新。 好了,入门之后,是你巩固和拓展视野的阶段。现在看计算机图形学就比较合适了。吐血推荐
Real-Time-Rendering,z
这本书算得上是所有图形程序员的必读书籍和参考手册了。最近刚出了第三版。可惜国内只有第二版,稍微有点老,如果实在找不到第三版,还是值得一读。国内其他所有以图形学命名的书都有一个共同点:枯燥,过时。只需看看其中二维三维变换和曲线曲面表示的部分即可。如果这个时候发现你当年数学没有学好,那么有三本数学书是为游戏程序员量身定制的:
3D Math Primer for Graphics and Game Development
Mathematics for 3D Game Programming and Computer Graphics
E ential Mathematics Guide 2nd Edition
,第一本书有中文版,最后一本则是
年才出的新书。 其实入门之后,就没有固定的学习路线了,最好根据你感兴趣的方向来学习。
方面:《
Cg_tutorial
》和《
The Complete Effect and HLSL Guide
》都是不错的入门材料,当然还有
文档。
Shaders for Game Programmers and Artists
有大量入门的例子。
Advanced Lighting And Materials With Shaders
详细介绍了各种光照模型和技术。
GPU Gem gt gt; 1~3
册肯定是必读的,虽然有
有中文版,但某些翻译并不是很理想,强烈建议直接看英文版。
ShaderX
系列也是很经典的系列,每年出版一本,包含了最新的实时渲染技术,如今已经出了第
册了。不过网络上只能找到
册大部分
都是用
写的,不过看懂原理,转换为
也并不难。另外
Nvidia SDK
ATI SDK
也是学习
的重要资源。最后还有刚出的
Programming Vertex, Geometry, and Pixel Shaders
地形:
Real Time 3D Terrain Engines Using C++ And DX9
非常全面的讨论了关于地形渲染的各种技术,至少应该把第
章都浏览一遍。之后便可以
virtual terrain
查阅近期的地形渲染技术。
模型导入和动画:
Advanced Animation with DirectX
,仅此一本足以。
物理:
Game Physic gt gt;
Game Physics Engine Development
都不错。
Real-time Collision Detectio gt gt;
是碰撞检测方面最好的书,可惜目前还没有电子版。
Level of Detail for 3D Graphic gt gt;
Ray tracing: Physical-Based Rendering - From Theory to Implementatio gt gt;
引擎设计:说实话,这方面还没有特别好的书,大概越是核心的内容,越少有人愿意写吧。
3D Game Engine Architecture Engineering Real-Time A licatio with Wild Magic
只有第三章值得一读。
3D Game Engine Programming
可以选部分感兴趣的章节看看,不过总的来说,讲的比较浅。
Programming Game AI by Example
非常不错,好像还有中文版,备选
Artificial Intelligence for Game gt gt;
。当然
AI Programming Wisdom
系列也是必读作品,不过目前网络上只有
网络:
(本人是网络白痴
+_+........)
综合:
Game Programming Gem gt gt;
系列,不过由于内容涉及的过于广泛,文章质量参差不齐,选择性阅读就可以了。历年
GDC, Gamefest t,Siggraph
等大型会议的
也是应该关注的。 至于那些
All in one
天较你写出个
游戏的书就不要读了,这类书的通病是什么都说了,结果什么也没说清楚。 除了书以外,再推荐一些不错的网络资源:
除了大量教程以外,论坛里多年累计下来的内容保罗万象。好好利用论坛搜索,你会发不管你多厉害,那里总有一些比你强大的人在很久以前就遇到了和你同样的问题,并且给出了解决方案。
的开发者中心
creators.xna.com XNA
官方网站
GameDev
这里的除了讨论软件以外,还能看到对硬件构架的分析
最好的
教程网站
国内唯一比较专业的游戏编程网站,可惜和
GameDev
相比就显得太寒碜了
-_-# 当然,不要忘了收集各大论坛里牛人们的
:) 最后,仅仅靠看书是不够的,多写多练才是王道。
temp_ an
绿色通道:
posted @ 2009-11-09 12:56
阅读(1026)
发表评论
2073632
  2011-04-17 21:47 |
蒋哥大驾光临,赶快闪到接驾。
哈哈。
你写的东西很深啊。。。 发表评论 昵称:
主页:
邮箱:
(仅博主可见)
验证码:
评论内容: [使用Ctrl+Enter键快速提交评论]
1598954
S1Iq2Zztec0=
最新IT新闻
最新知识库文章
简洁版式:
网站导航:
昵称:
园龄:
粉丝:
关注:
2009年11月
常用链接
随笔分类
随笔档案
图形学
最新评论
;)好书太多,时间总是不够... (nickolas)
跟我的计划基本差不太多啊...
顶 (mavaL)
感谢分享 (田 田)
@zdd引用zdd:引用nickolas:@zdd我的代码只用了一个线程渲染,其他线程只是修改场景结构。我感觉这样不会有大的问题,查到一些资料说DX会缓冲几帧的指令,并对其进行优化,我猜测其中某个操作... (nickolas)
引用nickolas:@zdd我的代码只用了一个线程渲染,其他线程只是修改场景结构。我感觉这样不会有大的问题,查到一些资料说DX会缓冲几帧的指令,并对其进行优化,我猜测其中某个操作失败造成的。失败只是... (zdd)
评论排行榜
Copyright 2011 nickolas信息提示
您的同一ip请求过于频繁,如果希望继续访问,请输入验证码:
Copyright 1998 – 2010 Tencent. All Rights Reserved.

参考资料