编程概念:3D编程概念



3D绘图就是在 2维计算机屏幕上创建 3维幻觉我们为了做到这使用了数学变换进行建模和处理图像
本文将使你熟悉3D算法和概念作为使用Direct3D创建和处理3D世界和对象准备理解3D算法是如何实现将有助于你领悟使用Direct3D API词汇和概念

3D绘图比2D绘图要复杂这是需要理解比显示在屏幕上要多创建 3维图形通常使用商业3维建模软件Software比如3DS/MAX等等

我们可以使用3D绘图算法实时处理各种类似这样模型使你世界中模型更具有真实感这种具有真实感模型由对象、摄像机和光源组成

3D世界中包含3D对象有各种属性我们通过处理这些属性来改变对象

个对象形状由表面定义表面可以被定义成平面或 2次曲面如果你已经看过些轮廓模型你就知道了用于实体对象基本表面

• 每个对象都有纹理定义了表面粗糙/光滑度

• 每个对象都有漫反射和镜面反射反射属性决定了射到对象上光线反射程度漫反射代表对象明亮程度个新干净球要比又旧又脏求具有更高漫反射镜面反射代表了对象看起来辉亮度水晶瓶比木块有更高镜面反射

• 对象有位置在3D空间中由 3个值定义:xyz坐标

• 对象有方位即 3维空间某个方向对方位进行处理效果是对象旋转

• 我们可以小、基本物体组成大物体这个处理被称为组合组合简化了复杂大物体移动比如说个自行车它由两个旋转车轮当车轮旋转时候整个车向前移动车轮旋转和移动相对静态坐标系统(即自行车框架)组合能使我们向前移动坐标系统同时保持把车轮约束在上面;我们无需明确向前移动车轮组合对些复杂移动物体比如说轿车、飞机、动物等等是非常有用

摄像机
为了能看见对象定义了摄像机代表用户对3D世界关联摄像机有个位置和个方向它们定义了观察者在3D世界何处和看到是什么在3D世界里移动摄像机和改变它方向使我们看到其它对象
光源
虽然我们有了对象和摄像机但是我们还是什么都看不见除非把些光线打到对象上我们可以创建区别风格光线通过改变光线照亮程度来改变对象在场景中外观区别光线类型和效果在执行上开销区别

• 环境光对场景中所有对象都提供了固定不变照明所有其它光线在光强度和/或方向上都和的区别

• 点光源是从个点发出反射角度取决于光点和对象位置的间角度

• 平行光同点光源类似但它是从个平面发射出来反射角不变这是平行光无需太多计算但损失了些真实感

• 聚光源正如它名字随着接近对象光线强度产生变化

• 方向光最经常用于模拟太阳光和其它无穷远光源这种光源被看作来自无穷远次它强度不随着接近对象而变化在唯方向上亮度是固定

• 我们可以确定亮度或强度来影响对象被照亮程度聚光源和其它光源有个确定光线从哪里发出方向

• 某些光源强度受距离影响但对环境光来说不是这样它没有位置不是有方向光远通常和场景有无限远距离

• 我们可以创建区别有色光这比白色光要复杂它改变了所照到个对象颜色

裁减
3D绘图有两种重要裁减概念:视区(View Volumes)和可视表面(Visible Surface)视区用于减少被渲染对象数量越靠近摄像机对象就越大细节也越多当远离摄像机时候对象就变小了细节也少当对象非常远时候它可以从视野中消失而没有丢失可被察觉真实感实际上对象总是在个适当距离上被不被察觉地模拟得更简单

在摄像机后面对象能够很好被裁剪;在2D应用超过屏幕 4个边对象被裁剪

在裁剪中使用两种投影种是平行(正交)投影种是透视投影透视投影使用没影点正如它名字所示距离观察者远对象就变小了想象我们要画条铁路在透视投影中两条铁轨在远方汇聚成个点在平行(正交)投影中没有使用没影点透视投影想象观察者在对象无穷远处透视投影产生更真实图像;平行(正交)投影在图像上提供了更精确度量

可视表面检测是通过避免计算渲染不可见对象而加速渲染算法种思路方法它需要计算出哪个对象表面在视区中没有被裁剪以及哪些面远离摄像机

应用考虑
实时地渲染3D场景需要处理大量计算我们要找到些好思路方法来减少计算量而又不至于过于妥协场景真实性

首先我们简化背景依赖于地平线距离我们可以使用2D图像作为背景

我们要考虑明暗处理明暗处理算法使用颜色显示照亮对象周围明暗如果对对象进行明暗处理就要限制场景中颜色数量Direct3D有如下缺省:

· 单色32种色调
· 纹理中16种色调
· 纹理映射中8种区别颜色

如果你使用256色你需要构造个调色板为色调分配些表项另外在明暗处理应用的前你必须限制外形中颜色数量

我们还要讨论下位深:场景中使用内存越多需要被移除内存也越多这种影响不是线性位深越大明暗处理算法就越复杂

表面建模也影响性能大多数表面使用 3角形或其它低阶多边形来构造小区域你也可以使用 2次曲面比如说圆柱体、角锥和球体你塑造几何体越复杂执行渲染时需要计算就越多

小结
随着我们对3D图形编程概述我们可以考虑使用Direct3D开始制作应用Direct3D使我们无须直接地写驱动器就能够访问许多显卡3D硬件加速在本文中提到3D算法可以再显卡中执行和极大地加速应用性能

Tags:  3d编程 3dapi概念描述 3d游戏编程 编程概念

延伸阅读

最新评论

发表评论