Main.cpp

实现了一个渲染线框立方体的流水线,实现了除光栅化之外的部分.随着往里添加东西随着更新到这里吧,图形学还真有的血,数学还要齐头并进.挺好的,时隔一年,终于找到了自己最想要的.加油!

后来添加了相机空间到裁剪空间的转换,从裁剪投影.经过一个星期的拉锯战,终于搞定了裁剪这条巨龙啊...接下来继续完善吧,实施裁剪,深度缓冲,将数学库加入到引擎中以实现操控立方体和摄像机.真好玩,哈哈!


//	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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值