【20090922】C++培训日记-DX初探(2)
主要内容是着色、光源,以及抗锯齿的处理 = =
光源部分完全不懂 巨多参数 囧 照着COPY - -……
抗锯齿处理:锯齿是在光栅化的时候因为浮点数取整时造成的,
我们可以在初始化的时候设置设备的MultiSampleType(多重取样),
级别从1级到16级,每次取周围一定范围(取决于级别高低)的像素 计算该像素的颜色
这台PC的显卡支持到D3DMULTISAMPLE_8_SAMPLES,软件运算支持到9……
可以通过下列语句检查HAL和REF是否支持该级别:
// 测试当前硬件性能是否支持此级别多重采样 if (FAILED(g_pd3d9->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, NULL))) { MessageBox(hWnd, TEXT("HAL NOT SUPPOSE THIS MULTISAMPLE"), TEXT(""), MB_OK); // 尝试用软件方式创建设备 if (FAILED(g_pd3d9->CreateDevice(D3DADAPTER_DEFAULT, // 默认显卡 D3DDEVTYPE_REF, // 使用软件设备 hWnd, // 与设备相关的窗口句柄 D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 定点运算采用软件方式 &d3dParm, // D3D设备参数 &g_pd3dDevice9))) // D3D设备 { MessageBox(hWnd, TEXT("SORRY, REF ALSO FAILED!"), TEXT(""), MB_OK); return E_FAIL; } return S_OK; } else { // 创建D3D设备对象 if (FAILED(g_pd3d9->CreateDevice(D3DADAPTER_DEFAULT, // 默认显卡 D3DDEVTYPE_HAL, // 使用硬件设备 hWnd, // 与设备相关的窗口句柄 D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 定点运算采用软件方式 &d3dParm, // D3D设备参数 &g_pd3dDevice9))) // D3D设备 { return E_FAIL; } return S_OK; }
笔记,SHADEMODE的两种值:
- FLAT
取三角形中第一个顶点的颜色 填充整个平面
- GOURAUD
取三个顶点的颜色线性插值,结果会是彩色的 = =
光源则有三种:
- POINT 点光源
顾名思义就是从一点放出来的光源了 - -// 设置一个点光源 D3DXVECTOR3 LightPos(0.0f, 0.0f, 0.0f); // 在原点 D3DXCOLOR c = WHITE; // 白光 g_d3dLight9.Type = D3DLIGHT_POINT; // 类型 g_d3dLight9.Ambient = c * 0.0f; // 环境光 g_d3dLight9.Diffuse = c; // 漫射光 g_d3dLight9.Specular = c * 0.6f; // 镜面光 g_d3dLight9.Position = LightPos; // 光源位置 g_d3dLight9.Range = 1000.0f; // 最大光程 // 衰减 = 1 / A0 + A1 * D + A2 * D * D (D = 光源到顶点的距离) g_d3dLight9.Attenuation0 = 1.0f; // 常量衰减系数 g_d3dLight9.Attenuation1 = 0.0f; // 线性衰减系数 g_d3dLight9.Attenuation2 = 0.0f; // 二次衰减系数
- DIRECTIONAL 方向光
有方向的光源 - -// 设置一个定向光源 D3DXVECTOR3 LightDir(1.0f, 0.0f, 0.0f); // 从左向右 D3DXCOLOR c = WHITE; // 白光 g_d3dLight9.Type = D3DLIGHT_DIRECTIONAL; // 类型 g_d3dLight9.Ambient = c * 0.0f; // 环境光 g_d3dLight9.Diffuse = c; // 漫射光 g_d3dLight9.Specular = c * 0.6f; // 镜面高光 g_d3dLight9.Direction = LightDir; // 光的方向
- SPOT 聚光灯
像手电筒一样 中间一部分很亮 旁边慢慢变淡:// 设置一个聚光灯光源 D3DXVECTOR3 LightPos(0.0f, 0.0f, -5.0f); // 光源位置 D3DXVECTOR3 LightDir(0.0f, 0.0f, 1.0f); // 光源方向 D3DXCOLOR c = WHITE; // White g_d3dLight9.Type = D3DLIGHT_SPOT; // 类型 g_d3dLight9.Ambient = c * 0.0f; // 环境光 g_d3dLight9.Diffuse = c; // 漫射光 g_d3dLight9.Specular = c * 0.6f; // 镜面光 g_d3dLight9.Position = LightPos; // 光源位置 g_d3dLight9.Direction = LightDir; // 光源方向 g_d3dLight9.Range = 1000.0f; // 最大光程 g_d3dLight9.Falloff = 1.0f; // 光强衰减方式 g_d3dLight9.Attenuation0 = 1.0f; // 常量衰减系数 g_d3dLight9.Attenuation1 = 0.0f; // 线性衰减系数 g_d3dLight9.Attenuation2 = 0.0f; // 二次衰减系数 g_d3dLight9.Theta = 0.4f; // 内锥角 g_d3dLight9.Phi = 0.9f; // 外锥角