1. 程式人生 > >Android OpenGL教程-第三課【轉】

Android OpenGL教程-第三課【轉】

第三課 給多邊形上色:

作為第二課的擴充套件,我將叫你如何使用顏色。你將理解兩種著色模式,在左圖中,三角形用的是光滑著色,四邊形用的是平面著色。

這次增加的程式碼不算多。

增加一個color的buffer

在OpenGLRenderer類中定義顏色陣列:

private float[] mColorArray={  
           1f,0f,0f,1f,     //紅  
           0f,1f,0f,1f,     //綠  
           0f,0f,1f,1f      //藍  
    };  
private FloatBuffer mColorBuffer;  

在onDrawFrame函式中加入:

gl.glTranslatef(-1.5f, 0.0f, -6.0f);  
//     gl.glColor4f(1f, 1f, 1f, 1f); 註釋掉原來的三角形的紅色  
//設定定點陣列 
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
//設定顏色陣列 -- 開啟顏色渲染功能.  
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);  
//使用陣列作為顏色  
gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);  
//陣列指向一個buffer    
gl.glVertexPointer
(3, GL10.GL_FLOAT, 0, mTriangleBuffer); //繪製三角形 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

在onSurfaceCreated函式中初始化mColorBuffer:

mColorBuffer = BufferUtil.floatToBuffer(mColorArray);

這樣話出一個顏色漸變的三角形
這裡寫圖片描述
畫四邊形加上這一句,就出來了藍色的四邊形

//

關閉顏色陣列 -- 關閉顏色渲染功能.  (原文中沒有這句,只有後面那句)
gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 

gl.glColor4f(0.5f
, 0.5f, 1f, 1f);

這裡寫圖片描述

好了,我今天無意中看到了一個IPHONE的opengles教程,和我的很類似,所以學學openggl是必要的,上層的什麼平臺不重要,用什麼語言不重要,底層的opengl的程式碼和API都是一樣的。
(注:本教程轉自其他網頁:
http://www.cnblogs.com/wuqianling/p/6602097.html

我的程式碼如下:
注:所以的功能必須放在gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);之前,否則將無效

package xxq.com.opengldemo;

import android.opengl.GLSurfaceView;

import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;


/**
 * 渲染器類,實現了GLSurfaceView.Renderer介面,實現這個介面,需要實現3個方法:OnSurfaceCreated(),
 * OnSurfaceChanged(),OnDrawFrame()。
 */

public class OpenGLRenderer implements GLSurfaceView.Renderer {
    private float cr, cg, cb;

    // (這是附加的)設定RGB顏色的方法
    public void setColor(float r, float g, float b) {
        cr = r;
        cg = g;
        cb = b;
    }

    /**
     * 三角形頂點
     */
    private float[] mTriangleArray = {
            0f, 1f, 0f,   // 是上頂點
            -1f, -1f, 0f, // 左下頂點
            1f, -1f, 0f   // 右下頂點
    };
    private FloatBuffer mTriangleBuffer;
    /**
     * 三角形顏色
     */
    private float[] mColorArray={
            1f,0f,0f,1f,     //紅
            0f,1f,0f,1f,     //綠
            0f,0f,1f,1f      //藍
    };
    private FloatBuffer mColorBuffer;
    /**
     * 正方形頂點
     */
    private float[] mQuadsArray = {
            1f, 1f, 0f, // 右上
            -1f, 1f, 0f, // 左上
            -1f, -1f, 0f, // 左下
            1f, -1f, 0f // 右下
    }; // 從這裡可以看出,我們按照逆時針的方向畫圖
    private FloatBuffer mQuadsBuffer;

