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