渲染的几个基本概念
渲染主要概念就是用一张2D图片来表现3D世界。
即首先描述出一个3D场景, 然后用用2D的图片来表现它。下面是渲染的几个基本概念
1.Model(模型)
用三角形组成的格式物体
2.Vertex(点)
点构成三角形。因为在D3D中, 一个点除了要描述其位置之外还要描述其他的信息,
所以单纯地用数学意义上的点来描述是不够的。如颜色:
struct colorVertex { float x, y, z; DWRD color } #define FVF_COLOR(D3DFVF_XYZ | D3DFCF_DIFFUSE)
当然,查看D3DFVF能得到所有关于点的格式的定义。
3. (Triangles)三角形
三角形是3D所有物体的基础。画一个复杂图形就是画a list of 三角形。
4.Indices
如上图所示, 点V0和V2, 被两个三角形共用了,我们是否需要6个点来描述2个三角形呢?
当然不必, 这用如下方法解决。
声明两个数组: Vertex 和 Index, 一个保持,所有的点,一个保存组成一个三角形所需点的索引。如:
Vertex vertexList[4] = {v0, v1,v2, v3}WORD indexList[6] = {0,1,2 // triangle00,2,3}//triangle1
4. Camera(摄像机)
摄像机指定一个3D场景哪一部分输出。
5.Overview of rendering
Local Space--->World Space--->View Spance--->Backface Culling--->Lightting
-->Clipping--->Projection--->Viewport Space--->Rasterization
在D3D中, 我们使用IDirect3DDevice->SetTransform 函数来进行转换。
6.Local Space
物体本身的坐标系, 必然一个球体, 圆心的Local Space 可以认为是(0,0,0)
7. World Space
世界坐标系,还是上面的球, 其圆心在世界坐标系中可能是(100,0,1).
D3DXMATRIX cubeWorldMatrix; //在世界坐标系的物体位置 D3DXMatrixTranslation(&cubeWorldMatrix, -3.0f, 2.0f, 6.0f); D3DXMATRIX sphereWorldMatrix; //在世界坐标系的物体位置 D3DXMatrixTranslation(&sphereWorldMatrix, 5.0f, 0.0f, 6.0f); //开始放于世界坐标系中 Device->SetTransform(D3DTS_WORLD, &cubeWorldMatrix); DrawCube();// draw the cube Device->SetTransform(D3DTS_WORLD, &sphereWorldMatrix); DrawSpere();
8. View Space
这个主要对摄像机的。
在世界坐标系中, 摄像机是位于世界原点相对位置的。但是如果这样的话, 投影或者其他操作
是非常困难和低效的。所以我们把摄像机至于世界坐标系的原点,并把摄像头Z方向向下放置。这样
以来世界坐标系的所有物体就必须有一个相对于摄像机的转换,这个过程就叫做“View Space transform”
D3DXVECTOR3 position(5.0f, 3.0f, -10.0f);//摄像机的原点 D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);//瞄向哪里 D3DXVECTOR3 worldUp(.0f, 1.0f, .0f);//哪个方向是"上" D3DXMATRIX camera; D3DXMatrixLookAtLH(&camera, position, &targetPoint,&worldUp); Device->SetTransform(D3DTS_VIEW, &camera);
9. Backface culling
我们永远也看不见一个物体的背面,所以就有了”Backface culling”。
10. Lighting
灯光在世界坐标系中定义,但是会转换为摄像机坐标系来应用。灯光的主要目的就是为了
给场景更符合现实的表现。
11. Clipping
裁剪在摄像机镜头之外的部分-->这个过程叫”Clipping”.
有三种形式的裁剪:
(1) Completely inside
(2) Completely outside
(3) Partially inside
12. Projection
用N-1维来表示N维德过程叫做Prijection.当然这里我们可以狭义地认为用2D来表现3D。
13. Viewport Transform
所谓视口转换就是把一块View的坐标映射到Client上。(很不严谨的描述,但是就是这个意思)
14. Rasterization
光栅化过程需要非常集密的计算,通常需要显卡来做这事情。等光栅处理完毕以后,
显示器才能显示。