线框模式
实体模式主要是通过.BMP格式的256色高程图来表示地形的高度,高程图将高度信息传给地图生成函数,该函数计算纹理坐标,然后加载纹理图来渲染地形。
今天起来打开电脑,莫名发现系统不能正常使用了,也懒得去搞清楚是什么原因引起的,花了10分钟直接ghost还原了。
本来想画张3D渲染流程图的,但不知道为什么,word2003和visio2003老崩溃,估计是我安装的windows主题导致的,这个主题还导致声卡驱动的丢失.
基本上是这么一个流水线:
物体的局部坐标 --> 世界坐标 --> 物体剔除 --> 插入到渲染列表 --> 背面消除 --> 相机变换 --> 3D物体空间裁剪 --> 光照模块 --> 透视变换 --> 图象空间裁剪 --> 光栅化

书店本身不大,但书的选择都是很严格的,大多都是好书,而且氛围很好。
有时候自己并不喜欢太大的书店,逛以来很累,而小一点却有一些情调的书店却让人感觉惬意从而产生购买的欲望。


爱在左,同情在右,走在生命的两旁,随时撒种,随时开花,将这一径长途,点缀的香花弥漫,使穿枝拂叶的行人,踏着荆棘,不觉得痛苦,有泪可落,却不是悲凉.
很简单,就是在WinProc函数里增加一个WM_ACTIVATE消息处理,然后调用ClipCursor来限制鼠标的可移动范围.
好像WIN32没有直接将RECT从client坐标转换成screen坐标的,所以我自己写了这么个函数.
当然这里给出的代码并不是高效的,GetSystemMetrics不应该在WinProc里调用,但这里只是给出了一种解决方案,暂不考虑代码执行效率的问题.
//-------------------------------------------------------------------------
// Translates rect from client coordinate to screen coordinate.
//-------------------------------------------------------------------------
void RectFromClientToScreen(LPRECT rect)
{
POINT tmp;
tmp.x = rect->left;
tmp.y = rect->top;
ClientToScreen(g_mainWindowHandle, &tmp);
rect->left = tmp.x;
rect->top = tmp.y;
tmp.x = rect->right;
tmp.y = rect->bottom;
ClientToScreen(g_mainWindowHandle, &tmp);
rect->right = tmp.x;
rect->bottom = tmp.y;
}
//-------------------------------------------------------------------------
// Main windows event procedure.
//-------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps; // used in WM_APINT
HDC hdc; // handle to a device context
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
RECT screenRect = {0, 0, screenWidth, screenHeight};
RECT clientRect;
// what is the message
switch (msg)
{
case WM_CREATE:
// do initialization stuff here
return 0;
case WM_PAINT:
// start painting
hdc = BeginPaint(hwnd, &ps);
// end painting
EndPaint(hwnd, &ps);
return 0;
case WM_ACTIVATE:
if(LOWORD(wParam) == WA_ACTIVE)
{
GetClientRect(g_mainWindowHandle, &clientRect);
RectFromClientToScreen(&clientRect);
ClipCursor(&clientRect);
}
else if(LOWORD(wParam) == WA_INACTIVE)
ClipCursor(&screenRect);
break;
case WM_DESTROY:
// kill the application
PostQuitMessage(0);
return 0;
}
// process any messages that we did not take care of
return DefWindowProc(hwnd, msg, wParam, lParam);
}
增加了彩色光源和纹理映射,支持背景切换(按N).
按键说明:
W - 开/关线框模式
I - 开/关点光源
A - 开/关环境光源
按ESC键退出,不过还有一个小问题没解决,就是当鼠标移到游戏窗口之外时,将激活别的窗口.

