opengl學(xué)習(xí)-立方體貼圖

立方體貼圖通過方向向量來進(jìn)行索引/采樣。

創(chuàng)建立方體貼圖

unsigned int textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);

//GL_TEXTURE_CUBE_MAP_POSITIVE_X    右
//GL_TEXTURE_CUBE_MAP_NEGATIVE_X    左
//GL_TEXTURE_CUBE_MAP_POSITIVE_Y    上
//GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    下
//GL_TEXTURE_CUBE_MAP_POSITIVE_Z    后
//GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    前
//枚舉值 可以通過每次迭代加一來遍歷紋理目標(biāo)
int width, height, nrChannels;
unsigned char *data;  
for(unsigned int i = 0; i < textures_faces.size(); i++)
{
    data = stbi_load(textures_faces[i].c_str(), &width, &height, &nrChannels, 0);
    glTexImage2D(
        GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 
        0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data
    );
}

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

優(yōu)化天空盒

將觀察矩陣轉(zhuǎn)換為3x3矩陣再將其轉(zhuǎn)換回4x4矩陣可以移除位移冈绊,保留旋轉(zhuǎn)侠鳄,使視角永遠(yuǎn)處于天空盒的中心。

glm::mat4 view = glm::mat4(glm::mat3(camera.GetViewMatrix()));

在頂點(diǎn)著色器中將z設(shè)為w值死宣,使得天空盒的深度值永遠(yuǎn)是1伟恶。然后將深度函數(shù)設(shè)為GL_LEQUAL,使得深度值小于等于1就可以測(cè)試通過毅该。這樣就可以在最后繪制天空盒且只在沒有物體的地方渲染天空盒來提升性能博秫。

void main()
{
    TexCoords = aPos;
    vec4 pos = projection * view * vec4(aPos, 1.0);
    gl_Position = pos.xyww;
}
image.png

反射

GLSL內(nèi)建的reflect函數(shù)可以計(jì)算這個(gè)反射向量,根據(jù)鏡頭到觀察位置的向量作為入射角和法線向量使用reflect獲得反射向量,然后用反射向量采集立方體貼圖眶掌,達(dá)到環(huán)境貼圖的效果挡育。

#version 330 core
out vec4 FragColor;

in vec3 Normal;
in vec3 Position;

uniform vec3 cameraPos;
uniform samplerCube skybox;

void main()
{             
    vec3 I = normalize(Position - cameraPos);
    vec3 R = reflect(I, normalize(Normal));
    FragColor = vec4(texture(skybox, R).rgb, 1.0);
}
image.png

折射

GLSL的內(nèi)建refract函數(shù)來實(shí)現(xiàn),它需要一個(gè)法向量朴爬、一個(gè)觀察方向和兩個(gè)材質(zhì)之間的折射率静盅。

void main()
{             
    float ratio = 1.00 / 1.52;
    vec3 I = normalize(Position - cameraPos);
    vec3 R = refract(I, normalize(Normal), ratio);
    FragColor = vec4(texture(skybox, R).rgb, 1.0);
}
image.png

動(dòng)態(tài)環(huán)境貼圖

使用幀緩沖能夠?yàn)槲矬w的6個(gè)不同角度創(chuàng)建出場(chǎng)景紋理,并在每個(gè)渲染迭代中將它們儲(chǔ)存到一個(gè)立方體貼圖中寝殴。之后就可以使用動(dòng)態(tài)生成的立方體貼圖來創(chuàng)建更真實(shí)的蒿叠,包含其它物體的,反射和折射表面蚣常。但是需要為使用環(huán)境貼圖的物體渲染場(chǎng)景6次市咽,對(duì)程序是非常大的性能開銷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抵蚊,一起剝皮案震驚了整個(gè)濱河市施绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贞绳,老刑警劉巖谷醉,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冈闭,居然都是意外死亡俱尼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門萎攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遇八,“玉大人矛绘,你說我怎么就攤上這事∪杏溃” “怎么了货矮?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)斯够。 經(jīng)常有香客問我囚玫,道長(zhǎng),這世上最難降的妖魔是什么读规? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任劫灶,我火速辦了婚禮,結(jié)果婚禮上掖桦,老公的妹妹穿的比我還像新娘本昏。我一直安慰自己,他們只是感情好枪汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布涌穆。 她就那樣靜靜地躺著,像睡著了一般雀久。 火紅的嫁衣襯著肌膚如雪宿稀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天赖捌,我揣著相機(jī)與錄音祝沸,去河邊找鬼。 笑死越庇,一個(gè)胖子當(dāng)著我的面吹牛罩锐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卤唉,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涩惑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了桑驱?” 一聲冷哼從身側(cè)響起竭恬,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熬的,沒想到半個(gè)月后痊硕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡押框,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年岔绸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亭螟,死狀恐怖挡鞍,靈堂內(nèi)的尸體忽然破棺而出骑歹,到底是詐尸還是另有隱情预烙,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布道媚,位于F島的核電站扁掸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏最域。R本人自食惡果不足惜谴分,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镀脂。 院中可真熱鬧牺蹄,春花似錦、人聲如沸薄翅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘魄。三九已至鼎天,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暑竟,已是汗流浹背斋射。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留但荤,地道東北人罗岖。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腹躁,于是被迫代替她去往敵國(guó)和親呀闻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容