实现了一个渲染线框立方体的流水线,实现了除光栅化之外的部分.随着往里添加东西随着更新到这里吧,图形学还真有的血,数学还要齐头并进.挺好的,时隔一年,终于找到了自己最想要的.加油!
后来添加了相机空间到裁剪空间的转换,从裁剪投影.经过一个星期的拉锯战,终于搞定了裁剪这条巨龙啊...接下来继续完善吧,实施裁剪,深度缓冲,将数学库加入到引擎中以实现操控立方体和摄像机.真好玩,哈哈!
// 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;
}