    /**
     * 該方法是畫圖方法,類似於View類的OnDraw(),一般所有的畫圖操作都在這裡實現。
     */
    @Override
    public void onDrawFrame(GL10 gl) {
        // 清除螢幕和深度快取。
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        // 利用陣列模型來畫模型,要加此句(原文中沒有)(沒有這句畫不出大三角形)
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //設定顏色陣列 -- 開啟顏色渲染功能.
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        // 三角形的顏色為紅色,透明度為不透明
        //使用陣列作為顏色
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);
        //陣列指向一個buffer
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
        /**
         * 三角形
         */
        // 重置當前的模型觀察矩陣。
        gl.glLoadIdentity();
        // 沿著X軸左移1.5個單位,Y軸不動(0.0f),最後移入螢幕6.0f個單位
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
        gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
        // 設定頂點,第一個引數是座標的維數,這裡是3維,第二個引數,表示buffer裡面放的是float,第三個引數是0,
        // 是因為我們的座標在陣列中是緊湊的排列的,沒有使用offset,最後的引數放的是存放頂點座標的buffer
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
        // 畫陣列,第一個引數表示畫三角形,第二個引數是first,第三個引數是count,表示在buffer裡面的座標的開始和個數
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

        /**
         * 正方形
         */
        gl.glLoadIdentity();
        // 座標向右移1.5個單位
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mQuadsBuffer);
        //關閉顏色陣列 -- 關閉顏色渲染功能.  (原文中沒有這句,只有後面那句)
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glColor4f(0.5f, 0.5f, 1f, 1f);
        gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); // 畫四邊形


        gl.glClearColor(cr, cg, cb, 0.0f);

    }

    /**
     * 在Surface發生改變的時候呼叫,例如從豎屏切換到橫屏的時候
     */
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // 設定輸出螢幕大小
        gl.glViewport(0, 0, width, height);

        float ratio = (float) width / height;
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }

    /**
     * 在Surface建立的時候呼叫,一般在這裡做一個初始化openggl的操作
     */
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 啟用smooth shading(陰影平滑)。陰影平滑通過多邊形精細的混合色彩,並對外部光進行平滑。
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 設定清除螢幕時所用的顏色,引數對應(紅,綠,藍,Alpha值)。色彩值的範圍從0.0f到1.0f。0.0f代表最黑的情況,1.0f就是最亮的情況。
        gl.glClearColor(0f, 0f, 0f, 0f);

        // 下面三行是關於depth buffer(深度快取)的。將深度快取設想為屏幕後面的層。深度快取不斷的對物體進入螢幕內部有多深進行跟蹤。
        gl.glClearDepthf(1.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);

        // 這裡告訴OpenGL我們希望進行最好的透視修正。這會十分輕微的影響效能。但使得透檢視看起來好一點。
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

        mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
        mQuadsBuffer = BufferUtil.floatToBuffer(mQuadsArray);
        mColorBuffer = BufferUtil.floatToBuffer(mColorArray);
    }

}

相關推薦

Android OpenGL教程-

第三課 給多邊形上色: 作為第二課的擴充套件,我將叫你如何使用顏色。你將理解兩種著色模式,在左圖中,三角形用的是光滑著色,四邊形用的是平面著色。 這次增加的程式碼不算多。 增加一個color的buffer 在OpenGLRenderer類中定義顏色陣列:

ionic新手教程-在項目中使用requirejs分離controller文件和server文件

做了 不難 定位 nts center str 報錯 去掉 x文件 繼上篇教程中提到的,我們新建一個簡單的tabs類型的Ionic項目。 依據文件夾文件我們知道,系統自己主動創建了一個controller文件和server文件,而且把全部的控制器和服務都寫到這兩個

NeHe OpenGL教程 :光照和鍵盤 程式碼

#include <windows.h> // Windows的標頭檔案 #include <glew.h> // 包含最新的gl.h,glu.h庫 #include <glut.h> // 包含OpenGL實用庫 #include <stdio.h

NeHe OpenGL教程 :紋理對映 程式碼

#include <windows.h> // Windows的標頭檔案 #include <glew.h> // 包含最新的gl.h,glu.h庫 #include <glut.h> // 包含OpenGL實用庫 #include <stdio.h

Unity shader教程-:實踐!同一個shader,多個material。

更多更及時的文章請關於98教育 這節課我們開始利用我們學到的Properties知識來改動程式碼,用一個shader實現如下圖的幾個不同的球體: 步驟: 使用MonoDevelop開啟shader檔案保證Properties裡面是如下內容 _Emissi

維電子沙盤開發教程 利用WPF建立3d gis數字地球(非axhost方式)

三維電子沙盤開發教程第三課 利用WPF建立3d gis數字地球(非axhost方式) 下面介紹向量圖層的控制顯示:上程式碼 foreach(string key in gis3d.SetFile.Biao.Keys)// gis3d.SetFile.Biao 該物件裡儲存了所有向

