microsoftxiao

记忆 流逝

导航

[部分转载]3D到2D的转换

声明:  大部分来自网络, 版权归全部网络前人所有。

在 DOS下 使用汇编编写图形程序时 我们可以使用 INT 10H的中断调用
来向显示器绘制出图形。 我们那时绘制的是像素点。Pixel

后来TurboC对中断调用进行的封装,编程时常要引入Graphics.h头文件。

再后来出现Windows后,使用GDI, 最后还是通过显示驱动来绘图。

在有了DirectX后,就用DirectX来绘图。


光栅扫描系统
1. CPU中央处理器
2. 视频控制器 video controller 或 显示控制器 display controller

其中,帧缓存可以在系统存储器(内存)的任意位置,视频控制器通过访问帧缓存
来刷新屏幕。


帧缓存也叫刷新缓存 Frame buffer 或 refresh buffer, 这里的帧(frame)
是指整个屏幕范围。

帧缓存有个地址,是在内存里。我们通过不停的向frame buffer中写入数据,
显示控制器就自动的从frame buffer中取数据并显示出来。全部的图形都共享
内存中同一个帧缓存。帧缓存。


常规内存 000000~0A0000 [640KB]
上位内存UM 0A0000~FFFFF [380KB]
高端内存HMA FFFFF~10FFEF [64KB]
扩充内存EMS 1088K~MAX-MEMORY 4MB、8MB、16MB

0A0000~0BFFFF视频内存, 这个地址不是绝对的。但是这个地址说明在DOS下,显卡位了渲染
图形是要从这里取数据的。


三种内存AGP内存,显卡本地内存,系统内存,其中我们都知道显卡本地内存就是显存,系统内存就

是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是

16M,32M为主流的时候,如果你运行一个需要很多纹理的3D程序,那么显存一会就不够用了,那该

咋办呢?只好问系统内存借点用用了!这就是AGP内存的由来,在我们电脑BIOS中有个设置AGP

Aperture的选项,这里就是设置显卡可以使用系统内存的最大允许值,通常是设置为64M。注意,这

里只是说最大允许值,并不是一开机他就把这64M给拿走了,你的256内存就变成192了!而是你的内

存依然还是256M,只是限制显卡最多可以使用64M的系统内存。


随着OpenGL的渲染而改变内容的那一部分图形内存区域叫做帧缓存。

综上所叙述, 就是 显卡 内存 是有连接关系的。 CPU更容易控制内存而不是显存, 绘图指令是

CPU指定显示控制器工作,
则 显示控制器根据CPU的控制到指定的地方去取数据 和 指令, 目前的数据一般是从显存里取,

如果显存里存不下,则
从内存里取, 内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话,可

以放在硬盘里,然后
通过 指令控制显示控制器去取。 知道这些大概的关系了, 我们就要知道 帧缓存 Frame Buffer,

里面存储的东西是一帧
一帧的, 显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话, 则会被丢弃,也就是说是

实时的。这每一帧不管是
保存在内存还是显存里, 都是一个显性的信息, 这每一帧假设是800x600的分辨率, 则保存的是

800x600个像素点,和颜色值。

.显示器刷新率的设置:刷新率即场频,指每秒钟重复绘制画面的次数,以hz为单位。刷新率越高,

画面显示越稳定,闪烁感就越小。一般人的眼睛对于75hz以上的刷新率基本感觉不到闪烁,85hz以

上则完全没有闪烁感,所以vesa国际视频协会将85hz逐行扫描制定为无闪烁标准。普通彩色电视机

的刷新率只有50hz,目前电脑输出到显示器最低的刷新率是60hz,建议大家使用85hz的刷新率。

2.显示器分辨率的设置:分辨率是定义画面解析度的标准,由每桢画面的像素数量决定。以水平显

示的图像个数x水平扫描线数表示,如1024×768,表示一幅图像由1024×768个点组成。分辨率越高

,显示的图像就越清晰,但这并不是说把分辨率设置的越高越好,因为显示器的分辨率最终是由显

像管的尺寸和点距所决定的。建议使用以下分辨率/刷新率:14英寸和15英寸显示器,800×

600/85hz;17英寸显示器,1024×768/85hz;19英寸及19英寸以上显示器,1280×1024/85hz。现在

市场上的名牌显示器基本都能达到上述指标。

3.显示色彩的设置:显示器可以显示无限种颜色,目前普通电脑的显卡可以显示32位真彩、24位真

彩、16位增强色、256色。除256色外,大家可以根据自己的需要在显卡的允许范围之内随意选择。

很多用户有一种错误概念,认为256色是最高级的选项,而实际上正好相反。256色是最低级的选项

,它已不能满足彩色图像的显示需要。16位不是16种颜色,而是2的16次平方(256×256)种颜色,但

256色就是256(2的8次平方)种颜色。所以16位色要比256色丰富得多。

