1. 程式人生 > >Android OpenGL ES 2.0繪圖:繪製紋理

Android OpenGL ES 2.0繪圖:繪製紋理

http://mobile.51cto.com/aengine-437172.htm

  1. publicclass MyGLSurfaceView extends GLSurfaceView { 
  2. public MyGLSurfaceView(Context context) { 
  3. super(context); 
  4. setFocusableInTouchMode(true); 
  5. // Tell the surface view we want to create an OpenGL ES 2.0-compatible
  6. // context, and set an OpenGL ES 2.0-compatible renderer.
  7. this.setEGLContextClientVersion(2); 
  8. this.setRenderer(new MyRenderer()); 

並沒有什麼特別之處,android view的渲染操作需要實現一個render介面,GLSurfaceView的渲染介面為android.opengl.GLSurfaceView.Renderer。我們需要實現介面的方法。

java程式碼

  1. publicclass MyRenderer implements Renderer { 
  2. publicvoid onDrawFrame(GL10 gl) {} 
  3. publicvoid onSurfaceChanged(GL10 gl, 
    int width, int height) {} 
  4. publicvoid onSurfaceCreated(GL10 gl, EGLConfig config) {} 

介面實現3個方法,對應繪製,繪製區域變化,區域建立。需要說明的是引數GL10 gl是OpenGL ES1.x版本的物件。這裡我們不會使用到。還有一點就是,onDrawFrame方法的呼叫是有系統呼叫的,不需要手動呼叫。系統會以一定的頻率不斷的回撥。

接下來我們進入ES2.0的使用,上程式碼先:

java程式碼

  1. publicvoid onSurfaceCreated(GL10 gl, EGLConfig config) { 
  2. GLES20.glEnable(GLES20.GL_TEXTURE_2D); 
  3. // Active the texture unit 0
  4. GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
  5. loadVertex(); 
  6. initShader(); 
  7. loadTexture(); 

1、啟用2D紋理

繪製區域建立的時候,我們設定了啟用2D的紋理,並且激活了紋理單元unit0。什麼意思呢,說起來話長,以後慢慢說。簡單說一下,記住OpenGL 是基於狀態的,就是很多狀態的設定和切換,這裡啟用GL_TEXTURE_2D就是一個狀態的開啟,表明OpenGL可以使用2D紋理。

什麼是啟用紋理單元?這個和硬體有點關係,OpenGL要顯示卡會劃分儲存紋理的儲存區域不止一個區域。這裡是使用區域 unit 0,多重紋理繪製可以開啟多個,這個以後說。接下來,呼叫了三個函式,載入頂點,初始化著色器,載入紋理。

2、載入頂點

OpenGL繪製圖形是根據頂點以後連結起來的。為什麼要這樣,其實這樣很強大是一種設計吧。頂點可以暫時簡單理解為含有位置資訊的座標點。

java程式碼

  1. privatevoid loadVertex() { 
  2. // float size = 4
  3. this.vertex = ByteBuffer.allocateDirect(quadVertex.length * 4
  4. .order(ByteOrder.nativeOrder()) 
  5. .asFloatBuffer(); 
  6. this.vertex.put(quadVertex).position(0); 
  7. // short size = 2
  8. this.index = ByteBuffer.allocateDirect(quadIndex.length * 2
  9. .order(ByteOrder.nativeOrder()) 
  10. .asShortBuffer(); 
  11. this.index.put(quadIndex).position(0); 
  12. private FloatBuffer vertex; 
  13. private ShortBuffer index; 
  14. privatefloat[] quadVertex = newfloat[] { 
  15. -0.5f, 0.5f, 0.0f, // Position 0
  16. 01.0f, // TexCoord 0
  17. -0.5f, -0.5f, 0.0f, // Position 1
  18. 00// TexCoord 1
  19. 0.5f , -0.5f, 0.0f, // Position 2
  20. 1.0f, 0// TexCoord 2
  21. 0.5f, 0.5f, 0.0f, // Position 3
  22. 1.0f, 1.0f, // TexCoord 3
  23. }; 
  24. privateshort[] quadIndex = newshort[] { 
  25. (short)(0), // Position 0
  26. (short)(1), // Position 1
  27. (short)(2), // Position 2
  28. (short)(2), // Position 2
  29. (short)(3), // Position 3
  30. (short)(0), // Position 0
  31. }; 

FloatBuffer,ShortBuffer是封裝了本地資料結構的封裝物件。是 的,這個2個物件裡面的資料不被java虛擬機器管理,相當於C語言的儲存方式。quadVertex的資料就是一個矩形的座標,和紋理座標。一兩句話很難 解釋清楚,這裡涉及到openGL的幾個經典的座標系,下次說。概括的說,openGL的座標是單位化的,都是0.0-1.0的浮點型,螢幕的中心點是 (0,0)。而紋理的座標左下角是(0,0)。 這裡的quadVertex是在螢幕中大概花了一個矩形貼了一個圖片, position0 是左上點,以後左下,右下,右上的順序,紋理座標同理。

quadIndx是這剛才的這些頂點索引排列。這裡一個矩形也就4個頂點,每個頂點3個位置座標,2個紋理座標。也就是說一個頂點有5個float資料。至於為什麼頂點為什麼這麼排列下次說,是2個三角形合成了一個矩形,幾句話很難解釋清楚。

所以說,這段程式碼就是把矩形的位置和紋理座標,儲存到本地資料,準備後面使用而已。

3、初始化著色器

這個著色器就是ES2.0的特色,又叫可程式設計著色器,也是區別於ES1.x的本質。這裡只做簡單的介紹。可程式設計著色器是一種指令碼,語法類似C語言,指令碼分為頂點著色器和片段著色器,分別對應了openGL不同的渲染流程。

頂點著色器:

java程式碼

  1. uniform mat4 u_MVPMatrix; 
  2. attribute vec4 a_position; 
  3. attribute vec2 a_texCoord; 
  4. varying vec2 v_texCoord; 
  5. void main() 
  6. gl_Position = a_position; 
  7. v_texCoord = a_texCoord; 

片段著色器:

java程式碼

  1. precision lowp float
  2. varying vec2 v_texCoord; 
  3. uniform sampler2D u_samplerTexture; 
  4. void main() 
  5. gl_FragColor = texture2D(u_samplerTexture, v_texCoord); 

這裡記住一句話,頂點著色器,會在頂點上執行;片段著色器會在畫素點上執行。剛才的矩形就有4個頂點,每個頂點都會應用這個指令碼。也就是說,頂點是位置相關資訊,片段是色彩紋理相關資訊。

這個2段指令碼都是文字,需要編譯,連結,等等一些操作才能被ES2.0所使用。過程就像C語言的編譯執行過程。openGL 提供了相關函式去做這些事情。

java程式碼

  1. privatevoid initShader() { 
  2. String vertexSource = Tools.readFromAssets("VertexShader.glsl"); 
  3. String fragmentSource = Tools.readFromAssets("FragmentShader.glsl"); 
  4. // Load the shaders and get a linked program
  5. program = GLHelper.loadProgram(vertexSource, fragmentSource); 
  6. // Get the attribute locations
  7. attribPosition = GLES20.glGetAttribLocation(program, "a_position"); 
  8. attribTexCoord = GLES20.glGetAttribLocation(program, "a_texCoord"); 
  9. uniformTexture = GLES20.glGetUniformLocation(program, 
  10. "u_samplerTexture"); 
  11. GLES20.glUseProgram(program); 
  12. GLES20.glEnableVertexAttribArray(attribPosition); 
  13. GLES20.glEnableVertexAttribArray(attribTexCoord); 
  14. // Set the sampler to texture unit 0
  15. GLES20.glUniform1i(uniformTexture, 0); 

可以看到,頂點和片段一起構成一個program,它可以被openGL所使用,是一個 編譯好的指令碼程式,儲存在視訊記憶體。 GLES20.glGetAttribLocation 和 GLES20.glGetUniformLocation 這句話是神馬作用呢。簡單說就是,java程式和著色器指令碼資料通訊的。把就像引數的傳遞一樣,這樣指令碼就能根據外界的引數變化,實時的改變openGL 流水線渲染的處理流程。

封裝的載入著色器的輔助方法:

java程式碼

  1. publicstaticint loadProgram(String vertexSource, String 
  2. fragmentSource) { 
  3. 相關推薦

    Android OpenGL ES 2.0繪圖:繪製紋理

    http://mobile.51cto.com/aengine-437172.htm publicclass MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context

    Android OpenGL ES 2.0繪圖繪製紋理

    紋理,在OpenGL中,可以理解為載入到顯示卡視訊記憶體中的圖片。 Android裝置在 2.2開始支援OpenGL ES2.0,從前都是ES1.0 和 ES1.1的版本。 簡單來說,OpenGL ES是為了嵌入裝置進行功能剪裁後的OpenGL版本。ES2.0是和1.x版本不相容的,區別和相容性參見

    使用Android OpenGL ES 2.0繪圖之五:新增運動

            在螢幕上繪製圖像對於OpenGL來說只是一個非常基本的功能,你也可以使用其它的Android圖形框架類來實現,比如使用Canvas和Drawable物件。但是OpenGL ES確有過人之處,它支援在三維空間上移動和變換繪製物件,或以其它獨特的方式來創造極好

    android平臺下OpenGL ES 3.0實現2D紋理貼圖顯示bitmap

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

    零基礎開發OpenGL ES 2.0學習筆記-Android篇(一)

    看到蘋果應用商店的火爆,也想做點東西放在上面,現在終於有點時間,可是發現用到的技術都不會,要學的東西很多呀(真是落伍了)~ 身為一個JAVA程式設計師,IOS完全不懂,Android只會一些皮毛,OpenGL更是一竅不通。 所有的東西肯定都是以JAVA思想來寫,摻雜著自己的

    解讀OpenGL ES 2.0繪製一個三角形的步驟

    前言:         從上一篇文章中,我們在win7下面搭建OpenGL ES 2.0開發環境的時候,成功運行了官方程式設計指導中提供的Hello_Triangle這個例子,最後得到的結果就是在視窗中繪製出一個紅色的三角形,接下來我們就開始來解讀這個demo的程式碼和實現

    Android OpenGL ES 開發教程 22 繪製一個球體

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    OpenGL ES 2.0 中文API

    大部分都是谷歌翻譯的,只是自己看API的時候順便將其翻譯的結果整理了一下,貼出來方便自己以後看,他人可以看,看到有問題的翻譯可以指點。 glActiveTextureglAttachShaderglBindAttribLocationglBindBufferglBindFramebuffer

    OpenGL ES 2.0座標系設定與頂點轉換

    原文:http://blog.csdn.net/yu0089/article/details/18600903   前面我們對使用Android OpenGL ES 2.0繪圖做過綜述。對於剛剛接觸到OpenGL的人來說,紋理和貼圖往往令其感動很頭疼。在解開這些謎團之前,

    OpenGL ES 2.0——頂點著色器Vertex Shader

            在上篇文章中,我們提到了OpenGL ES 2.0中的兩個非常重要的著色器,它們分別是頂點著色器和片元著色器,那麼我們接下來的學習內容就從這兩個著色器開始。在此之前,我們可以先來看一下

    從零開始之OpenGL ES 2.0【1】

    這一節主要內容是矩陣的使用,投影和相機相關知識。一、矩陣相關        由於OpenGL ES使用的是列向量,所以向量與矩陣計算方式為 矩陣乘向量;在DirectX中使用的是行向量計算方式為 向量乘矩陣。二、投影相關        在OpenGL ES中投影方式有兩種,分

    OpenGL ES 2.0】如何顯示出非2的N次冪的貼圖。(NPOT)

    在繫結紋理後,新增下面四行程式碼 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(G

    Cocos2dx-OpenGL ES 2.0教程:你的第一個三角形(1)

    前言 在本系列教程中,我會以當下最流行的2D引擎Cocos2D-X為基礎,介紹OpenGL ES 2.0的一些基本用法。本系列教程的宗旨是OpenGL掃盲,讓大家在使用Cocos2D-X過程中,知其然,更知其所以然。因為我自己的圖形學水平有限,所以這些教程不會涉及非常底

    OpenGL ES 2.0 著色器語言

    OpenGL 著色器中使用的是著色語言GLSL。著色語言源自C語言,提供了豐富的原生型別,如向量、矩陣等,還有大量的內建函式,這在處理3D圖形時可以更加高效、易用。下面是整理的是OpenGL ES2.0的GLSL語言。 基本資料型別 標量 GLSL中的

    Android opengl ES 實現後臺繪圖並儲存成bitmap

    最近在android 上有個構思,就是如何使用opengl ES在後臺繪製個3D圖片,然後把這個繪製好的圖片儲存成bitmap格式。。。想了好幾天,也嘗試了多種方法,但是都不行,一開始嘗試用GLSurfaceView的方式,但是這樣會導致我的Activity和渲染的東東發生

    【C++ OpenGL ES 2.0程式設計筆記】5: mipmap

    作者是現在對相關知識理解還不是很深入,後續會不斷完善。因此文中內容僅供參考,具體的知識點請以OpenGL的官方文件為準 前言 本文介紹了OpenGL ES 2.0 中常用的多級紋理貼圖技術,mipmap, 給出了一個使用mipmap的3D場景示例。

    OpenGL es 2.0使用shadow mapping方法制作陰影時,陰影穿透實體現象的形成原因及初步應對思路

    在本人開發手機遊戲《KF坦克》時,發現了一個問題,具體如下: 一、開發環境描述: window7+adt-bundle-windows-x86_64-20131030 純java程式設計,OpenGL es 版本為2.0 二、問題描述: 使用shadow mapping方法

    android平臺下OpenGL ES 3.0繪製純色背景

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

    android平臺下OpenGL ES 3.0繪製彩色三角形

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

    android平臺下OpenGL ES 3.0繪製圓點、直線和三角形

    OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E