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

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,卻發現需要的是三角形??次疑厦娴拇a中的一段,保準你看的舒心,用的省心。(雞蛋皮鞋亂飛中)。
  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)  編輯 收藏 引用 所屬分類: 無庸技術
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

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

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

新聞檔案

同學們Blog

搜索

  •  

積分與排名

  • 積分 - 55218
  • 排名 - 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>
            欧美成人午夜免费视在线看片 | 国产精品成人一区| 亚洲综合色视频| 99国产精品久久久久久久久久| 亚洲精品国产精品久久清纯直播 | 亚洲美女免费视频| 一本色道久久综合狠狠躁的推荐| 99精品国产在热久久下载| 亚洲精品之草原avav久久| 亚洲视频大全| 久久五月婷婷丁香社区| 欧美激情视频免费观看| 一区二区av| 久久久久九九视频| 欧美日韩精品一区二区三区| 国产精品色一区二区三区| 好看不卡的中文字幕| 亚洲欧洲在线视频| 午夜精品久久久久久久白皮肤| 久久久人成影片一区二区三区 | 欧美成人免费全部| 一本大道久久a久久精二百| 亚洲午夜精品| 欧美二区在线播放| 国产中文一区| 亚洲免费小视频| 亚洲二区免费| 欧美一区在线视频| 香蕉久久夜色| 国产欧美日韩亚州综合| 欧美电影在线| 国产一区二区三区四区老人| 91久久精品国产91性色| 欧美一区二区三区喷汁尤物| 欧美国产视频日韩| 久久国产高清| 国产欧美在线播放| 亚洲一区免费| 亚洲激情小视频| 久久视频精品在线| 国产欧美精品日韩区二区麻豆天美 | 国产日韩亚洲欧美| 亚洲一区日本| 亚洲精品国偷自产在线99热| 久久美女性网| 在线观看国产成人av片| 欧美一区二区精品久久911| 亚洲精品偷拍| 欧美精品亚洲精品| 亚洲精品视频中文字幕| 久久一区精品| 久久久国产成人精品| 国产人成一区二区三区影院| 亚洲在线中文字幕| 在线亚洲电影| 国产精品美女主播在线观看纯欲| 亚洲视频一起| 亚洲天堂av电影| 国产精品日本一区二区| 午夜在线a亚洲v天堂网2018| 国产精品99久久不卡二区| 欧美日韩国产在线播放| 在线亚洲欧美专区二区| 99天天综合性| 国产精品一区二区三区久久 | 欧美亚洲综合另类| 欧美一级黄色网| 精品99一区二区三区| 免费亚洲网站| 欧美日韩不卡一区| 性欧美videos另类喷潮| 香蕉久久国产| 在线观看欧美亚洲| 亚洲精品久久| 国产精品综合av一区二区国产馆| 欧美一区二区三区久久精品| 亚洲欧美精品在线观看| 狠狠色伊人亚洲综合网站色| 欧美成人免费全部观看天天性色| 欧美精品aa| 欧美亚洲在线观看| 久久综合狠狠综合久久综青草| 91久久久在线| 亚洲性视频网站| 亚洲成人在线视频播放| 久久久久久999| 欧美日韩黄视频| 午夜精彩视频在线观看不卡| 午夜久久美女| 亚洲激情小视频| 亚洲影院色在线观看免费| 国产一区二区日韩| 日韩图片一区| 一区视频在线| 亚洲一区二区三区中文字幕在线 | 99re66热这里只有精品3直播| 中文在线一区| 最新中文字幕亚洲| 亚洲午夜精品一区二区| 在线看无码的免费网站| 在线亚洲激情| 亚洲三级视频在线观看| 午夜在线播放视频欧美| 在线一区二区视频| 久久午夜激情| 久久久久久久91| 国产精品久久一卡二卡| 亚洲国产欧美一区二区三区同亚洲| 国产精品亚洲а∨天堂免在线| 欧美成年人视频网站| 国产精品免费福利| 亚洲精品欧美极品| 亚洲韩国精品一区| 久久gogo国模裸体人体| 亚洲一区二区三区影院| 毛片一区二区三区| 老牛国产精品一区的观看方式| 国产精品久久77777| 亚洲人成网站精品片在线观看| 一区视频在线看| 久久狠狠亚洲综合| 久久国产精品黑丝| 国产乱码精品一区二区三区忘忧草| 亚洲七七久久综合桃花剧情介绍| 一区二区亚洲| 欧美在线观看视频在线| 亚洲在线视频观看| 国产精品yjizz| 一本色道久久综合亚洲精品按摩| 亚洲美女黄色片| 欧美激情一区二区三区 | 亚洲国产精品一区制服丝袜| 国产在线拍揄自揄视频不卡99| 亚洲欧美日韩精品综合在线观看| 亚洲男人影院| 国产欧美一区二区三区沐欲 | 欧美人与性动交α欧美精品济南到| 蜜桃av一区二区| 在线欧美亚洲| 女人香蕉久久**毛片精品| 免费观看国产成人| 亚洲福利视频免费观看| 久久这里有精品视频| 欧美va日韩va| 亚洲国产欧美日韩| 欧美日韩美女在线观看| 亚洲一区三区在线观看| 欧美色区777第一页| 亚洲视频网在线直播| 午夜日本精品| 国内精品写真在线观看| 久久久久国产精品www| 欧美成人激情视频免费观看| 亚洲国产99| 欧美日韩亚洲视频| 亚洲一区二区三区精品视频| 久久精品中文字幕免费mv| 伊人久久大香线| 欧美激情视频一区二区三区不卡| 亚洲精品久久| 午夜精品美女自拍福到在线 | 欧美不卡一区| 亚洲午夜在线| 国产在线欧美日韩| 欧美人与性动交α欧美精品济南到 | 国产精品免费视频xxxx| 午夜欧美不卡精品aaaaa| 老色批av在线精品| 一个色综合av| 国产一区二区久久久| 欧美成人四级电影| 午夜精品久久久久久99热| 久久午夜视频| 制服诱惑一区二区| 精品999成人| 国产精品久久久久久久浪潮网站| 久久久久久久综合| 一区二区三区 在线观看视频| 久久另类ts人妖一区二区| 亚洲精品少妇网址| 狠狠久久五月精品中文字幕| 欧美日韩免费视频| 狼人天天伊人久久| 亚洲综合欧美| 亚洲免费精彩视频| 欧美1区2区3区| 欧美一区二区三区日韩视频| 亚洲免费观看| 影音先锋一区| 国产午夜久久| 欧美视频三区在线播放| 老司机精品久久| 久久精品一区四区| 亚洲一区二区精品在线| 日韩亚洲精品在线| 亚洲国产欧美在线人成| 久久综合伊人77777蜜臀| 午夜日韩视频| 亚洲欧美日韩在线播放| 中文日韩电影网站|