Android OpenGL ES 2.0繪圖:繪製紋理
http://mobile.51cto.com/aengine-437172.htm
- publicclass MyGLSurfaceView extends GLSurfaceView {
- public MyGLSurfaceView(Context context) {
- super(context);
- setFocusableInTouchMode(true);
- // Tell the surface view we want to create an OpenGL ES 2.0-compatible
- // context, and set an OpenGL ES 2.0-compatible renderer.
- this.setEGLContextClientVersion(2);
- this.setRenderer(new MyRenderer());
- }
- }
並沒有什麼特別之處,android view的渲染操作需要實現一個render介面,GLSurfaceView的渲染介面為android.opengl.GLSurfaceView.Renderer。我們需要實現介面的方法。
java程式碼
- publicclass MyRenderer implements Renderer {
- publicvoid onDrawFrame(GL10 gl) {}
- publicvoid onSurfaceChanged(GL10 gl,
int width, int height) {}- publicvoid onSurfaceCreated(GL10 gl, EGLConfig config) {}
- }
介面實現3個方法,對應繪製,繪製區域變化,區域建立。需要說明的是引數GL10 gl是OpenGL ES1.x版本的物件。這裡我們不會使用到。還有一點就是,onDrawFrame方法的呼叫是有系統呼叫的,不需要手動呼叫。系統會以一定的頻率不斷的回撥。
接下來我們進入ES2.0的使用,上程式碼先:
java程式碼
- publicvoid onSurfaceCreated(GL10 gl, EGLConfig config) {
- GLES20.glEnable(GLES20.GL_TEXTURE_2D);
- // Active the texture unit 0
- GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
- loadVertex();
- initShader();
- loadTexture();
- }
1、啟用2D紋理
繪製區域建立的時候,我們設定了啟用2D的紋理,並且激活了紋理單元unit0。什麼意思呢,說起來話長,以後慢慢說。簡單說一下,記住OpenGL 是基於狀態的,就是很多狀態的設定和切換,這裡啟用GL_TEXTURE_2D就是一個狀態的開啟,表明OpenGL可以使用2D紋理。
什麼是啟用紋理單元?這個和硬體有點關係,OpenGL要顯示卡會劃分儲存紋理的儲存區域不止一個區域。這裡是使用區域 unit 0,多重紋理繪製可以開啟多個,這個以後說。接下來,呼叫了三個函式,載入頂點,初始化著色器,載入紋理。
2、載入頂點
OpenGL繪製圖形是根據頂點以後連結起來的。為什麼要這樣,其實這樣很強大是一種設計吧。頂點可以暫時簡單理解為含有位置資訊的座標點。
java程式碼
- privatevoid loadVertex() {
- // float size = 4
- this.vertex = ByteBuffer.allocateDirect(quadVertex.length * 4)
- .order(ByteOrder.nativeOrder())
- .asFloatBuffer();
- this.vertex.put(quadVertex).position(0);
- // short size = 2
- this.index = ByteBuffer.allocateDirect(quadIndex.length * 2)
- .order(ByteOrder.nativeOrder())
- .asShortBuffer();
- this.index.put(quadIndex).position(0);
- }
- private FloatBuffer vertex;
- private ShortBuffer index;
- privatefloat[] quadVertex = newfloat[] {
- -0.5f, 0.5f, 0.0f, // Position 0
- 0, 1.0f, // TexCoord 0
- -0.5f, -0.5f, 0.0f, // Position 1
- 0, 0, // TexCoord 1
- 0.5f , -0.5f, 0.0f, // Position 2
- 1.0f, 0, // TexCoord 2
- 0.5f, 0.5f, 0.0f, // Position 3
- 1.0f, 1.0f, // TexCoord 3
- };
- privateshort[] quadIndex = newshort[] {
- (short)(0), // Position 0
- (short)(1), // Position 1
- (short)(2), // Position 2
- (short)(2), // Position 2
- (short)(3), // Position 3
- (short)(0), // Position 0
- };
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程式碼
- uniform mat4 u_MVPMatrix;
- attribute vec4 a_position;
- attribute vec2 a_texCoord;
- varying vec2 v_texCoord;
- void main()
- {
- gl_Position = a_position;
- v_texCoord = a_texCoord;
- }
片段著色器:
java程式碼
- precision lowp float;
- varying vec2 v_texCoord;
- uniform sampler2D u_samplerTexture;
- void main()
- {
- gl_FragColor = texture2D(u_samplerTexture, v_texCoord);
- }
這裡記住一句話,頂點著色器,會在頂點上執行;片段著色器會在畫素點上執行。剛才的矩形就有4個頂點,每個頂點都會應用這個指令碼。也就是說,頂點是位置相關資訊,片段是色彩紋理相關資訊。
這個2段指令碼都是文字,需要編譯,連結,等等一些操作才能被ES2.0所使用。過程就像C語言的編譯執行過程。openGL 提供了相關函式去做這些事情。
java程式碼
- privatevoid initShader() {
- String vertexSource = Tools.readFromAssets("VertexShader.glsl");
- String fragmentSource = Tools.readFromAssets("FragmentShader.glsl");
- // Load the shaders and get a linked program
- program = GLHelper.loadProgram(vertexSource, fragmentSource);
- // Get the attribute locations
- attribPosition = GLES20.glGetAttribLocation(program, "a_position");
- attribTexCoord = GLES20.glGetAttribLocation(program, "a_texCoord");
- uniformTexture = GLES20.glGetUniformLocation(program,
- "u_samplerTexture");
- GLES20.glUseProgram(program);
- GLES20.glEnableVertexAttribArray(attribPosition);
- GLES20.glEnableVertexAttribArray(attribTexCoord);
- // Set the sampler to texture unit 0
- GLES20.glUniform1i(uniformTexture, 0);
- }
可以看到,頂點和片段一起構成一個program,它可以被openGL所使用,是一個 編譯好的指令碼程式,儲存在視訊記憶體。 GLES20.glGetAttribLocation 和 GLES20.glGetUniformLocation 這句話是神馬作用呢。簡單說就是,java程式和著色器指令碼資料通訊的。把就像引數的傳遞一樣,這樣指令碼就能根據外界的引數變化,實時的改變openGL 流水線渲染的處理流程。
封裝的載入著色器的輔助方法:
java程式碼
- publicstaticint loadProgram(String vertexSource, String
- fragmentSource) {
相關推薦
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