Getting Started

Getting Started (Direct3D 9)

Coordinate Systems and Geometry (Direct3D 9)

1, 2, 左(积极)右(消极)手坐标系 : x, y 都是固定的, y上正, x右正.

z轴左右手判定 :  左右手, 4指顺x轴掏, 大拇指方向为z轴方向.

  • 翻转三角形定点的顺序, 使得 系统顺时针遍历顶点, 从前开始. vertics是v0, v1, v2, 传入d3d时, vertics是v0, v2, v1
  • 视图矩阵 计算时, 世界坐标的 z = -1。
右手坐标系的函数 : D3DXMatrixPerspectiveRH             D3DXMatrixOrthoRH              D3DXMatrixLookAtRH
3, 还有一种变种, z轴和y轴对调.
受坐标系影响的一些操作 :  translation, rotation, and scaling    见 Transforms (Direct3D 9
你可以把这些操作合并到一起,,,进行优化,,,,一起计算时,,,,顺序很重要!!

Texture Coordinates (Direct3D 9)

大多数纹理, 像bitmap, 都是2维数组颜色值.
立方体环境纹理, 是个特例(3维的).
每个像素点, 有一个颜色值, 标记为(u, v)点的颜色值. (0, 0) ~ (1, 1)
纹理坐标, 是在纹理空间的:当应用到3D空间时,纹理地址必须被映射到对象坐标系:最后必须转换到屏幕坐标系,或像素位置。
映射纹理 到 屏幕空间
D3D将纹理空间的纹理 直接 映射到屏幕空间的像素点, 跳过 中间过程的效率优化。
这个映射处理 实际是一个反向映射。
在屏幕上的每一点,计算对应的在纹理空间的纹理坐标值。
该处或周围的 纹理颜色 被采样。
采样过程被叫做纹理过滤。 更多信息参见Texture Filtering (Direct3D 9).
结果是 在不同的纹理中, 相同的纹理地址可以映射到不同的纹理坐标。
如(0.5, 1) 在5×5纹理中对应 (2, 4), 在7×7纹理中对应(3, 6);
直接映射纹理到像素。 Directly Mapping Texels to Pixels (Direct3D 9).
例子:
你可以使用大于(0, 0) ~ (1, 0)的坐标系
当你需要纹理填充更小的图像时, 纹理将被修改 :  纹理过滤 或 纹理剪裁。 使适应更小的图片。

Texture Coordinates and Texture Stages

IDirect3DDevice9::SetTexture.  有8种纹理坐标系。 
IDirect3DDevice9::SetTextureStageState  8个纹理混合阶段。

texture addresses   纹理地址(0.5, 1)  抽象坐标
texel coordinates  纹理像素坐标(2, 4) 实际纹理图像像素坐标
object space  对象空间


Directly Mapping Texels to Pixels (Direct3D 9)

图1....略
上图把像素模型化成一个方块。 实际中, 像素是点, 不是方块。
图中每个方块代表一个原点, 实际上,像素是每个方块的内接圆。
这个小区别看起来很小, 但很重要,,,接下来图会用不同的展示方法,给以更好的解释。
图2....略
上图中,把每个像素真是的表示成了每个方块中的圆。而屏幕的(0,0)坐落在左上角方块的中心,所以大方块的左上角的坐标是(-0.5, -0.5), 因为以第一个圆点的圆心为坐标中心。
D3D要渲染一个(0, 0)~(4, 4)的方块, 是按实际坐标来的, 如图3.
图3....略
上图说了, 数学方块和现实之间的关系,但是没有展示 这个方块经过D3D画出来后的效果。
实际的绘图效果,不可能像画的那样,很精准的画个方块。 换句话说, 因为每个像素只能显示唯一的颜色。所以边缘需要显示两个颜色。
相反, 由图像硬件决定哪个西昂宿应该过滤用来填充方块。
这个处理过程叫做光栅化,细节在Rasterization Rules (Direct3D 9). 举一个特殊的情况,光栅化后的结果如下图。
图4....略 : 蓝方块     光栅化后的图
注意传给D3D的坐标是(0, 0) (4, 4), 但是光栅输出是在(-0.5, -0.5)(3.5, 3.5).
比较前边两幅不同渲染的插图。你可以看到实际显示的效果是正确的, 但是已经被移动了-0.5单位。
但是, 除非是multi-sampling计数, 这已经是最好的最接近方块的渲染方法。(看 抗锯齿采样, 来了解复杂的采样.)  要知道,如果光栅填充每一个方块, 结果区域将是5 * 5而不是4*4;
如果你假设 屏幕坐标原点 是在左上角, 来代替左上第1个元素, 方块出现的位置, 将和期望的一样. 但是当给定的方块是纹理, 差别将变得明显。 下图是将用来 map directly到方块上的纹理图片。
图5....略 : 灰边彩心儿
纹理是4*4的, 方块是4*4的, 你可能期望纹理完全覆盖在 蓝色框内, 而不是按照像素方格人覆盖。
但是实际不是这样的;甚至是微小的位置都会影响到纹理的显示,以下图会展示一个(0, 0)(4, 4)的方格, 光栅化加纹理后如何显示:
图6....略(光栅化后,,,quar在(0, 0)起点, 纹理在(-0.5, -0.5)起点, 且颜色被混合了(不是纯色了)....)
图6方块,显示了纹理的输出(线性滤镜 + clam位模式) 使用叠加的光栅化轮廓。  接下来的文章会详细的解释, 为什么上图的效果看起来是这样的...而不是和纹理完全一样的, 而解决方案, 在这里 : 


Primitives

最基础的3D实体, 是3D坐标系统里的点, 以及点链表。
3D原语为多边形. 封闭的3D图形定义至少有3个点。 
最基础的多边形, 是三角形, 微软用三角形组成其他多边形, 因为三个顶点是共面的, 而非共面多边形效率很低. 
你可以用三角形, 组成复杂的多边形, 或网格图.
以下展示了一个 正方体, 你可以另加材质纹理.
图略
你可以用三角形原语 创造出 很顺滑的曲线, 你可以使用高氏阴影
图略
D3D设备原语列表:

posted on 2011-08-30 08:08  oleeceo  阅读(264)  评论(0)    收藏  举报

导航