1.C# 开发三维:一种是通过DriectX直接操作(需要或者不需要安装 SDK),二种:利用第三方库:如heilx toolkit,sharpDX,三种:用openGL
2.C++开发的话需要配置环境:
3.GDI+和DX对比
原理对比:
GDI和DX在原理和框架设计上是完全不同的,有几个重要的方面决定了它们是没法结合。
1.现代的2D库(包括GDI)都基于画布来操作,或者叫位图区域,而3D库的操作对象只是场景和3D物体,没有画布概念,你在显示器上看到的只是渲染流水线中的最后一个环节(光栅化)而已。
2.计算单元的设计理念不同。CPU是通用指令,能干所有事,包括3D运算,只是效率低而已;GPU只有有限的专用指令,它的目的是通过并行方式执行大量的重复运算,且浮点运算是强项,在像素运算效率上比CPU高几个数量级,但它并不通用。
3.动态计算。2D运算中有大量的文字字型生成、图像特效计算过程,这些动态计算只能由CPU承担,硬件能加速的部分只局限于图像的混合,换句话说,只有静态图像数据才能硬件加速。MMX指令虽然能起到加速作用,但性能提升幅度相比GPU来说简直不值一提。
4.内存。GPU运算只能在显存中进行,CPU运算只能在系统内存中进行,当两种内存的数据需要互相传输时,内存间的IO次数和传输量必须严格控制,过大的数据吞吐将严重影响硬件加速性能。对于3D应用来说,CPU的功能通常是构造并传递流水线指令、加载各种静态图片(纹理)、响应键盘鼠标游戏外设消息,这里面数据吞吐量最大的就是图片,游戏中通常在关口开始阶段就把所有纹理一次性加载到显存,而且在运行过程中很少或者几乎没有动态计算过程(比如文字处理)。
原文:https://blog.csdn.net/qq_23018459/article/details/80001662
4.模型是绘制出来的
5.交换链:让画面平滑的过渡,由多个表面组成,每个表面都是用于存储2D图形数据的一个线性数组(个人理解,就是一个帧),这些数组放在缓存里面
6.顶点缓存:用来保存顶点数据的内存空间,一般位于内存或者显存里面
7.索引缓存:用于描述物体模型的组成结构,提高图形程序整体性能,(通过索引去除重复的点)
8.渲染状态:用于控制着色算法,雾化属性,光照和材质等 209种(剔除状态-背面消隐)(着色状态-平面着色,高洛德着色)(填充状态--点,线框,面)
9.左右手坐标系统,再Dx中用的左手系统
10.多坐标系统(世界坐标系-(建立一个描述其他坐标系统所需要的参考框架,以便指定物体在该坐标系统中的位置,方向和大小)(局部坐标系--(用于描述自身属性的独立坐标系统) (观察坐标系统--就是字面意思)))
11.用户不能够改变观察图形的视角方向,默认的观察方向是世界坐标系的Z轴的正方向,也就是垂直于屏幕的方向。
12.空间坐标变换:(得到变换矩阵,然后调用函数)
世界变换:将物体模型从自身的局部坐标系中转换到世界坐标系中,并将所有的物体模型组织为一个场景(包括平移,旋转,缩放变换)
取景变换:用来设置D3D中虚拟摄像机的位置和观察点。
投影变换:不同距离的投影面
视口变换:用于将投影窗口中的图像转换到显示屏幕的程序窗口中
13.光照和材质:
光照模型:(通过将光线分为红,绿,蓝三种分量,来模拟不同颜色的光线)
环境光:基于整个自然界环境整体亮度(没有位置和方向,是光线经过多次散射后形成的光,只有一个颜色,而且不会衰减)
漫反射光:
镜面反射光:
光源类型:点光源,方向光,聚光灯(系数:光源类型,光照强度,光源位置,光照方向,光照范围,衰减系数,聚光灯内椎体大小,外椎体大小)
材质::属性里面包括了
计算物体顶点的颜色值除了需要光源和物体的材质信息外,还需要每个顶点的法向量,以便根据光线的入射方向与法向量的家教计算反射光线的最终颜色值
14 纹理映射:
实际上就是对指定区域的像素颜色进行计算的一个过程(就是将图像上对应的颜色值赋到3D的点位置上)
纹理过滤:最近采样过滤(首先计算物体上某一点的纹理元素地址,然后使用与其最近接近的整数地址上的纹理元素)
线性纹理过滤:在最近采样过滤的基础上,取该点周围(上下左右)的四个纹理元素的加加权平均值。
各向异性过滤:当被投影平面与投影平面不平行的时候,会有拉伸和扭曲(设置各向异性的程度值)
多级渐进过滤:多级不同分辨率的图像
纹理寻址:(一般情况下,为物体模型的顶点所指定的纹理坐标都必须在【0,1】(指的是纹理的单位个数的感觉)之间,但是有可能纹理坐标超出该范围,因此提供了四种寻址方式)
重复寻址:允许在每个整数连接点出重复纹理操作
镜像寻址:对每个整数连接点处的纹理自动复制并翻转(一个问题,这些顶点是从上到下被赋予纹理还是从左到右,可能取决于纹理坐标存储的顺序)
夹取寻址:首先对【0,1】区间范围应用一次纹理,而对于其余的表面,将纹理的边缘像素的颜色填充。
边框颜色寻址:表示当纹理坐标超出【0,1】时,将使用纹理的边框颜色填充剩余表面的纹理。
纹理包装:是对包含纹理坐标的多边形进行光栅化操作的一种方式,用于决定如何在纹理坐标之间进行插值运算。
15.网格模型:是一种将物体模型的顶点数据,纹理,材质等信息存储在一个外部文件中的3D物体模型。对于简单图元(点,线,三角形)描述的物体,可以人工指定顶点的数据,法向量,纹理,材质等信息,但是对于复杂的3D物体,不可行,所以网格模型提供了从一种特定的模型文件格式中读取,绘制3D物体(模型,还是画出来的,只不过通过某种方式可以读取里面的顶点数据,材质等信息,并完成加载)
(纹理坐标难道是一种区别于顶点坐标之外的另一种坐标)
网格实际上是一组具有相同渲染属性的三角形集合,其中包含了所有这些三角形的顶点,索引,纹理坐标等信息,复杂的三维物体模型可以通过专业的三维建模软件制作,然后保存在特定的文件中。网格中包含不同子集,每个子集都被指定了一个唯一的属性ID,而且网格的每个三角形也被指定了该三角形所属子集的属性ID(属性缓存,索引缓存)
网格邻接信息(三角形的邻接)
网格的优化及克隆:网格模型可能包含一些无效的顶点个索引,并且,=网格中属性缓存中的子集顺序不一定是有序的。因此,通常在创建或加载网络模型后,需要对网格进行优化,以便重组网格中的顶点和索引。
克隆网格:用于创建网格数据的一个副本
X文件:是微软定义的3D模型文件格式,用于存储建模软件制作的模型,它的存储是基于模板的(貌似是抽象类的概念把)
常用的模板类型:标题,帧,矩阵,网格,顶点数据,索引数据,材质与纹理,皮肤信息,模型动画,
渐进网格模型:精细度可以调节的网络模型。
16.深度测试:在复杂的场景中通常由多个物体需要绘制,这些物体之间存在遮挡关系,里观察点较远的物体会因为近处物体的遮挡二不可见或只有部分可见,这种情况下要进行深度测试。深度测试指的是通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值决定是否绘制当前像素。
深度缓存:一块用来存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区。使用深度缓冲区的那个光栅化后多边形的像素前后遮挡关系,最终决定那个颜色被绘制出来。
深度测试:根据存储在深度缓存中的深度值判断位于同一位置像素的显示优先权的过程。
融合技术:当绘制类似于玻璃,水及具有透明效果的物体时,为了能达到类似于透明的效果,可以将当前计算的像素值(源像素)的颜色与先前计算得到的像素(目标像素)值进行合成
融合因子:通过Alpha通道实现多个像素颜色值的融合,每个像素的颜色值都包含四个分量Aplha分量,红绿蓝分量。D3D通过定义一个表示物体半透明读的Alpha值和一个融合计算公事,可以将源像素与目的像素的颜色值相混合。
Alpha来源:在进行融合之前还要指定源像素和目标像素颜色值的Alpha分量的来源。像素的Alpha值可以来自顶点颜色,材质,纹理中的Alpha值。
模板技术:控制场景中的绘制过程。
模板测试:使用模板参考值,模板掩码,模板比较函数和当前像素在模板缓冲区中的模板值做参数。判断某个像素是否被写入到后套缓存中
镜面效果是模板技术的最简单的应用。
17.着色器和效果
可编程管线提供了两种着色器:顶点着色器和像素着色器。
渐变动画效果:将一个角色由一个完整的网格模型描述,在模型动画序列中通过记录关键帧网格模型中每个顶点的新位置,这种方式秩序在关键帧之间进行插值运算改变网格模型中各顶点的位置
像素着色器:像素是运行与可编程管线中的光栅化处理阶段,可以实现纹理混合,光照模型计算等效果。
多重纹理混合:
效果框架:手法:绘制某些特效的特定方法,及效果文件为绘制某种效果提供的一种或多种方式,另外每种手法包含了一条或多条渲染通道,渲染通道包括渲染状态,采样器,以及用于该特定绘制物体的着色器等
若要实现一种效果,就要使用多种手法,而每种手法中又可能使用多个渲染通道进行渲染。