实现了一个渲染线框立方体的流水线,实现了除光栅化之外的部分.随着往里添加东西随着更新到这里吧,图形学还真有的血,数学还要齐头并进.挺好的,时隔一年,终于找到了自己最想要的.加油!
后来添加了相机空间到裁剪空间的转换,从裁剪投影.经过一个星期的拉锯战,终于搞定了裁剪这条巨龙啊...接下来继续完善吧,实施裁剪,深度缓冲,将数学库加入到引擎中以实现操控立方体和摄像机.真好玩,哈哈!
// Main.cpp #include "IDX9.h" #include "Math.h" #include "Camera.h" IDX9* pInstance = new IDX9() ; const TCHAR className[] = TEXT("ClassName") ; const TCHAR appName[] = TEXT("Rotating Cube") ; const int viewPortWidth = 800 ; const int viewPortHeight = 600 ; LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: delete pInstance ; PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ) { WNDCLASSEX wc = { sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle( NULL ), NULL, NULL, NULL, NULL, className, NULL }; RegisterClassEx( &wc ); HWND hWnd = CreateWindow( className, appName, WS_OVERLAPPEDWINDOW, 100, 100, viewPortWidth, viewPortHeight, NULL, NULL, wc.hInstance, NULL ); // 创建摄像机 Camera* pCamera = new Camera(90, viewPortWidth, viewPortHeight) ; // 创建立方体 Cube* pCube = new Cube(0, 0, 50) ; // 沿任意轴缩放 //Vector3* pVecotr = new Vector3() ; //pVecotr ->x = 1 ; //pVecotr ->y = 0 ; //pVecotr ->z = 0 ; //ScaleAccordingTo(pCube, pVecotr, 1) ; int i = 0 ; int j = 0 ; int k = 0 ; // 创建主多边形列表 PolySelfContained mainPolyList[12] ; if( pInstance ->SetUp(hWnd)) { ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); MSG msg; ZeroMemory( &msg, sizeof( msg ) ); while( msg.message != WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { // 刷新后缓存 pInstance ->RefreshBackBuffer() ; //if (i < 50) //{ // pCamera ->Fly(1) ; // ++i ; //} //else if (j < 100) //{ // pCamera ->Fly(-1) ; // ++j ; //} //else //{ // i = -50 ; // j = 0 ; //} // 绕局部坐标系XYZ轴依次旋转 if (i < 100) { pCube ->RotateAroundX(0.5) ; ++i ; } else if (j < 100) { pCube ->RotateAroundY(0.5) ; ++j ; } else if (k < 100) { pCube ->RotateAroundZ(0.5) ; ++k ; } else { i = 0 ; j = 0 ; k = 0 ; } // 立方体模型坐标转换到世界坐标,模型坐标始终未变 ModelToWorld(pCube) ; // 将四边形的多边形加入主多边形列表 int index ; Vector4 vertex ; for (int i = 0; i < pCube ->polyCount; ++i) { mainPolyList[i].removed = false ; index = pCube ->polygones[i].vertexIndexArray[0] ; vertex = pCube ->polygones[i].pVertexList[index] ; mainPolyList[i].vertexList[0] = vertex ; index = pCube ->polygones[i].vertexIndexArray[1] ; vertex = pCube ->polygones[i].pVertexList[index] ; mainPolyList[i].vertexList[1] = vertex ; index = pCube ->polygones[i].vertexIndexArray[2] ; vertex = pCube ->polygones[i].pVertexList[index] ; mainPolyList[i].vertexList[2] = vertex ; } // 更新摄像机 pCamera ->Update(10, 300, 90, viewPortWidth, viewPortHeight) ; // 背面消除 RemoveBackface(mainPolyList, pCube ->polyCount, &pCamera ->position) ; // 生成转换到同世界坐标轴重合的矩阵 pCamera ->BuildWroldToCameraMatrix() ; // 世界到相机 WorldToCamera(mainPolyList, pCube ->polyCount, &pCamera ->toOriginInverse) ; // 生成相机空间到裁剪的矩阵 pCamera ->BuildCameraToClipMatrix() ; // 相机到裁剪 CameraToClip(mainPolyList, pCube ->polyCount, &pCamera ->toClip) ; // 并没有在此执行裁剪 // 从裁剪投影 ClipToPerspective(mainPolyList, pCube ->polyCount,pCamera ->nearDistance) ; // 投影到屏幕 PerspectiveToScreen(mainPolyList, pCube ->polyCount, pCamera ->viewPortWidth, pCamera ->viewPortHeight) ; // 提交多边形到后缓存 pInstance ->SubmitPolygonList(mainPolyList, pCube ->polyCount) ; pInstance ->DrawBackBuffer() ; pInstance ->Render() ; } } } UnregisterClass(className, wc.hInstance ); return 0; }