青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 43,  comments - 64,  trackbacks - 0
  這些都是超出White Paper的經驗總結,如有錯誤,請多多指正謝謝!
  1、使用哪個苦力
  你可以使用GPU或者是CPU,計算隨時間變化的高程。聽起來用GPU的Vertex Shader計算高程好像非常先進,其實不然。因為GPU與CPU的運作機制不同,每個FPS,傳入時間Uniform變量會導致GPU效率低下,在NVIDIA的GPU優化指南中提到過這一點。所以我還是推薦用CPU計算高程,因為牽涉到大量的三角函數的計算,不可能舍得寶貴的GPU資源浪費在這些CPU可以運作如飛的計算上。Vertex Shader應該做矩陣變換,光照向量等等。如果可能用匯編代碼優化一下,把傳入Vertex Shader的Normals給Normalize了。
  2、I want get the Mesh
  貼關鍵的完整代碼。
#ifndef?RK_HPP
#include?
"rk.hpp"
#endif

extern?GLint?AttribTangentSlot;
extern?GLint?LightPositionLoc;

CStreamModel::CStreamModel(
short?n?=?64,float?gl?=?1.0f)?:?N(n),GridLength(gl)
{
????
//準備物理參數
????EnvCubeMap?=?-1;//立方體環境貼圖
????NormalMap?=?-1;//發現貼圖,也就是凹凸圖
????RefractMap?=?-1;

????omiga?
=?new?float[4];
????A?
=?new?float[4];
????L?
=?new?float[4];
????Q?
=?new?float[4];

????A[
0]?=?0.05f;
????A[
1]?=?0.05f;
????A[
2]?=?0.02f;
????A[
3]?=?0.03f;

????L[
0]?=?1.0f;
????L[
1]?=?1.2f;
????L[
2]?=?2.0f;
????L[
3]?=?1.2f;

????
for(int?i=0;i<4;i++){
????????omiga[i]?
=?sqrt(9.8f*2.0f*3.14f/L[i]);//L?=?0.01
????????Q[i]?=?1/(omiga[i]*A[i]*4.0f);
????}
???
????
//Q?=?0.01235;
????Mesh?=?new?float[N*N*3];
????VertexIndex?
=?new?unsigned?short?[N*N*3];
????TexCoord?
=?new?float[N*N*2];
????Binormal?
=?new?float[N*N*3];
????Tangent?
=?new?float[N*N*3];
????Normal?
=?new?float[N*N*3];

????
//生成頂點索引?
????
//優化乘法?*N可以表示為?<<6
????
int?cnt?=?0;

????
for(int?i=0;?i<N-2;?i++)?
????{
????????
for(int?j=0;?j<N;?j++)?
????????{
????????????VertexIndex[cnt]?
=?i*N?+?j;?cnt++;?
????????????VertexIndex[cnt]?
=?i*N?+?j?+?N;?cnt++;?
????????}
????????i
++;?
????????j?
=?N-1;?
????????VertexIndex[cnt]?
=?i*N?+?j?+?N;?cnt++;?
????????VertexIndex[cnt]?
=?i*N?+?j;?cnt++;
????????
for(j=N-2;j>=0;j--)?
????????{
????????????VertexIndex[cnt]?
=?i*N?+?j?+?N;?cnt++;?
????????????VertexIndex[cnt]?
=?i*N?+?j;?cnt++;?
????????}
????}
????cout
<<"size?of?VertexIndex?:?"<<cnt<<endl;

????
int?p?=?0;
????
for(int?x?=?0;?x?<?N;?x++){
????????
for(int?z?=?0;?z?<?N;?z++){
????????????TexCoord[p
*2]?=?float(x)?/?float(N);
????????????TexCoord[
1+p*2]?=?float(z)?/?float(N);
????????????p
++;
????????}
????}
????
????
for(int?i=0;?i<16;?i++)
????????cout
<<"TexCoord?:?"<<TexCoord[i]<<endl;
????PixelProcesser?
=?new?CPixel();

????PixelProcesser
->LoadTextureFromBMP(".\\TEXTURES\\Waterbump.bmp",NormalMap);
????
if?(?glIsTexture(NormalMap)){
????????cout
<<"NormalMap?Texture?Loaded?Ok"<<endl;
????}
else{
????????cout
<<"NormalMap?Faild?!"<<endl;
????????_sleep(
2000);
????????exit(
-1);
????}

????PixelProcesser
->LoadTextureFromBMP(".\\TEXTURES\\WaterRefract.bmp",RefractMap);
????
if?(?glIsTexture(RefractMap)?){
????????cout
<<"WaterRefract?Texture?Loaded?Ok"<<endl;

????}
else{
????????cout
<<"RefractMap?Faild?!"<<endl;
????????_sleep(
2000);
????????exit(
-1);
????}

????
char?*szCubeFace[6]?=?{".\\TEXTURES\\RIGHT.bmp",".\\TEXTURES\\LEFT.bmp",".\\TEXTURES\\TOP.bmp",".\\TEXTURES\\BOTTOM.bmp",".\\TEXTURES\\BACK.bmp",".\\TEXTURES\\FRONT.bmp"};
?????PixelProcesser
->LoadTextureFrom6CUBEMAP(szCubeFace,EnvCubeMap);
????
if?(?glIsTexture(EnvCubeMap)){
????????cout
<<"CubeMap?Texture?Loaded?Ok"<<endl;

????}
else{
????????cout
<<"cubeMap?Faild?!"<<endl;
????????_sleep(
2000);
????????exit(
-1);
????}

};

