OpenGL&D3D State Machine

本文对比分析了OpenGL 1.1版本的状态机与Direct3D 9的图形流水线架构,详细介绍了两者在顶点处理、光照计算、纹理映射等方面的差异,并探讨了这些差异对性能优化的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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.ps

它们是内容相同而格式不同的状态机表达。整个文件中只有一张Postscript的图。这张图实际上就是SGI RealityEngine的硬件程序流程描述。

首先硬件接受应用程序输入的顶点信息,(Color, Normal, Texture, EdgeFlag, Vertex, ),经过世界坐标变换(glTranslate, glRotate, glScale),接着进 行User Clip Plane,之后进入视图变幻和裁减(Projection Matrix),然后视 口变换(ViewPort),经过Primitive Setup,光栅化处理(Flat或Phong)生成 片断Fragment,下面的对每个依次作纹理贴图计算,纹理混合(Texture Blend), 深度测试(Depth Test),模板测试(Stencil测试),透明测试(Alpha Test), 透明混合(Apha Blend),然后写入颜色缓冲区,深度缓冲区,模板缓冲区。

整个流程如下:

  • Application
  • Vertex Information (Material , Normal, Textcoord, EdgeFlag, Vertex Position)
  • Lighting
  • World Matrix Transform
  • User Clip Plane Clipping
  • Projection Matrix Transform and Clip
  • ViewPort
  • Primitive Setup ( point, Line, Triangle)
  • Rasterization( Flat or Phong ) == > Generate Fragment
  • Fragment Texture Addressing () == 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 channel 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 processing pipeline)。

如果我们能够在流水线中减少一个操作,我们就能够获得性能的提高,当然前提是我们能够绘制正确的图像。

典型的D3D9硬件体系结构

上面的OpenGL状态机实际上就是SGI的Reality Engine和其他Direct3D7及其一下 版本的图形硬件流水线结构。下面我向大家介绍D3D9的典型硬件体系结构(或者 说Direct3D9的参考模型)。

  • Application
  • IDirect3DDevice9::DrawIndexedPrimitive
  • D3D Driver (Display Driver ) Send Commands to Hardware by AGP
  • following is hardware Command Interpreter
  • “Fetch” Indexed Primitive data to Vertex Shader Cache (access index buffer and Vertex Buffer)
  • “Put“ Cached data to Vertex Shader Input
  • Vertex Shader do Transform, 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 addressing 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的Input寄存器;
  • OpenGL 1.1的光照计算和几何变换是通过传统的固定流水线(TnL: Transform and Lighting)完成的—fixed function graphics processing(FGP),而D3D9时通过Vertex Shader实现,它比FFGP更为复杂,可以完成更多的功能;
  • OpenGL 1.1的Texture mapping和Texture Blend独立的两个步骤,而D3D9是通过Pixel Shader,PS是可编程的(Programmable Graphics Processing)。

D3D8/D3D9的Vertex Shader和Pixel Shader是两个图形体系结构巨大的进步,当然使得图形程序设计更为灵活,也更为困难和复杂。

对于D3D8/D3D9的硬件体系结构,我们的程序优化工作有多了两个内容,优化Vertex Shader和Pixel Shader。

今天我的重点放在传统图形流水线(TnL)的性能优化上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值