OpenGL ES入门
OpenGL ES渲染管線(xiàn)概述
渲染管線(xiàn)一般是由顯示芯片GPU內(nèi)部處理圖形信號(hào)的并行處理單元組成,這些并行處理單元之間是獨(dú)立的,從另一個(gè)角度看,渲染管線(xiàn)實(shí)際上也是一系列繪制過(guò)程,這一系列過(guò)程的輸入是待繪制物體的相關(guān)描述信息,輸出的是要顯示的圖像幀數(shù)據(jù)。
OpenGL ES管線(xiàn)主要包括:
讀取頂點(diǎn)數(shù)據(jù)—>頂點(diǎn)著色器—>組裝圖元—>光柵化圖元—>片元著色器—>寫(xiě)入幀緩沖區(qū)—>顯示到屏幕上
- 讀取頂點(diǎn)數(shù)據(jù)指的是將待繪制的圖形的頂點(diǎn)數(shù)據(jù)傳遞給渲染管線(xiàn)中。
- 頂點(diǎn)著色器最終生成每個(gè)定點(diǎn)的最終位置,執(zhí)行頂點(diǎn)的各種變換,它會(huì)針對(duì)每個(gè)頂點(diǎn)執(zhí)行一次,確定了最終位置后,OpenGL就可以把這些頂點(diǎn)集合按照給定的參數(shù)類(lèi)型組裝成點(diǎn),線(xiàn)或者三角形。
- 組裝圖元階段包括兩部分:圖元的組裝和圖元處理,圖元組裝指的是頂點(diǎn)數(shù)據(jù)根據(jù)設(shè)置的繪制方式參數(shù)結(jié)合成完整的圖元,例如點(diǎn)繪制方式中每個(gè)圖元就只包含一個(gè)點(diǎn),線(xiàn)段繪制方式中每個(gè)圖源包含兩個(gè)點(diǎn);圖元處理主要是剪裁以使得圖元位于視景體內(nèi)部的部分傳遞到下一個(gè)步驟,視景體外部的部分進(jìn)行剪裁。視景體的概念與投影有關(guān)。
- 光柵化圖元主要指的是將一個(gè)圖元離散化成可顯示的二維單元片段,這些小單元稱(chēng)為片元。一個(gè)片元對(duì)應(yīng)了屏幕上的一個(gè)或多個(gè)像素,片元包括了位置,顏色,紋理坐標(biāo)等信息,這些值是由圖元的頂點(diǎn)信息進(jìn)行插值計(jì)算得到的。
- 片元著色器為每個(gè)片元生成最終的顏色,針對(duì)每個(gè)片元都會(huì)執(zhí)行一次。一旦每個(gè)片元的顏色確定了,OpenGL就會(huì)把它們寫(xiě)入到幀緩沖區(qū)中。
在OpenGL ES2.0中主要的兩個(gè)部分就是上面的可編程頂點(diǎn)著色器和片段著色器。學(xué)習(xí)OpenGL ES主要是要了解渲染管線(xiàn),了解CPU的渲染過(guò)程,主要編程工作在于頂點(diǎn)著色器和片元著色器的編寫(xiě)。
繪制一個(gè)六邊形
效果如圖所示
六邊形類(lèi)
六邊形View
public class SixView extends GLSurfaceView{public SixView(Context context) {super(context);setEGLContextClientVersion(2);setRenderer(new MyRender());}class MyRender implements GLSurfaceView.Renderer {private SixShape circle;@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1);circle = new SixShape(0.5f);GLES20.glEnable(GLES20.GL_DEPTH_TEST);}// 投影矩陣private final float[] mProjectionMatrix = new float[16];// 視圖矩陣private final float[] mViewMatrix = new float[16];// 模型矩陣private final float[] mMMatrix = new float[16];private final float[] mViewProjectionMatrix = new float[16];private final float[] mMVPMatrix = new float[16];@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {GLES20.glViewport(0, 0, width, height);float ratio= (float) width / height;// 設(shè)置正交投影Matrix.orthoM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 0, 5);// 設(shè)置視圖矩陣Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0);}@Overridepublic void onDrawFrame(GL10 gl) {GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);// 設(shè)置模型矩陣Matrix.setIdentityM(mMMatrix, 0);Matrix.translateM(mMMatrix,0,0,0,1);Matrix.rotateM(mMMatrix, 0, 30, 0, 0, 1);Matrix.multiplyMM(mMVPMatrix, 0, mViewProjectionMatrix, 0, mMMatrix, 0);circle.draw(mMVPMatrix);}}}接下來(lái)在Activity中就可以使用這個(gè)View了。上面的例子雖然簡(jiǎn)單,但是包括了使用OpenGL ES編程的主要流程,包括生成頂點(diǎn)數(shù)據(jù),編寫(xiě)頂點(diǎn)著色器,片元著色器,傳遞數(shù)據(jù)給頂點(diǎn)/片元著色器,這里最主要的就是著色器語(yǔ)言。此外包括投影,平移,旋轉(zhuǎn)等操作。在后面會(huì)詳細(xì)學(xué)習(xí)每個(gè)細(xì)節(jié)以及上面例子沒(méi)有涉及到的光照,紋理等OpenGL的知識(shí)。
轉(zhuǎn)載于:https://www.cnblogs.com/qhyuan1992/p/6071972.html
總結(jié)
以上是生活随笔為你收集整理的OpenGL ES入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sql注入基于错误-单引号-字符型
- 下一篇: day⑥:面向对象