void?CStreamModel::ReBuildHeightMap()
{
????
//Dx?Dy還沒有選擇,就用從內向外的斜方向?(-0.1,0,1)
????
????
//生成網格與紋理坐標還有TBN向量
????
//測試:只有一個方向
????
//i?行?j列?OpenGL是反的
????/**/
????
//cout<<"N?is?:?"<<N<<",?And?N^2?is?:?"<<N*N<<endl;

????
//float?fi?=?0.23;?//fi*t相位
????float?D[4][2]={};
????D[
0][0]?=?0.23f;
????D[
0][1]?=?-0.08f;
????
????D[
1][0]?=?0.12f;
????D[
1][1]?=?0.34f;
????
????D[
2][0]?=?-0.23f;
????D[
2][1]?=?-0.1f;

????D[
3][0]?=?-0.2f;
????D[
3][1]?=?0.01f;

????
int?i?=?0;
????
int?p?=?0;//位置

????
for(?int?i?=?0?;?i?<??N?;?i++?){
????????
for(?int?j?=?0?;?j?<?N?;?j++?){
????????????
float?x?=?i?/?8.0?-?4.0f;
????????????
float?z?=?j?/?8.0?-?4.0f;
????????????
//定點需要的三角計算
????????????float?sigemaCx?=?0.0f,sigemaCz?=?0.0f;
????????????
float?sigemaS?=?0.0f;
????????????
//向量需要的三角計算
????????????float?N1?=?0.0f;
????????????
float?N2?=?0.0f;
????????????
float?N3?=?0.0f;

????????????
float?T1?=?0.0f;
????????????
float?T2?=?0.0f;
????????????
float?T3?=?0.0f;

???????????
for(int?k=0;k<4;k++){
????????????????
float?C?=?cos(omiga[k]*(D[k][0]*x+D[k][1]*z)+t);
????????????????
float?S?=?sin(omiga[k]*(D[k][0]*x+D[k][1]*z)+t);
????????????????sigemaCx?
+=?Q[k]*A[k]*D[k][0]*C;
????????????????sigemaCz?
+=?Q[k]*A[k]*D[k][1]*C;
????????????????sigemaS?
+=?A[k]*C;
????????????????
float?OAC?=?omiga[k]*A[k]*C;
????????????????
float?OAS?=?omiga[k]*A[k]*S;
????????????????N1?
+=?D[k][0]*OAC;
????????????????N2?
+=?D[k][1]*OAC;
????????????????N3?
+=?Q[k]*OAS;
????????????????T1?
+=?Q[k]*D[k][0]*D[k][1]*OAS;
????????????????T2?
+=?Q[k]*pow(D[k][1],2)*OAS;
????????????????T3?
+=?D[k][1]*OAC;
????????????};
????????????
????????????Mesh[p
*3]?=?x?+?sigemaCx;
????????????Mesh[p
*3+2]?=?z?+?sigemaCz;
????????????Mesh[p
*3+1]?=?sigemaS;
????????????
????????????Normal[?p
*3?]?=?-?N1;
????????????Normal[?p
*3?+2]?=?-?N2;
????????????Normal[?p
*3?+1]?=?1?-?N3;

????????????Tangent[?p
*3?]?=?-T1;
????????????Tangent[?p
*3?+2]?=?1-T2;?
????????????Tangent[?p
*3?+1]?=?T3;

????????????p
++;
????????}
????}

????
//glEnableClientState(GL_INDEX_ARRAY);
????
//glIndexPointer(GL_SHORT,0,VertexIndex);
????t+=0.1f;
};

