首先申明下,本文為筆者學習《opengl es應用開發實踐指南》的筆記,並加入筆者自己的理解和歸納總結。
1、透視除法
opengl會把每個gl_position的x、y和z分量都除以它的w分量。當w分量用來表示距離的時候,會使得較遠處的物體被移動到距離渲染區域中心更近的地方。
新增w分量建立三維圖
private static final int position_component_count = 4;
float tableverticeswith********s = ;
顯示如下
2、視椎體
視椎體是乙個立方體,其遠端比近端大,從而使其變成乙個被截斷的金字塔。視椎體有乙個焦點,當你用透視投影觀察乙個場景時,那個場景看上去就像你的頭被放在了焦點處。焦點和視椎體小端的距離被稱為焦距。
3、定義透視投影
matrix的perspectivem方法可以生成乙個透視投影
perspectivem(float m, int offset,
float fovy, float aspect, float near, float far)
投影矩陣,a代表焦距
4、繪製著色器(1) 使用投影矩陣
matrix.perspectivem(projectionmatrix, 0, 45, (float)width / (float)height, 1, 10);
(2) 在z軸上移動物體,先定義乙個modelmatrix模型
matrix.setidentitym(modelmatrix, 0);
matrix.translatem(modelmatrix, 0, 0, 0, -2.8f);
(3) 利用模型移動物體
matrix.multiplymm(modelprojectionmatrix, 0, projectionmatrix, 0, modelmatrix, 0);
(4) openglperspectiveshaderrender類
在onsu***cechanged方法,定義透視矩陣,並使用模型矩陣把資料顯示出來。
private class openglperspectiveshaderrender implements glsu***ceview.renderer ;
vertexdata = bytebuffer
.allocatedirect(tableverticeswith********s.length * bytes_per_float)
.order(byteorder.nativeorder())
.asfloatbuffer();
vertexdata.put(tableverticeswith********s);
} @override
public void onsu***cecreated(gl10 gl, eglconfig config)
@override
public void onsu***cechanged(gl10 gl, int width, int height)
@override
public void ondrawframe(gl10 gl)
}
顯示如下
5、增加旋轉
旋轉矩陣,繞x軸、y軸和z軸旋轉所用矩陣的定義
在modelmatrix進行平移以後,對模型進行旋轉操作
matrix.rotatem(modelmatrix, 0, -60, 1f, 0f, 0f);
顯示如下
android openGL 兩種投影方式
投影變換是一種很關鍵的圖形變換,opengl中只提供了兩種投影方式,一種是正射投影,另一種是透視投影。不管是呼叫哪種投影函式,為了避免不必要的變換,其前面必須加上以下兩句 glmatrixmode gl projection glloadidentity 事實上,投影變換的目的就是定義乙個視景體,使...
焦點透視與成角透視
我們之前說過透視現象有三種,按消失點的個數依次為焦點透視 成角透視和三點透視。那麼出現這三種透視現象是有條件的,前提條件是只有平視的情況下才會出現焦點透視和成角透視,同樣的,僅有非平視的時候才會出現三點透視。那麼,我們怎麼去理解這2個概念呢?圖九,通過三張立面示意圖可以看到。平視即視平線與水平面重疊...
Android OpenGL教程 第四課
android opengl 教程 第四課旋 在這一課裡,我將教會你如何旋轉三角形和四邊形。左圖中的三角形沿y軸旋轉,四邊形沿著x軸旋轉。我們增加兩個變數來控制這兩個物件的旋轉。這兩個變數加在程式的開始處其他變數的後面。它們是浮點型別的變數,使得我們能夠非常精確地旋轉物件。浮點數包含小數字置,這意味...