laravel教程4: 玩資料遷移laravel migration(超詳細版)

補充上節課:配置虛擬主機 不用修改nginx的配置檔案,減少學習成本,只要在homestead.yaml 和host檔案兩個檔案中做很小的改動就行 D:\03www2018\homestead\Homestead.yaml map: myblog.app

React入門教程--gulp編譯優化

上節課中我提到了,在gulpfile中編寫task編譯js和sass的task。 然後在專案中使用時發現,當專案內容越寫越多時,編譯速度會越來越久。 看了一下編譯過程。上次gulpfile中的定義是當監聽檔案改變時就執行編譯全部js檔案。 查閱資料--gulp編譯加速 看

CodeIgniter框架入門教程—— URL及ajax

這節課講一下CI框架的路由規則,以及如何在CI框架下實現ajax功能。 首先,先介紹CI框架的路由規則,因為CI框架是在PHP的基礎上發展而來的,所以在基本的路由規則中,和原生態的PHP專案是相似的,但是CI框架是符合MVC框架的,在前兩節中也提到了,MVC框架一般

Android在標準linux基礎上對休眠喚醒的實現(一)(二)(

說明: 1. Based on linux 2.6.32 and android 2.2,only support SDR(mem). 2. 參考文章: 一、新增特性介紹 實際上,android仍然是利用了標準linux的休眠喚醒系統,只不過添加了一些使用

Android微信智慧心跳方案

轉自https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994 前言:在13年11月中旬時,因為基礎元件組人手緊張

COM元件開發實踐(

//  CardScan.cpp : CCardScanApp 和DLL 註冊的實現。 #include  " stdafx.h " #include  " CardScan.h " #include  " comcat.h " #include  " strsafe.h " #include 

Makefile經典教程(掌握這些足夠)

該篇文章為轉載,是對原作者系列文章的總彙加上標註。 支援原創,請移步陳浩大神部落格: makefile很重要       什麼是makefile?或許很多Winodws的程式設計師都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個

Android Studio除錯功能使用總結

這段時間一直在使用Intellij IDEA, 今天把除錯區工具的使用方法記錄於此。 先編譯好要除錯的程式。 1.設定斷點 選定要設定斷點的程式碼行,在行號的區域後面單擊滑鼠左鍵即可。 2.開啟除錯會話 點選紅色箭頭指向的小蟲子,開始進入除錯。

Perf -- Linux下的系統性能調優工具, 1 部分

出了 結構 頻率 重復 左右 points return time das 轉自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ Perf 簡介 Perf 是用來進行軟件性能分析的工具。 通過它,應用程序

《王道論壇考研機試指南》數論

數位拆解 進位制轉換 最大公約數 最小公倍數 素數篩法 分解素因數 二分求冪 高精度整數 數位拆解 特殊除法 #include <cstdio> using namespace std; int main() { int a,

深度學習框架Caffe學習與應用 將圖片資料化為LMDB資料``

1.將圖片資料轉化為LMDB資料 第一步:建立圖片檔案列表清單,一般為一個txt檔案,一行一張圖片 我在caffe/data/目錄下新建一個test_data的資料夾,裡面放訓練集及資料集

Linux探索之旅第一部分:測試並安裝Ubuntu

u盤 nco 過程 sans ubunt windows u盤啟動盤 系統 .com 內容簡單介紹 1、第一部分第三課:測試並安裝Ubuntu 2、第一部分第四課預告:磁盤分區 測試並安裝Ubuntu 大家好,經過前兩個比較偏理論(是否

Linux探索之旅四部分:文件傳輸,瀟灑同步

命令行 上傳文件 文件夾 images lsh wget命令 ace 目標 wechat 內容簡單介紹 1、第四部分第三課:文件傳輸。瀟灑同步 2、第四部分第四課:分析網絡。隔離防火 文件傳輸。瀟灑同步 這一課的內容相

SpringMVC筆記 處理器映射器+處理器適配器

property lec www 映射 style user err utf 只需要 第二課的例子中,在springmvc.xml中配置使用了第一種處理器映射器和處理器適配器,如下所示。 <!-- 配置第一種處理器映射器 BeanNameUrlH