void?CStreamModel::Draw()
{????
????
//glutSolidSphere(1.0,32,32);
????glUniform3f(::LightPositionLoc,0,0,10);
????ReBuildHeightMap();
????glEnableClientState(GL_VERTEX_ARRAY);
????glEnableClientState(GL_NORMAL_ARRAY);
????glEnableVertexAttribArray(::AttribTangentSlot);
????glEnableClientState(GL_TEXTURE_COORD_ARRAY);
????glTexCoordPointer(
2,GL_FLOAT,0,TexCoord);
????glVertexPointer(
3,GL_FLOAT,0,Mesh);
????glNormalPointer(GL_FLOAT,
0,Normal);
????glVertexAttribPointer(::AttribTangentSlot,
3,GL_FLOAT,0,0,Tangent);
????glActiveTexture(GL_TEXTURE2);
????glEnable(GL_TEXTURE_CUBE_MAP);
????glBindTexture(GL_TEXTURE_CUBE_MAP,EnvCubeMap);
????glActiveTexture(GL_TEXTURE1);
????glBindTexture(GL_TEXTURE_2D,NormalMap);
????glActiveTexture(GL_TEXTURE0);
????glBindTexture(GL_TEXTURE_2D,RefractMap);

????glPushMatrix();
????????glTranslatef(
0,0,15);
????????glDrawElements(GL_TRIANGLE_STRIP,
7936,GL_UNSIGNED_SHORT,VertexIndex);
????glPopMatrix();
//????glPopMatrix();
????glDisableClientState(GL_VERTEX_ARRAY);
????glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableVertexAttribArray(::AttribTangentSlot);

};
  代碼很臭,大蝦不要見笑。在繪制函數中,最最關鍵的就是ReBuildHeightMap()這個函數。每個fps它都將被渲染器執行一次。公式參考了GPU GEMS。把參數解釋一下。Omiga,角頻率;A,水波的振幅;L,波長;Q很特殊,是一個可以控制水波形狀的參數,太大了會導致一個環。可惜我沒有學過流體力學那個NS方程,實在不清楚怎么回事。把頂點的高程,向量計算后,就可以傳入Shader計算了。可是,且慢。
  3、Vertex Or Triangles
  地形的索引是如何做的?這里水波的索引也就是如何做的。地形也就是個三角形拼成的大網。所以,當興沖沖的計算了一個1024x1024的巨大Water Vertex Mesh,卻發現需要的是三角形。看我上面的代碼中的一段,保準你看的舒心,用的省心。(雞蛋皮鞋亂飛中)。
  4、人要臉樹要皮
  好了,可以貼圖了。由于水是沒有顏色的,他只是靠反射折射獲取顏色。所以說,在Pixel(Fragment) Shader完成的工作是進行紋理貼圖的顏色調制。這個公式來自微軟研究院的幾個家伙的一White Paper。

