DirectX Rendering Pipeline / DirectX渲染管线

渲染管线就是在给定一个3D场景和摄像机时,根据摄像机的视角生成一幅2D图像的一系列步骤,类似于流水线作业。 一、IA-从内存读取几何数据(顶点和索引) ID3D10InputLayout 输入布局 1. 创建一个D3D1_INPUT_ELEMENT_DESC结构体 2. 调用CreateInputLayout方法 ID3D10Buffer 缓冲区 1. 创建一个D3D10_BUFFER_DESC结构体,描述要创建的缓冲区 2. 创建一个D3D10_SUBRESOURCE_DATA,指定缓冲区的初始化数据 3. 调用CreateBuffer方法 创建完顶点缓冲区(通过指定bindflag创建不同类型的缓冲区),需要绑定到设备的输入槽上(input slot),这样的话顶点数据就会进入pipeline。 ID3D10Device::IASetVertexBuffers(…) 把顶点缓冲区指定好输入槽只是绘制前的准备工作,需要调用ID3DDevice::Draw方法来进行绘制 图元拓补(Primitive Topology),顶点缓冲区只是一个顶点列表,设备不知道如何解释这些顶点,这就需要设置图元拓补来告诉Device如何解释这些顶点来构成图元,IASetPrimitiveTopology() typedef enum D3D10_PRIMITIVE_TOPOLOGY { D3D10_PRIMITIVE_TOPOLOGY_UNDEFINED = 0, D3D10_PRIMITIVE_TOPOLOGY_POINTLIST = 1, D3D10_PRIMITIVE_TOPOLOGY_LINELIST = 2, D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP = 3, D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,  //三角形列表,每三个顶点构成一个三角形 D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5, D3D10_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10, D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11, D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12, D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ…

Ansi, Unicode, Unicode big endian, UTF-8 不同编码文件类型区分

Ansi, 只存储ASC字符,每个字符占1个字节。比如abc存成Ansi文件,大小为3字节。 二进制表示: 61 62 63 Unicode, 每个unicode字符占2个字节,可以表示各种字符。在unicode的文件的头两个字节存储FF FE,用来表示这是一个Unicode文件。比如abc存成Unicode文件,大小为2*3+2 = 8字节。 文件的二进制表示: FF FE 61 00 62 00 63 00, a编码为61 00, 占连个字节,编码从高字节开始。 Unicode big endian, 存储大小与Unicode一致,头2个字节为FE FF, 字符编码变为从低字节开始。 例如字符a的编码为 00 61,所以abc存成Unicode big endian文件的二进制表示为: FE FF 00 61 00 62 00 63 UTF-8, 前三个字节保存为EF BB BF表示该文件为用UTF-8为字符编码,Ansi字符占一个字节,UTF-8用1到6个字节编码UNICODE字符。 Abc的utf-8表示即为EF BB BF 61 62 63

策略模式

#include <iostream>   using namespace std;   class StrategyInterface {     public:         virtual void execute() = 0; };   class ConcreteStrategyA: public StrategyInterface {     public:         virtual void execute()         {             cout << "Called ConcreteStrategyA execute…

Android apk文件反编译

具体步骤: 1. 把apk文件后缀改为zip,解压缩 2. 通过dex2jar.bat工具, 把classes.dex文件转化为classes_dex2jar.jar文件, 在命令行运行dex2jar.bat classes.dex 3. 使用jd-gui打开这个jar文件

Windows Message Delivery

PostMessage API Function Places a message in the application’s message queue. The message will be handled only when the application has a chance to access its message queue (that is, when it receives control from the system), and only after earlier messages have been processed. This is an asynchronous call, because you do not know…

Divide And Conquer

Merge Sort: void Merge(int list[], int lowIndex, int highIndex, int midIndex) {    int *tempList = new int[highIndex-lowIndex+1];    int firstLow = lowIndex;    int secondLow = midIndex + 1;    int index = 0;    while(firstLow <= midIndex && secondLow <= highIndex)    {       if (list[firstLow] < list[secondLow])      …

Recursion

递归生成某集合的所有序列: template <class T> void Swap(T& a, T& b) {    T temp = a;    a = b;    b = temp; } template <class T> void Permulation(T list[], int k, int m) {    if (k == m)    {       for (int i = 0; i <= m; i++)  …

3N+1

int threeN(int n) {    if (n%2==0)       return n/2;    else       return n*3+1; } int getLength(int n) {    static map<int, int> history;    int key = n;        if (n == 1)       return 1;    if (history.find(key) != history.end())       return…