OpenGLES是針對嵌入式設備而設計的,其實際是OpenGL的裁剪版本。java
變換流程包括:物體座標系->世界座標系->攝像機座標系->裁剪空間->標準設備空間->實際窗口空間編程
這裏面有時會用座標系,有時會用空間,這主要是側重點不同。當使用座標系時,是由於咱們關注點的座標和它的變換,當使用空間時,是爲了強調這是一個有限的空間,超出空間的點會被裁剪。設計
物體座標系是指繪製物體的座標系。code
世界座標系是指擺放物體的座標系。其實這和物體座標系是同一個座標系,由於咱們在世界座標系裏添加物體時,會作兩件事:一、(習慣)在原點附近繪製物體。二、旋轉、平臺物體到某個位置,作第一步時叫物體座標系,作第二步時叫世界座標系。物體座標系到世界座標系的變換就是"擺放"。爲何要分兩步?由於當咱們要再放一個一樣的物體到世界座標系時,能夠重用第一步的代碼。class
攝像機座標系是攝像機位置爲原點,Z軸負方向和視線方向一致,Y軸正方向和攝像機上方向一致的座標系。攝像機位置、攝像機上方向和視線方向都是經過調用setLookAtM設置的,調用這個方法時,這些座標和方向仍是相對於世界座標系的,畢竟攝像座標系還沒出來呢。世界座標系到攝像座標系的變換在設置完攝像機座標系後就肯定了,不須要手動去設置。變量
裁剪空間是攝像機座標系中的一個六面體空間。經過設置正交投影或透視投影來肯定裁剪空間,只有裁剪空間裏面的物體纔可能被用戶看到。固然物體如今仍是在攝像機座標系中,能夠理解成沒有對物體作變換。方法
標準設備空間是一個3軸的座標範圍都是-1~1的3維空間。標準設備空間是由裁剪空間變換得來的,無論是透視投影設置的四棱臺,仍是正交投影設置得長方體,都會變成一個正方體。這裏不單包含一個形變,還包括一個座標系的變換,不過這個變換也不須要手動去設置,在設置投影時這個變換就肯定了。項目
實際窗口空間是在實際窗口座標系中設置得視口區域。窗口座標系是由使用的控件(SurfaceView或TextureView……)決定的,並非手機屏幕,由於控件能夠小於屏幕、等於屏幕甚至大於屏幕。窗口座標系是以控件的左下角爲原點的座標系。實際窗口空間是這個座標系裏的一塊區域。環境變量
在使用固定管線時,座標系和座標系之間變換,就像設置環境變量同樣,設置好這些變量,繪製物體,而後物體就會出如今咱們指望的地方。嵌入式
在使用可編程管線時,這些變換會變成一個MVP矩陣,繪製物體的頂點和這個矩陣相乘,而後它們就會變換到相應的位置。
PS:整理這個,是由於在看項目代碼時,沒理解:將MVP矩陣直接設置成單位矩陣的代碼,並且跑出正常的效果的狀況。將MVP矩陣設置成單位矩陣,其實就是直接在標準設備空間裏繪製物體。
補充一個矩陣變換的小知識:
在可編程管線中,無論是頂點座標變換,仍是紋理座標變換,最後都是生成一個矩陣,右乘原始座標。即Vector = Mat * Vector。
這些變換是最後調用先生效。即Vector = Mat * Mat_scale * Mat_translate * Mat_rotate * Vector。
Matrix.scaleM Matrix.translateM Matrix.rotateM