CWater = FaboveCreflect+(1-Fabove)Crefract+AshadowCspecular
  準備好你的折射圖,也就是水底的貼圖,立方體貼圖也就是反射圖,以及你的Bump貼圖。這里陰影貼圖一般用BumpMapping了。那個GPU GEMS2中用Vertex Texture Fetch生成水波的,不是打擊其他人,需要一個非常有經驗的美工才行呵呵。F是Fresnel系數,也就是衰減系數。簡便的公式是
Fresnel = 1 - EyeDir*N或者是寫作1-cos(b)
  視覺向量與向量的點乘。我不知道應該轉換到正切空間中,從幾何的角度來說應該是一樣的。
  上面的混色公式用GLSL還是cg還是FX都可以很簡單的使用。

  關鍵就這些的差不多了。只需要一個很小的框架程序就可以很簡單的作一切了。

  我從來不封裝DLL,對于任何人來說,那些都是神秘的二進制。我只把我掌握的東西奉獻給大家,讓大多數人明白背后的道理。
posted on 2006-08-03 09:50 周波 閱讀(1157) 評論(0)  編輯 收藏 引用 所屬分類: 無庸技術
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

周波 87年出生 南京林業大學05421班242信箱 專業木材科學與工程工業裝備與過程自動化 遷移到 jedimaster(dot)cnblogs(dot)com

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

新聞檔案

同學們Blog

搜索

  •  

