渲染世界的OPENGL 16 紋理高階 紋理陣列

2021-07-23 08:40:38 字數 2422 閱讀 7782

著色器可以一次性訪問幾個紋理物件,我們可以進一步使用稱為紋理陣列的特性。

在紋理陣列上,我們可以將整個陣列的紋理影象繫結到乙個紋理物件上,然後在著色器當中對他們進行檢索,這樣就大大增加著色器可用紋理資料的數量。

(1)載入2d紋理陣列

紋理陣列新增了兩個新的紋理物件作為大多數紋理管理函式的有效引數:gl_texture_1d_array, gl_texture_2d_array。對於這些二維月亮,就像是一般紋理一樣將他們建立和繫結到紋理上,不同的只是在這裡改變了target引數。

glgentextures(1, &moontexture);

glbindtexture(gl_texture_2d_array, moontexture);

glpixelstorei(gl_unpack_alignment, 1);

gltexparameteri(gl_texture_2d_array, gl_texture_wrap_s, gl_clamp_to_edge);

gltexparameteri(gl_texture_2d_array, gl_texture_wrap_t, gl_clamp_to_edge);

gltexparameteri(gl_texture_2d_array, gl_texture_min_filter, gl_linear);

gltexparameteri(gl_texture_2d_array, gl_texture_mag_filter, gl_linear);

而且對於2d紋理陣列來說,使用glteximage3d函式:

glteximage3d(gl_texture_2d_array, 0, gl_rgba, 64, 64, 30, 0,

gl_bgra, gl_unsigned_byte, null);

引數代表2d影象切片或陣列索引。關於這個方程的使用,乙個優點是可以一次性載入整個2d影象陣列。使用這個方程的乙個缺點是,需要一次性載入乙個2d圖項陣列。但是如果我們將最後乙個引數設定為null作為最後乙個引數,opengl會保留紋理儲存空間,但是會將他們保持為未初始化狀態。

然後需要載入其他影象,每次載入乙個。我們設定乙個迴圈,用來根據迴圈索引為每個檔案建立檔名。並且使用glteximage3d函式載入影象。每次載入乙個切片。

for (int i = 0; i < 29; i++)
(2)紋理陣列索引

再對月亮進行渲染之前繫結到這個紋理物件上,然後通過乙個取樣器來訪問整個月亮影象陣列。我們需要一種方式和著色器進行通訊來確定要使用哪個影象。可以設定乙個計時器,隨著秒數的變化而進行迴圈。再對月亮進行渲染之前,下面的**會在頂點著色器中設定恰當的統一值。

// ftime goes from 0.0 to 28.0 and recycles

float ftime = timer.getelapsedseconds();

ftime = fmod(ftime, 28.0f);

gluniform1f(loctimestamp, ftime);

moonbatch.draw();

在著色器中,已經有了乙個接受紋理座標的屬性,而我們只要將s和t座標複製到vec3變數的vmooncoords中就可以了。紋理座標p來自包含經過時間(不要忘記,我們的迴圈實際上是從0到28)的統一值而第三個紋理座標維度值隨後在片段著色器當中使用。

#version 330

#extension gl_ext_texture_array: require

invec4 vvertex;

invec4 vtexcoords;

uniform

mat4 mvpmatrix;#extension gl_ext_texture_array: require

uniform

float ftime;

smooth

outvec3 vmooncoords;

void main(void)

頂點著色器

(3)訪問紋理陣列

在片段著色器中,有乙個新型別的2d紋理陣列取樣器sample2darray。使用texture2darray函式對這個紋理進行取樣,並且傳遞乙個3分量紋理座標。這個紋理座標的前兩個分量s和t用作典型的二維紋理座標。第三個分量p實際上是紋理陣列的乙個整形索引。

#version 330

#extension gl_ext_texture_array: require

outvec4 vfragcolor;

uniform

sampler2darray moonimage;

smooth

invec3 vmooncoords;

void main(void)

OpenGL渲染管線之紋理(三)

概述 紋理時乙個2d 也可以是1d或者3d 用來讓圖形看起來更真實。是一種很簡單就能夠模擬真實的方法,因為如果不使用紋理,那麼我們就必須為所有細節構建頂點和圖形,這樣的開銷會非常大,有了紋理後,我們就只需要少很多的頂點,然後把紋理貼上去就可以了,及時有些不真實,但是也看不出來。紋理座標 紋理座標的原...

Opengl中的FBO渲染到紋理

渲染到紋理用途 遊戲中水的倒影,汽車的反光鏡,gpgpu必備。實現參見紅皮書的 至於ogre中的渲染到紋理可以參考翻譯文件第八章 ogre渲染目標 渲染到紋理 技術,本質上來說就是一次對場景中幾何體的渲染過程。它本身要花費一些執行時間,進而導致幀速的下降。當你渲染複雜耗時的內容的時候,你不得不考慮相...

OpenGL的紋理顯示 筆記

定義頂點陣列vertex array 1到1之間及紋理座標 0到1之間 生成紋理 glgentextures 繫結紋理 glbindtexture 引數gl texture 2d告訴opengl,這應該被作為乙個二維紋理對待 載入紋理到opengl teximage2d,把點陣圖資料複製到當前繫結的...