几何图元的表达
来源:互联网 发布:淘宝王子 可信吗 编辑:程序博客网 时间:2024/04/28 11:56
顶点定义
当我们用顶点去定义几何图元时,我们可能用两个顶点去表达一条线,或者三个顶点去表达一个三角形。那么D3D是如何去理解我们给定的N个点的信息呢?
Primitive Topology
一个顶点的集合被称为vertex buffer,他仅仅储存了一个顶点列表在一个连续的内存空间中。当我们需要D3D去组合这个几何图元时,我们需要告诉他顶点的几何拓扑信息。利用void ID3D12GraphicsCommandList::IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY Topology);
enum D3D_PRIMITIVE_TOPOLOGY
定义了一些例如线,三角等原始拓扑信息。我们提供列表时,利用上一次的设置。直到我们再次调用接口改变了这个信息。
- Point List:
D3D_PRIMITIVE_TOPOLOGY_POINTLIST
当设置为此时,每一个列表中的顶点都被画为独立的点。 - Line Strip:每一个相邻的顶点相连组成的一些连接的线段。
- Line List:每两个相邻的顶点组成独立的线段。与Line Strip不同的是,他不假设所有的点都相连。
- Triangle Strip:每相邻的3个顶点组成了一些连接的三角形。
- Triangle List:3个顶点组成独立的三角形。
Primitives with Adjacency
对于一个三角形,你可以画出3个相邻的3个三角形(adjacent triangles)。这样的信息用于geometry shader
几何着色器,其中的某些阴影算法需要用到adj。为了使几何着色器能获取到这些adj,我们必须提交这些数据与三角形一起在vertex buffer中,在这之前我们需要指定D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ
。需要注意的是,这些adj信息只是用于几何着色器——他们并不会画出来。如果没几何着色器的话,同样的他们并不会画出来。
Control Point Patch List D3D_PRIMITIVE_TOPOLOGY_N_CONTROL_POINT_PATCHLIST
拓扑类型表明了顶点信息用于N个补充控制点。在曲面细分阶段被使用。
Indices
当我们定义多个三角形共顶点时,我们可以使用顶点索引去构建。虽然我们可以使用Triangle strips
来解决共顶点问题。但是他没有Triangle Lists
那么灵活。所以顶点索引使用例如这样:
Vectex v[4] = {v0,v1,v2,v3};UINT indexList[6] = { 0, 1, 2,//Triangle 00,2,3//Triangle 1}
这样我们把顶点数据的重复放到了索引上。这样的做法not bad当:
- 索引是一个整型,不需要那么多的内存。
- 对于高速缓存更加适合。
顶点Shader阶段
顶点shader可以理解为一个输入和输出为顶点的函数。其中的某些函数是由我们自己实现的,所以他被跑在GPU上,十分的快速。一些特殊的效果可以被实现在顶点shader上,例如转换、光照。因为我们顶点shader输入的格式可以多种多样。
本地空间和世界空间
一个物体的定义基本都被定义在他自己的本地空间,这是为了便利性和复用性起见。所以一个物体的世界坐标用 他的本地坐标和本地坐标系与世界坐标系的关系给出。
假定:
我们可以看到,当构建一个世界矩阵时,我们必须直接找出局部空间原点和轴相对于世界空间的坐标。但这在某些时候并不是很简单。一个更普遍的方法是定义W作为一个转换的序列。
View Space
为了形成一个2D的图像,我们必须放置一个虚拟相机在场景中。如果我们知道View Space的
得到这个矩阵以后,我们便可以利用
世界坐标系和ViewSpace通常上只有位置和方向的差异。所以我们可以简化为
假定
相机的右方向为:
所以 最后的相机的上方向为:
这样,通过相机瞄准的点、相机的位置和世界坐标系的上方向,我们就可以确定相机坐标系的三个轴在世界坐标系中的表达。就可以求出转换矩阵。
在DirectXMath中,有这样的函数
XMMATRIX XM_CALLCONV XMMatrixLookAtLH( FXMVECTOR EyePosition, // QFXMVECTOR FocusPosition, // TFXMVECTOR UpDirection); // j
- 几何图元的表达
- 基本几何图元
- 几何图元之一:点
- 3D 几何图元
- osg 基本几何图元
- 3D数学之-几何图元和几何检测
- flyweight模式和图元几何变换
- 3D几何图元(7)
- 3D几何图元(6)
- 3D几何图元(5)
- 3D几何图元(4)
- 3D几何图元(3)
- 3D几何图元(2)
- 3D几何图元(1)
- OpenGL几何图元和缓冲区(一)
- OpenGL几何图元和缓冲区(二)
- OpenGL几何图元和缓冲区(三)
- OpenGL几何图元和缓冲区(四)
- 优质产品需求文档(PRD)写作三大原则
- svn: Aborting commit: 'xxxx' remains in conflict 解决
- 平衡二叉树,AVL树之图解篇
- 将博客搬至CSDN
- C++ 关于虚函数n条性质
- 几何图元的表达
- 前端构建工具gulpjs的使用介绍及技巧
- 劝学 ——荀子
- Java设计模式之代理模式实现及原理
- ajax的使用
- 音视频与直播入门
- python pip包管理
- 基于php开发的RESTful ApiDoc文档
- Windows10+CUDA8.0+VS2015+CUDNN5下配置caffe