積分與排名

  • 積分 - 55217
  • 排名 - 421

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黄色日韩网站| 国产精品视频自拍| 亚洲国产精品va在看黑人| 久久嫩草精品久久久久| 欧美亚洲尤物久久| 国产日韩精品在线观看| 久久精品99国产精品| 欧美一区二区三区四区夜夜大片| 国产偷自视频区视频一区二区| 久久精品首页| 久久综合九色综合欧美就去吻| 亚洲青涩在线| 一本色道久久88综合亚洲精品ⅰ | 欧美激情亚洲精品| 中国成人亚色综合网站| 亚洲一区二区三区免费观看| 国产亚洲视频在线| 欧美激情一区在线| 欧美日韩午夜精品| 久久久久久69| 欧美精品色综合| 欧美一区二区三区视频在线观看| 久久精品亚洲国产奇米99| 亚洲日韩欧美视频一区| 在线一区视频| 亚洲国产成人午夜在线一区 | 久久综合九色| 欧美成在线视频| 久久国产高清| 欧美久久久久久久| 久久偷看各类wc女厕嘘嘘偷窃| 欧美电影资源| 久久久久久久97| 欧美日韩一区二区视频在线 | 欧美自拍偷拍| 欧美日韩二区三区| 欧美成人dvd在线视频| 国产精品国产成人国产三级| 欧美大片在线观看| 国产裸体写真av一区二区| 亚洲黄色在线观看| 国产欧美精品va在线观看| 亚洲国产网站| 亚洲国产欧美日韩精品| 亚洲免费一区二区| 亚洲午夜在线观看| 欧美成人首页| 麻豆精品一区二区综合av| 国产精品高潮呻吟视频| 亚洲精品123区| 亚洲激情在线观看视频免费| 久久精品免费电影| 欧美一区二区三区的| 欧美日韩黄色大片| 亚洲国产成人久久综合| 午夜精品999| 亚洲一区视频在线| 欧美日韩国产999| 亚洲国产色一区| 亚洲人体1000| 欧美高清在线视频观看不卡| 欧美mv日韩mv国产网站| 一区二区在线视频播放| 久久精品亚洲一区二区| 久久精品三级| 在线观看欧美日韩国产| 久久青青草综合| 欧美成人中文| 亚洲人成网站999久久久综合| 久久人人97超碰国产公开结果| 亚洲欧美日韩国产| 亚洲网站啪啪| 亚洲欧美成人网| 欧美色欧美亚洲另类二区| 亚洲伦理精品| 亚洲无线视频| 国产精品欧美风情| 性欧美1819性猛交| 久久一区二区三区四区| 国产一区在线看| 麻豆av一区二区三区久久| 欧美激情小视频| 亚洲网站在线播放| 国产精品综合av一区二区国产馆| 先锋影音国产精品| 免费看的黄色欧美网站| 亚洲人成网站影音先锋播放| 欧美日韩国产成人在线| 亚洲婷婷综合色高清在线| 欧美在线一二三四区| 伊人成人在线| 欧美精品亚洲精品| 一本色道久久综合亚洲精品婷婷| 欧美一区二区高清在线观看| 黄色日韩在线| 欧美猛交免费看| 亚洲欧美日韩在线播放| 裸体丰满少妇做受久久99精品| 亚洲美女av黄| 国产日韩欧美三级| 欧美国产视频在线观看| 亚洲一区欧美二区| 欧美刺激午夜性久久久久久久| 夜夜夜久久久| 国内精品久久久久伊人av| 欧美精品成人一区二区在线观看| 亚洲在线视频观看| 欧美国产视频在线观看| 午夜视频一区二区| 91久久精品日日躁夜夜躁欧美| 国产精品久久久久91| 久久在线视频| 校园激情久久| 日韩网站在线观看| 美女999久久久精品视频| 亚洲一区二区免费视频| 樱花yy私人影院亚洲| 国产精品日韩在线播放| 欧美大片在线观看| 欧美一区二区播放| 亚洲日本成人在线观看| 欧美一区二区三区视频| 一区二区不卡在线视频 午夜欧美不卡'| 国产精自产拍久久久久久| 欧美成人69| 午夜精品美女久久久久av福利| 亚洲乱码久久| 亚洲一区一卡| 99re热这里只有精品视频| 好吊色欧美一区二区三区四区 | 亚洲看片网站| 国产日韩亚洲欧美精品| 国产精品a久久久久| 欧美精品成人一区二区在线观看| 久久久综合香蕉尹人综合网| 午夜精品久久| 亚洲一区欧美二区| 亚洲尤物视频网| 亚洲影院污污.| 亚洲淫性视频| 亚洲综合视频网| 欧美亚洲免费高清在线观看| 亚洲一区www| 亚洲欧洲精品一区二区精品久久久| 国产婷婷色综合av蜜臀av| 国产麻豆午夜三级精品| 国产精品视频精品| 国产日本欧美在线观看| 国产精品手机在线| 国产精品综合av一区二区国产馆| 国产婷婷色一区二区三区在线| 国精产品99永久一区一区| 国产在线观看91精品一区| 黄色综合网站| 亚洲欧洲日产国码二区| 日韩视频在线一区二区三区| 洋洋av久久久久久久一区| 一区二区三区欧美视频| 午夜精品在线| 久久综合九色99| 91久久精品国产91久久性色| 亚洲毛片一区二区| 一区二区久久久久| 亚洲欧美视频在线观看视频| 久久超碰97人人做人人爱| 久久亚洲影音av资源网| 欧美美女bb生活片| 国产女精品视频网站免费| 激情综合视频| 一区二区三区毛片| 欧美一区在线视频| 女人色偷偷aa久久天堂| 99re这里只有精品6| 先锋影音久久久| 欧美国产一区视频在线观看| 国产精品毛片| 在线观看欧美日韩| 亚洲免费一级电影| 免费看的黄色欧美网站| 一区二区三区视频在线观看| 欧美一区二区三区喷汁尤物| 欧美成人亚洲成人| 国产麻豆精品久久一二三| 亚洲伦理中文字幕| 久久爱另类一区二区小说| 欧美激情四色| 久久精品一区二区| 欧美视频在线观看一区| 亚洲国产成人精品视频| 欧美一级专区免费大片| 亚洲国产日韩欧美一区二区三区| 亚洲欧美日本国产专区一区| 欧美精品播放| 亚洲国产91精品在线观看| 欧美有码视频| av不卡在线观看| 欧美成人一品| 亚洲第一视频网站| 欧美一区二区三区免费视频| 亚洲精选视频免费看|