4.视频保护和休眠状态的设置:显示器是电脑设备里淘汰最慢的产品。5年前购买的14英寸彩显现在

也可以使用,但如果谁还使用5年前的cpu、内存和硬盘等,那他一定是个收藏家。显示器的寿命主

要取决于显像管的寿命。世界各大著名的显示器厂商所使用的显像管寿命相差无几,基本都在12000

小时以内。用户的使用方法对显像管寿命有很大影响。所以建议大家设置显示器视保和休眠状态。

一般进入视保时间为几分钟左右,进入休眠时间为10分钟左右。视保状态可以在你暂时不使用电脑

时避免显像管被电子束灼伤。休眠状态可以在你长时间不使用电脑时自动关闭显示器。休眠状态的

显示器只有cpu在工作,能耗只有通常状态下的5%左右,既延长显示器的使用时间又节约电能。

注意以上4项设置都是在微机上进行的,在控制面板的显示器属性选项里进行设置,显示器本身不能

进行以上设置。

所以说, 帧缓存不但要保存像素点的位置,好要保存像素的颜色。当然通过程序控制还可以保存
其他逻辑属性。 但是 像素的位置和颜色是帧缓存主要保存的东西,并且每刷新一次就仍掉一帧,
当然这个也可以通过指令控制,让其没刷新一次就保存一帧。

而为了在2D的屏幕范围内产生3D的效果, 就要使用透视。 还要通过将2D的坐标转换为3D的坐标。
或者说, 将3D的坐标光栅化后进行渲染。那么根据不同的API接口, 其API对3D对象到2D对象
的转换流程是有区别的,但也有相同的部分。

我们主要来看DirectX和OpenGL的3D到2D的转换要经过哪些步骤。

 
[Previous] [Next] Slide 6 of 34



Created: 3 October 2001
Copyright© 2001 by Kurt Akeley and Pat Hanrahan

 

 

 
Microsoft DirectX 9.0 SDK Update (Summer 2003)

Architectural Overview for Direct3D


This is an illustration of the graphics pipeline. The functionality in each of the blocks is introduced below and contains links to more information.

Graphics pipeline diagram

 

For more information about the architecture of the programmable sections of the Microsoft® Direct3D®, see Programmable Vertex Shader Architecture and Programmable Pixel Shader Architecture.



© 2003 Microsoft Corporation. All rights reserved.

上面分别是 OpenGL和DirectX 9 的某代的管线结构。 其中OpenGL说的比较详细, 而DirectX 没有严格按最后光照化来说。
但是都只是参考。更详细的可以参考诸如微软出版的技术内幕等。

在DirectX和OpenGL出现之前, 全部3D到2D的变换都依赖于软件光栅化, 也就是将3D的逻辑空间
变换到最终的仅有像素位置和颜色。我们知道显示世界相对于2D平面来说是3D的世界。
既, 不光在水平和垂直上有位置, 在深度上也有个位置。 3个坐标就可以确定在现实世界
中的一个点。 所以 2D(x,y) 和 3D(x,y,z)间要存在转换关系, 而对3D的坐标变换,包括
局部坐标 模型坐标 世界坐标 透视坐标 屏幕坐标,这一系列的变换就是为了让3D的坐标
最后转化为2D的坐标, 而2D的坐标直接交给帧缓存,则显卡就可以处理了。

另外3D世界的颜色是通过光线和能量的影响而改变的。当然这是从这个角度讲,当然化学变化
也会影响到颜色的变化,而化学变化也是一种能量的反映, 物理变化比如受热,制冷,也是
能量的变化。而光线也是能量变化的一种形式。但是普遍选择的以光线的影响来决定3D世界
物体的颜色, 根据光能传递等, 所以要包括光照的处理。于是将光照信息和像素的颜色信息
的变换叫做光照阶段。 于是整个3D到2D变换的过程就可以粗略的说为  几何变换 + 光照变换
最后就光栅化为了2D帧缓存可以接受的古老形式了。

这是我们在宏观的原理上大概有了个粗略的了解,更细节的关于几何变换 + 光照变换,可以参考
各种图形学的书籍, 这里推荐下《3D游戏编程大师技巧》的第7章和第8章,分别介绍了
几何变换 和 基本光照变换, 当然也可以阅读其他的软件光栅化的引擎及其文档,来了解光
栅化阶段。学习这部分内容的主要好处是,对3D图形编程内的向量 矩阵有了更深刻的认识,
并能 通过这部分的学习来强化对 各种控制的熟练程度, 比如向量 面 法线 矩阵 的关系控制。
通过求它们的关系来达到想要的目的。 当然这是最原始的,

如果想省事则可以使用规划非常好的引擎, 就会将这些原理隐藏掉,而将精力放在更高一层。

posted on 2007-02-09 19:20  龙巢NET刀  阅读(1285)  评论(0)    收藏  举报