锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Parallax Mapping
瀵瑰簲鐨勭綉鏍煎浘
瓚佺潃浜哄皯鍙戜袱寮犵瓑鐫鎸ㄧ爾澶寸殑鏁堟灉鍥俱?br>
鐪嬩簡涓澶╃殑璧勬枡錛岃瘉瀹炰簡鍘熸潵鐨勬兂娉曟槸瀵圭殑銆?br>normal map 鏄?bump map 鐨勬敼榪涳紝涓昏鏄疓PU鍙紪紼嬩負鍏跺垱閫犱簡鏉′歡銆?br>parallax map 鏄?normal map 鐨勬敼榪涚増鏈紝鐩稿綋浜庢槸瀵筺ormal map 鐨勪慨姝o紝娌′粈涔堝績鎰忋?br>
Displacement Mapping璨屼技鎸虹墰錛屾槑澶╀粩緇嗙爺絀朵笅 錛?錛?br>
鍏堟潵寮犺皟鏁翠簡鍙傛暟鐨剅oam緗戞牸鍥劇墖錛屾妸闈㈢墖鏁扮害鏉熷湪1w錛岃繖涓媟oam鐨勬晥鏋滃氨鏄庢樉浜嗗惂錛?br>鍙戠幇鍦板娍濡傛灉涓嶆槸鐗瑰埆騫沖潶鐨勮瘽錛屽緢闅炬壘鍒頒竴涓弧鎰忕殑鍙傛暟錛屾棦鑳藉噺灝戦潰鐗囨暟錛屽張鑳藉彇寰楀緢濂界殑鏄劇ず鏁堟灉銆?br>濡傛灉鏈夊ぇ鐗囧ぇ鐗囩殑騫沖湴錛岄偅灝辯畝鍗曚簡銆?br>
榪欐槸浣跨敤cg璇█瀹炵幇鐨?texture blend 浣跨敤鍥涘紶綰圭悊鍔犱竴涓粏鑺傜汗鐞嗘販鍚堣屾垚錛?br>澧炲姞浜嗗儚绱犵駭鐨?Phone 鍏夌収妯″瀷銆傚厜鐓х殑棰滆壊鏈夌偣鎬殑銆?br>
闈㈢墖鏁拌窡甯ф暟姘歌繙鐨勮浜哄緢鐭涚浘銆傝繖鏍蜂互鍚庣獊鍙樺氨寰堜笉鏄庢樉浜嗭紝鑲夌溂鍑犱箮鍙戠幇涓嶄簡錛屼笉榪囨劅瑙夋湁閫鍖栨垚鏅氱殑lod鐨勮秼鍔褲?br>褰撶劧錛岃繙澶勭殑緗戞牸榪樻槸浼氭湁璺沖姩鐜拌薄錛屼笉榪囬偅宸茬粡寰堣繙浜嗭紝涓鑸笉浼氭湁浜烘敞鎰忓埌鍙戠敓浜嗕粈涔堛?br>鍙槸榪欐牱澶уぇ澧炲姞浜嗙綉鏍兼暟閲忥紝搴旂敤涓嬭鏅綋鍓櫎鏁堟灉浼氭瘮榪欎釜濂藉緢澶氬惂錛?br>
榪欎釜鏄垜瀹炵幇鍑烘潵鐨?roam terrain 鍦板艦
闂鏄紝褰撴垜鍦ㄥ湴褰笂婕父鏃訛紝緗戞牸蹇呯劧浼氬彂鐢熷彉鍖栥備笉鍚屽眰嬈$殑緗戞牸涔嬮棿璺寵穬鐨勫緢鍘夊錛岃浜鴻寰楀湴褰㈠緢涓嶇湡瀹烇紝
鏈夋病鏈変漢鏈夊ソ鐨勫姙娉曡兘瑙e喅錛?br>
榪欏紶鏄垰寮濮嬫椂娌″姞杞戒笂澶栭儴鏂囦歡鏃剁殑
榪欏紶鏄垎鐐告晥鏋滃浘
榪欏紶鏄潃鐏晥鏋?br>
琚寮硅拷鍑?br>
鏈鍚庢潵寮犲鑹茬編鏅?br>
璇氱浖鐗涗漢鎸囩偣涓嶈凍錛?br>
瀹炵幇鐨勬柟娉曞緢綆鍗曘傚氨鏄敤浜嗘姌灝勫拰鍙嶅皠綰圭悊錛岃繕鐢ㄤ簡涓寮燽ump鍥俱?br>
棣栧厛闇瑕佸皢鍦烘櫙鍒嗗埆娓叉煋鍒版姌灝勭汗鐞嗗拰鍙嶅皠綰圭悊銆?br>
鍒╃敤gpu紼嬪簭鎶婅繖涓ゅ紶綰圭悊鏄犲皠鍒版按浣撲笂銆傚埄鐢╞ump鍥懼姞涓婇傚綋鐨勬壈鍔紝褰㈡垚姘存嘗鏁堟灉銆?br>
鍙戜笅鏁堟灉鍥撅細
棣栧厛錛屾垜浠簡瑙d竴涓?/span>BMP鐨勬牸寮忥紝BMP鏈夊洓閮ㄥ垎緇勬垚錛岀敤琛ㄦ牸琛ㄧず濡備笅錛?/span>
|
|
|
|
1. 鏂囦歡淇℃伅澶?/span> |
2. 浣嶅浘淇℃伅澶?/span> |
3. 璋冭壊鏉?/span> |
4. 浣嶅浘鏁版嵁 |
絎竴閮ㄥ垎錛屾枃浠朵俊鎭ご鐨勬牸寮忓涓嬶細
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
鍏辨湁14涓瓧鑺傦紝鍏朵腑bfType涓烘枃浠剁被鍨嬶紝BMP鐨勭被鍨嬩負0×4d42錛屼篃灝辨槸瀛楁瘝m鍜?/span>b錛?/span>bfSize鏄枃浠跺ぇ灝忥紝涓?/span>1錛?/span>2錛?/span>3錛?/span>4閮ㄥ垎澶у皬鐨勬誨拰錛?/span>bfReserved1鍜?/span>bfReserved2涓?/span>1錛?/span>2錛?/span>3閮ㄥ垎澶у皬鐨勬誨拰銆?/span>
絎簩閮ㄥ垎錛屼綅鍥句俊鎭ご錛屽畾涔夊涓嬶細
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
鎬誨叡40涓瓧鑺傦紝瀛楁姣旇緝澶氾紝鍙互鏌ョ湅MSDN涓殑璇存槑錛屽浜?/span>RGB24鐨勪綅鍥撅紝榪欎釜緇撴瀯浣撲竴鑸畾涔夊涓嬶細
BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = 0;
bih.biSizeImage = size;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
絎笁閮ㄥ垎鏄皟鑹叉澘淇℃伅錛屽畾涔夊涓嬶細
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
榪欓儴鍒嗙敤鏉ヨ〃紺?/span>RGB鍚勮壊鐨勫己搴︼紝涓鑸儏鍐墊垜浠笉鎶婅繖涓閮ㄥ垎鍐欏埌鏂囦歡涓?/span>
絎洓閮ㄥ垎灝辨槸鐪熸鐨勬暟鎹紝姣斿瀹藉害鍜岄珮搴﹀垎鍒槸320鍜?/span>240錛岃繖閮ㄥ垎鏁版嵁鐨勯暱搴﹀簲璇ヤ負320*240*3錛堟瘡涓儚绱犵偣涓婃湁3涓瓧鑺傦紝鍒嗗埆鐢ㄦ潵琛ㄧずb,g,r鐨勯鑹詫級銆?/span>
鏍規(guī)嵁瀵?/span>BMP鏍煎紡鐨勮鏄庯紝鎴戜滑鍙互杞繪槗鐨勫啓鍑轟竴涓敓鎴?/span>BMP鍥懼儚鐨勫嚱鏁幫紝濡備笅鎵紺猴細
void saveBmp(const char* name ,int width,int height, unsigned char* data)
{
BMPHeader hdr;
BMPInfoHeader infoHdr;
int x, y;
infoHdr.size = 40;
infoHdr.width = width;
infoHdr.height = height;
infoHdr.planes = 1;
infoHdr.bitsPerPixel = 24;
infoHdr.compression = 0;
infoHdr.imageSize =width* height * 3;
infoHdr.xPelsPerMeter = 0;
infoHdr.yPelsPerMeter = 0;
infoHdr.clrUsed = 0;
infoHdr.clrImportant = 0;
hdr.type = 0x4D42;
hdr.reserved1 = 0;
hdr.reserved2 = 0;
hdr.offset = 54;
hdr.size =(DWORD)(sizeof(BMPHeader)+sizeof(BMPInfoHeader)+width* height * 3);
FILE *fd;
if( !(fd = fopen(name,"wb+")) )
{
printf("***BMP load error: file access denied***\n");
exit(0);
}
fwrite(&hdr,1,sizeof(BMPHeader),fd);
fwrite(&infoHdr,1,sizeof(BMPInfoHeader),fd);
fwrite(data,1,width* height * 3,fd);
fclose(fd);
}
浠巓pengl涓鍙栧満鏅篃寰堢畝鍗曪紝灝辨槸涓嚱鏁板氨鎼炲畾錛屽簾璇濆皯璇達紝鐩存帴涓婁唬鐮侊細
void
saveSceneImage()
{
GLint pView[4];
glGetIntegerv(GL_VIEWPORT,pView);
GLsizei numComponet = 3;
GLsizei bufferSize = pView[2]*pView[3]*sizeof(GLfloat)*numComponet;
GLfloat* _data = new GLfloat[bufferSize];
unsigned char* data = new unsigned char[bufferSize];
glReadPixels(pView[0],pView[1],pView[2],pView[3],GL_RGB,GL_FLOAT,_data);
for (int i = 0 ; i <bufferSize ; i ++)
{
{
data[i] = _data[i] * 256;
}
}
saveBmp("1.bmp",pView[2],pView[3],data);
delete[] data;
delete[] _data;
}
鏈夊摢浣嶆湅鍙嬫湁鏇村ソ鐨勬柟娉曪紝嬈㈣繋璁ㄨ
l 鎴戠殑鏂規(guī)硶榪樻瘮杈冪鎷欙紝鍏堢粯鍒朵竴閬嶅満鏅紝璁$畻鍑烘繁搴︼紝瀛樺偍鍒頒竴涓汗鐞嗕腑銆傜劧鍚庣浜岄亶緇樺埗鐨勬椂鍊欙紝鎶婄偣鐢ㄧ涓嬈$粯鍒剁殑鏃跺欑殑鐭╅樀鍙樻崲涓涓嬶紝璇誨彇鍑虹汗鐞嗕腑鐨勫間簬鍙樻崲鍚庣殑z姣旇緝銆傛湡闂撮亣瑙佷簡濂囨殑鐭╅樀涓嶄竴鑷撮棶棰橈紝瀵逛簬opengl涓煩闃佃窡cg鐨勭煩闃墊湁浠涔堝叧緋伙紝榪樻槸涓嶅ぇ娓呮錛屼負浠涔堜粠opengl涓鍑虹殑鐭╅樀鐩存帴杈撳叆鍒?/font>cg涓氨涓嶅鍛紝闈炶鐢ㄤ粬鍐呯疆鐨勫彉閲忓憿錛?/font>
l 澶у湴褰㈡椂閿嬌鐜拌薄榪樻槸姣旇緝涓ラ噸錛岃櫧鐒墮噰鏍蜂簡9涓偣錛屼絾鏄繃搴﹁繕鏄笉閭d箞鑷劧銆?/font>
鐜板湪妯℃嫙鍑烘潵鐨勭幇璞★紝姣旇緝鍍忕偣鍏夋簮銆傝窡閫忚鎶曞獎鏈夊叧鍚э紝閭d箞瑕佹槸妯℃嫙澶槼鍏夛紝鏄笉鏄氨寰楃敤姝d氦鎶曞獎鍛紵
濡傛灉鍝綅澶у摜鑳藉府鍔╂垜瑙e喅榪欎簺鐤戦棶錛屼笉鑳滄劅嬋錛?br>
闄勫嚑寮犳晥鏋滃浘錛岀粰澶у濞變箰涓涓?)
// 涓嬮潰姣忚涓涓柊鍧楋紝閮借鍒ゆ柇涓涓嬪潡鐨処D錛屽鏋滆鍧楁槸闇瑕佺殑璇誨叆鐨勶紝鍒欑戶緇繘琛?br> // 濡傛灉鏄笉闇瑕佽鍏ョ殑鍧楋紝鍒欑暐榪?/p>
// 緇х畫璇誨叆瀛愬潡錛岀洿鍒拌揪鍒伴瀹氱殑闀垮害
while (pPreviousChunk->bytesRead < pPreviousChunk->length)
{
// 璇誨叆涓嬩竴涓潡
ReadChunk(m_CurrentChunk);
// 鍒ゆ柇鍧楃殑ID鍙?br> switch (m_CurrentChunk->ID)
{
case VERSION: // 鏂囦歡鐗堟湰鍙?br>
// 鍦ㄨ鍧椾腑鏈変竴涓棤絎﹀彿鐭暣鍨嬫暟淇濆瓨浜嗘枃浠剁殑鐗堟湰
// 璇誨叆鏂囦歡鐨勭増鏈彿錛屽茍灝嗗瓧鑺傛暟娣誨姞鍒癰ytesRead鍙橀噺涓?br> m_CurrentChunk->bytesRead += fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
// 濡傛灉鏂囦歡鐗堟湰鍙峰ぇ浜?錛岀粰鍑轟竴涓鍛婁俊鎭?br> if (version[0] > 0x03) // 娉ㄦ剰錛氭澶勫師涓?span style="COLOR: red">version0 > 0x03
MessageBox(NULL, "This 3DS file is over version 3 so it may load incorrectly", "Warning", MB_OK);
break;
case OBJECTINFO: // 緗戞牸鐗堟湰淇℃伅
// 璇誨叆涓嬩竴涓潡
ReadChunk(m_TempChunk);
// 鑾峰緱緗戞牸鐨勭増鏈彿
m_TempChunk->bytesRead += fread(&version, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer);
// 澧炲姞璇誨叆鐨勫瓧鑺傛暟
m_CurrentChunk->bytesRead += m_TempChunk->bytesRead;
// 榪涘叆涓嬩竴涓潡
ProcessNextChunk(pModel, m_CurrentChunk);
break;
case MATERIAL: // 鏉愯川淇℃伅
// 鏉愯川鐨勬暟鐩掑
pModel->numOfMaterials++;
// 鍦ㄧ汗鐞嗛摼琛ㄤ腑娣誨姞涓涓┖鐧界汗鐞嗙粨鏋?br> pModel->pMaterials.push_back(newTexture);
// 榪涘叆鏉愯川瑁呭叆鍑芥暟
ProcessNextMaterialChunk(pModel, m_CurrentChunk);
break;
case OBJECT: // 瀵硅薄鐨勫悕縐?br>
// 璇ュ潡鏄璞′俊鎭潡鐨勫ご閮紝淇濆瓨浜嗗璞′簡鍚嶇О
// 瀵硅薄鏁伴掑
pModel->numOfObjects++;
// 娣誨姞涓涓柊鐨則Object鑺傜偣鍒板璞¢摼琛ㄤ腑
pModel->pObject.push_back(newObject);
// 鍒濆鍖栧璞″拰瀹冪殑鎵鏈夋暟鎹垚鍛?br> memset(&(pModel->pObject[pModel->numOfObjects - 1]), 0, sizeof(t3DObject));
// 鑾峰緱騫朵繚瀛樺璞$殑鍚嶇О錛岀劧鍚庡鍔犺鍏ョ殑瀛楄妭鏁?br> m_CurrentChunk->bytesRead += GetString(pModel->pObject[pModel->numOfObjects - 1].strName);
// 榪涘叆鍏朵綑鐨勫璞′俊鎭殑璇誨叆
ProcessNextObjectChunk(pModel, &(pModel->pObject[pModel->numOfObjects - 1]), m_CurrentChunk);
break;
case EDITKEYFRAME:
// 璺寵繃鍏抽敭甯у潡鐨勮鍏ワ紝澧炲姞闇瑕佽鍏ョ殑瀛楄妭鏁?br> m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
break;
default:
// 璺寵繃鎵鏈夊拷鐣ョ殑鍧楃殑鍐呭鐨勮鍏ワ紝澧炲姞闇瑕佽鍏ョ殑瀛楄妭鏁?br> m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
break;
}
// 澧炲姞浠庢渶鍚庡潡璇誨叆鐨勫瓧鑺傛暟
pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead;
}
// 閲婃斁褰撳墠鍧楃殑鍐呭瓨絀洪棿
delete m_CurrentChunk;
m_CurrentChunk = pPreviousChunk;
}
鎴戞兂澶у瀵硅繖孌典唬鐮侀兘寰堢啛鎮(zhèn)夛紝涓嶇煡澶у鏄惁涔熼亣瑙佽繃璺熸垜綾諱技鐨勯棶棰橈紝涔熶笉鐭ラ亾鎴戣鏄庣櫧浜嗛棶棰樻病鏈夛紝鍙笇鏈涘澶у鏈夋墍甯姪O(∩_∩)O 銆?/p>
1. 鍦板艦鏁版嵁鐩存帴浠巄mp鏂囦歡涓鍏ョ殑銆?br>2. 綰圭悊娣峰悎鐢ㄧ殑cg璇█錛屽湪gpu涓婂疄鐜扮殑銆?br>3.姘撮潰閲囩敤鐨勬姌灝勶紝鍙嶅皠鍜屾硶綰胯創(chuàng)鍥俱?br>4.絎竴嬈″彂甯栵紝鍙戝浘綰康銆?br>