導航:首頁 > 操作系統 > androidopengl入門

androidopengl入門

發布時間:2023-01-12 10:17:00

Ⅰ 什麼是OpeenGL

OpenGL目錄
概述
Open GL現狀
高級功能
OpenGL編程入門
OpenGL與DirectX的區別

概述
OpenGL - 高性能圖形演算法行業標准
OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種計算機平台及設備上的數千優秀應用程序。OpenGL™ 是獨立於視窗操作系統或其它操作系統的,亦是網路透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、製造業、制葯業及虛擬現實等行業領域中,OpenGL™ 幫助程序員實現在 PC、工作站、超級計算機等硬體設備上的高性能、極具沖擊力的高視覺表現力圖形處理軟體的開發。
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面的規格,它用於三維圖象(二維的亦可)。OpenGL是個專業的圖形程序介面,是一個功能強大,調用方便的底層圖形庫。OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體介面,功能雖然強大但是移植性不好,於是SGI公司便在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是「Open Graphics Library」,顧名思義,OpenGL便是「開放的圖形程序介面」。雖然DirectX在家用市場全面領先,但在專業高端繪圖領域,OpenGL是不能被取代的主角。
OpenGL是個與硬體無關的軟體介面,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。因此,支持OpenGL的軟體具有很好的移植性,可以獲得非常廣泛的應用。由於OpenGL是圖形的底層圖形庫,沒有提供幾何實體圖元,不能直接用以描述場景。但是,通過一些轉換程序,可以很方便地將AutoCAD、3DS/3DSMAX等3D圖形設計軟體製作的DXF和3DS模型文件轉換成OpenGL的頂點數組。
在OpenGL的基礎上還有Open Inventor、Cosmo3D、Optimizer等多種高級圖形庫,適應不同應用。其中,Open Inventor應用最為廣泛。該軟體是基於OpenGL面向對象的工具包,提供創建互動式3D圖形應用程序的對象和方法,提供了預定義的對象和用於交互的事件處理模塊,創建和編輯3D場景的高級應用程序單元,有列印對象和用其它圖形格式交換數據的能力。
OpenGL的發展一直處於一種較為遲緩的態勢,每次版本的提高新增的技術很少,大多隻是對其中部分做出修改和完善。1992年7月,SGI公司發布了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟體也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本比1.0的性能有許多提高,並加入了一些新的功能。其中包括改進列印機支持,在增強元文件中包含OpenGL的調用,頂點數組的新特性,提高頂點位置、法線、顏色、色彩指數、紋理坐標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了「OpenGL Shading Language」,該語言是「OpenGL 2.0」的底核,用於著色對象、頂點著色以及片斷著色技術的擴展功能。
OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中占據主動地位的3DLabs。2.0版本首先要做的是與舊版本之間的完整兼容性,同時在頂點與像素及內存管理上與DirectX共同合作以維持均勢。OpenGL 2.0將由OpenGL 1.3的現有功能加上與之完全兼容的新功能所組成(如圖一)。藉此可以對在ARB停滯不前時代各家推出的各種糾纏不清的擴展指令集做一次徹底的精簡。此外,硬體可編程能力的實現也提供了一個更好的方法以整合現有的擴展指令。
目前,隨著DirectX的不斷發展和完善,OpenGL的優勢逐漸喪失,至今雖然已有3Dlabs提倡開發的2.0版本面世,在其中加入了很多類似於DirectX中可編程單元的設計,但廠商的用戶的認知程度並不高,未來的OpenGL發展前景迷茫。
[編輯本段]Open GL現狀
Open GL仍然是唯一能夠取代微軟對3D圖形技術的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已經不再以任何讓微軟不悅的方式推廣Open GL,因而它存在較高的風險。游戲開發人員是一個有著獨立思想的群體,很多重要的開發人員目前仍然在使用Open GL。因此,硬體開發商正在設法加強對它的支持。Direct3D目前還不能支持高端的圖形設備和專業應用; Open GL在這些領域占據著統治地位。最後,開放源碼社區(尤其是Mesa項目)一直致力於為任何類型的計算機(無論它們是否使用微軟的操作系統)提供Open GL支持。
今年08年正式公布OpenGL3.0版本。並且得到了,nv的支持,其官方網站上提供針對N卡的sdk下載。
[編輯本段]高級功能
OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API沒有窗口系統、音頻、列印、鍵盤/滑鼠或其它輸入設備的概念。雖然這一開始看起來像是一種限制,但它允許進行渲染的代碼完全獨立於他運行的操作系統,允許跨平台開發。然而,有些整合於原生窗口系統的東西需要允許和宿主系統交互。這通過下列附加API實現:
* GLX - X11(包括透明的網路)
* WGL - Microsoft Windows
* AGL - Apple MacOS
另外,GLUT庫能夠以可移植的方式提供基本的窗口功能。
[編輯本段]OpenGL編程入門
OpenGL作圖非常方便,故日益流行,但對許多人來說,是在微機上進行的,首先碰到的問題是,如何適應微機環境。這往往是最關鍵的一步,雖然也是最初級的。一般的,我不建議使用glut 包.那樣難以充分發揮 windows 的界面上的功能.
下面介紹如何在 VC++ 上進行 OpenGL 編程。 OpenGL 繪圖的一般過程可以看作這樣的,先用 OpenGL 語句在 OpenGL 的繪圖環境 RenderContext (RC)中畫好圖, 然後再通過一個 Swap buffer 的過程把圖傳給操作系統的繪圖環境 DeviceContext (DC)中,實實在在地畫出到屏幕上.
下面以畫一條 Bezier 曲線為例,詳細介紹VC++ 上 OpenGL編程的方法。文中給出了詳細注釋,以便給初學者明確的指引。一步一步地按所述去做,你將順利地畫出第一個 OpenGL 平台上的圖形來。
一、產生程序框架 Test.dsw
New Project | MFC Application Wizard (EXE) | "Test" | OK
*注* : 加「」者指要手工敲入的字串
二、導入 Bezier 曲線類的文件
用下面方法產生 BezierCurve.h BezierCurve.cpp 兩個文件:
WorkSpace | ClassView | Test Classes| <右擊彈出> New Class | Generic Class(不用MFC類) | "CBezierCurve" | OK
三、編輯好 Bezier 曲線類的定義與實現
寫好下面兩個文件:
BezierCurve.h BezierCurve.cpp
四、設置編譯環境:
1. 在 BezierCurve.h 和 TestView.h 內各加上:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
2. 在集成環境中
Project | Settings | Link | Object/library mole | "opengl32.lib glu32.lib glaux.lib" | OK
五、設置 OpenGL 工作環境:(下面各個操作,均針對 TestView.cpp )
1. 處理 PreCreateWindow(): 設置 OpenGL 繪圖窗口的風格
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;
2. 處理 OnCreate():創建 OpenGL 的繪圖設備。
OpenGL 繪圖的機制是: 先用 OpenGL 的繪圖上下文 Rendering Context (簡稱為 RC )把圖畫好,再把所繪結果通過 SwapBuffer() 函數傳給 Window 的 繪圖上下文 Device Context (簡記為 DC).要注意的是,程序運行過程中,可以有多個 DC,但只能有一個 RC。因此當一個 DC 畫完圖後,要立即釋放 RC,以便其它的 DC 也使用。在後面的代碼中,將有詳細注釋。
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
myInitOpenGL();
return 0;
}
void CTestView::myInitOpenGL()
{
m_pDC = new CClientDC(this); //創建 DC
ASSERT(m_pDC != NULL);
if (!mySetupPixelFormat()) //設定繪圖的點陣圖格式,函數下面列出
return;
m_hRC = wglCreateContext(m_pDC->m_hDC);//創建 RC
wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 與當前 DC 相關聯
} //CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成員變數
BOOL CTestView::mySetupPixelFormat()
{//我們暫時不管格式的具體內容是什麼,以後熟悉了再改變格式
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
3. 處理 OnDestroy()
void CTestView::OnDestroy()
{
wglMakeCurrent(m_pDC->m_hDC,NULL); //釋放與m_hDC 對應的 RC
wglDeleteContext(m_hRC); //刪除 RC
if (m_pDC)
delete m_pDC; //刪除當前 View 擁有的 DC
CView::OnDestroy();
}
4. 處理 OnEraseBkgnd()
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// return CView::OnEraseBkgnd(pDC);
//把這句話注釋掉,若不然,Window
//會用白色北景來刷新,導致畫面閃爍
return TRUE;//只要空返回即可。
}
5. 處理 OnDraw()
void CTestView::OnDraw(CDC* pDC)
{
wglMakeCurrent(m_pDC->m_hDC,m_hRC);//使 RC 與當前 DC 相關聯
myDrawScene( ); //具體的繪圖函數,在 RC 中繪制
SwapBuffers(m_pDC->m_hDC);//把 RC 中所繪傳到當前的 DC 上,從而
//在屏幕上顯示
wglMakeCurrent(m_pDC->m_hDC,NULL);//釋放 RC,以便其它 DC 進行繪圖
}
void CTestView::myDrawScene( )
{
glClearColor(0.0f,0.0f,0.0f,1.0f);//設置背景顏色為黑色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslated(0.0f,0.0f,-3.0f);//把物體沿(0,0,-1)方向平移
//以便投影時可見。因為預設的視點在(0,0,0),只有移開
//物體才能可見。
//本例是為了演示平面 Bezier 曲線的,只要作一個旋轉
//變換,可更清楚的看到其 3D 效果。
//下面畫一條 Bezier 曲線
bezier_curve.myPolygon();//畫Bezier曲線的控制多邊形
bezier_curve.myDraw(); //CBezierCurve bezier_curve
//是 CTestView 的成員變數
//具體的函數見附錄
glPopMatrix();
glFlush(); //結束 RC 繪圖
return;
}
6. 處理 OnSize()
void CTestView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
VERIFY(wglMakeCurrent(m_pDC->m_hDC,m_hRC));//確認RC與當前DC關聯
w=cx;
h=cy;
VERIFY(wglMakeCurrent(NULL,NULL));//確認DC釋放RC
}
7 處理 OnLButtonDown()
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
CView::OnLButtonDown(nFlags, point);
if(bezier_curve.m_N>MAX-1)
{
MessageBox("頂點個數超過了最大數MAX=50");
return;
}
//以下為坐標變換作準備
GetClientRect(&m_ClientRect);//獲取視口區域大小
w=m_ClientRect.right-m_ClientRect.left;//視口寬度 w
h=m_ClientRect.bottom-m_ClientRect.top;//視口高度 h
//w,h 是CTestView的成員變數
centerx=(m_ClientRect.left+m_ClientRect.right)/2;//中心位置,
centery=(m_ClientRect.top+m_ClientRect.bottom)/2;//取之作原點
//centerx,centery 是 CTestView 的成員變數
GLdouble tmpx,tmpy;
tmpx=scrx2glx(point.x);//屏幕上點坐標轉化為OpenGL畫圖的規范坐標
tmpy=scry2gly(point.y);
bezier_curve.m_Vertex[bezier_curve.m_N].x=tmpx;//加一個頂點
bezier_curve.m_Vertex[bezier_curve.m_N].y=tmpy;
bezier_curve.m_N++;//頂點數加一
InvalidateRect(NULL,TRUE);//發送刷新重繪消息
}
double CTestView::scrx2glx(int scrx)
{
return (double)(scrx-centerx)/double(h);
}
double CTestView::scry2gly(int scry)
{
}
附錄:
1.CBezierCurve 的聲明: (BezierCurve.h)
class CBezierCurve
{
public:
myPOINT2D m_Vertex[MAX];//控制頂點,以數組存儲
//myPOINT2D 是一個存二維點的結構
//成員為Gldouble x,y
int m_N; //控制頂點的個數
public:
CBezierCurve();
virtual ~CBezierCurve();
void bezier_generation(myPOINT2D P[MAX],int level);
//演算法的具體實現
void myDraw();//畫曲線函數
void myPolygon(); //畫控制多邊形
};
2. CBezierCurve 的實現: (BezierCurve.cpp)
CBezierCurve::CBezierCurve()
{
m_N=4;
m_Vertex[0].x=-0.5f;
m_Vertex[0].y=-0.5f;
m_Vertex[1].x=-0.5f;
m_Vertex[1].y=0.5f;
m_Vertex[2].x=0.5f;
m_Vertex[2].y=0.5f;
m_Vertex[3].x=0.5f;
m_Vertex[3].y=-0.5f;
}
CBezierCurve::~CBezierCurve()
{
}
void CBezierCurve::myDraw()
{
bezier_generation(m_Vertex,LEVEL);
}
void CBezierCurve::bezier_generation(myPOINT2D P[MAX], int level)
{ //演算法的具體描述,請參考相關書本
int i,j;
level--;
if(level<0)return;
if(level==0)
{
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_LINES); //畫出線段
glVertex2d(P[0].x,P[0].y);
glVertex2d(P[m_N-1].x,P[m_N-1].y);
glEnd();//結束畫線段
return; //遞歸到了最底層,跳出遞歸
}
myPOINT2D Q[MAX],R[MAX];
for(i=0;i {
Q.x=P.x;
Q.y=P.y;
}
for(i=1;i<m_N;i++)
{
R[m_N-i].x=Q[m_N-1].x;
R[m_N-i].y=Q[m_N-1].y;
for(j=m_N-1;j>=i;j--)
{
Q[j].x=(Q[j-1].x+Q[j].x)/double(2);
Q[j].y=(Q[j-1].y+Q[j].y)/double(2);
}
}
R[0].x=Q[m_N-1].x;
R[0].y=Q[m_N-1].y;
bezier_generation(Q,level);
bezier_generation(R,level);
}
void CBezierCurve::myPolygon()
{
glBegin(GL_LINE_STRIP); //畫出連線段
glColor3f(0.2f,0.4f,0.4f);
for(int i=0;i<m_N;i++)
{
glVertex2d(m_Vertex.x,m_Vertex.y);
}
glEnd();//結束畫連線段
}

[編輯本段]OpenGL與DirectX的區別
OpenGL 只是圖形函數庫。
DirectX 包含圖形, 聲音, 輸入, 網路等模塊。
OpenGL穩定,可跨平台使用。DirectX僅能用於Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。
----------------------------------------------------------------------------------------------
1995年至1996年,微軟實行了一項新計劃,以支持在Windows95上運行游戲,目標是把市場擴展到被任天堂和世嘉控制的游戲領域。然而,微軟不想用已經在NT上提供的OpenGL技術。微軟收購了Rendermorphics,Ltd.並得到他的被稱作RealityLab的3D API。經重新整理,微軟發布了新的3D API——Direct3D。
微軟,推行Direct3D,凍結OpenGL!
微軟當時拒絕了在Window95上支持OpenGL。不止如此,微軟採取異常手段收回對OpenGL的MCD驅動介面的支持,以致硬體廠商不得不放棄已經進入最後測試的OpenGL驅動。微軟的市場部門開始向游戲開發商、硬體廠商、新聞出版機構推銷Direct3D,同時排斥OpenGL。
API之戰!
Silicon Graphics和很多OpenGL用戶都依賴OpenGL創新且高性能的技術。但很明顯微軟打算用Direct3D代替OpenGL,盡管D3D有很多問題而且不能像OpenGL那樣被硬體廠商擴展。Silicon Graphics決定在1996 SIGGRAPH會議上作一項演示。演示證明OpenGL至少和D3D一樣快,從而駁倒微軟的市場論調。因為OpenGL是業界公認標准,比D3D功能豐富,而且圖像質量要高一些,所以演示在計算機圖形和游戲開發社區導致了激烈論戰。
游戲開發者要求OpenGL和D3D站在同等地位!
當技術和市場問題暴露,強烈的支持OpenGL行動開始了。Doom的開發者John Carmack聲明拒絕D3D,Chris Hecker在游戲開發雜志上發表了兩套API的全面分析,移微軟應放棄D3D為結論。游戲開發者先後兩次向微軟遞交請願書。第一次由56名首席游戲開發者要求微軟發行OpenGL MCD驅動,但未成功,因為會讓OpenGL與D3D競爭。第二次的公開信由254人簽名開始,截止時達到1400人。微軟的回答仍是重申舊市場立場。盡管請願者清楚的要求兩套API同等競爭以促進發展,微軟卻以增加D3D的投資、更加減少OpenGL的投資為回應。
Fahrenheit——D3D與OpenGL的合並?
Silicon Graphics,Microsoft, HP,Intel達成協議聯合開發下一代3D API——Fahrenheit。但不了了之,因為微軟的打算是把OpenGL的技術用到D3D里並且以此之名驅除OpenGL的威脅。(估計DirectX 8 Graphics即是剩下微軟獨自開發的Fahrenheit,吸收了OpenGL的很多東西。)
OpenGL豪氣不減當年!
OpenGL依然是唯一能與微軟單獨控制的D3D對立的API,盡管Silicon Graphics不再以任何微軟不能接受的方式推行OpenGL。游戲開發這是獨立的,並且很多關鍵人物在用OpenGL,因此,硬體廠商正努力提高對其支持。D3D仍不能支持高端圖像和專業應用,而OpenGL主宰著這些土地。在開放原碼社區,Mesa項目正提供獨立於微軟的OpenGL驅動。
譯者註:表面上好像D3D比OpenGL支持更多的功能,其實由於D3D不支持硬體擴展,如硬體全景陰影,硬體渲染順序無關半透明材質等新技術根本無法使用,而D3D(特指D3D8)本身提供的功能只有一小部分能在使用HAL且硬體不支持時模擬,你要用大量代碼分析硬體能力和採取不同策略

Ⅱ 求 OpenGl ES 教程,本人畢設要做一個3D的平衡球游戲(android平台), 由於以前沒有接觸過 OpenGL

有一本書叫做android3D游戲開發就是講OpenGL的你說的平衡球裡面就有例子!
http://proct.dangdang.com/proct.aspx?proct_id=21104412
你可以看看!裡面講的非常詳細。
希望可以幫到你。

Ⅲ Opengl如何入門

我是學了一本經典教程《OpenGL超級寶典》,現在最新已經是第四版了

本人上傳的免費下載鏈接
《OpenGL超級寶典 第二版》中文版http://www.pudn.com/downloads117/ebook/detail498269.html

電驢下載頁面
http://www.verycd.com/topics/260551

還有《OpenGL編程指南》,俗稱「紅寶書」,和《OpenGL超級寶典》一樣。CSDN有很多下載鏈接,去搜索一下吧

Ⅳ Android OpenGL 的基本使用

由於本人現在在公司做Android上的OpenGL圖像處理相關功能,以前沒有搞過這方面的知識,所以一切只能從頭開始搞起,接下來將會慢慢分享其他方面的內容,先用這篇比較基礎的文章來開頭。

剛才我們談到圖像處理,在做圖像處理我們不是可以用Canvas來繪制嗎,怎麼還要用OpenGL那麼陌生的東西來搞?為什麼要用OpenGL,肯定有它的好處。

接下來我們會來講解如何在Android項目開發過程中加入OpenGL,在開始前我們先了解同OpenGL ES密切相關的載體:GLSurfaceView:

要用OpenGL繪制,首先要有GLSurfaceVie的實例

現在OpenGL ES版本已經到3.0了,Android平台上目前有1.0和2.0,我們使用的是2.0,在使用前在onCreate()方法中檢查是否支持2.0的版本並且確定使用2.0

一般我們只需要使用「configurationInfo.reqGlEsVersion >= 0x20000」,至於加後面主要是用於模擬器檢查,假定模擬器支持2.0。

前面說到GLSurfaceView挖了一個洞,就是為了看見下面的渲染表面,同樣實在onCreate()方法中

通過setEGLContextClientVersion()方法配置surface視圖,設定好使用的OpenGL版本,然後調用setRenderer()傳進有自定義Renderer類的新實例。當Surface創建或者發生變化的時候,以及繪制一幅新幀時,渲染器都會被GLSurfaceView調用。

GLSurfaceView的生命周期要協同好Activity的生命周期,避免造成內存泄漏。

Renderer類也就是我們的渲染類了,它是通過實現Renderer介面來實現功能的。

渲染器介面定義的方法:

實現Renderer的介面方法

首選在onSurfaceCreated()中調用glClearColor設置清空屏幕用的顏色,這里使用紅色。

設置視口的大小

在onDrawFrame()中調用glClear(GL_COLOR_BUFFER_BIT)清空屏幕,會調用glClearColor中定義的顏色來填充整個屏幕。通過這幾個步驟,基本上就可以在GLSurfaceView繪制出東西了,在這里我只是簡單的用紅色繪制整個屏幕。

OpenGL在Android上的使用基本上是這樣,但是,當然沒那麼簡單,在使用OpenGL進行繪制算是比較繁瑣的過程,後面也會慢慢去揭曉其他使用方法,來構造一幅一幅精美的特效靜/動圖。

Ⅳ 誰有 Android 3D游戲開發(基礎篇)——Opengl ES游戲引擎實現 的視頻教程

你可以先去【繪學霸】網站找「游戲設計/游戲製作」板塊的【免費】視頻教程-【點擊進入】完整入門到精通視頻教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=307&zdhhr-11y04r-245494221972772924

想要系統的學習可以考慮報一個網路直播課,推薦CGWANG的網路課。老師講得細,上完還可以回看,還有同類型錄播課可以免費學(贈送終身VIP)。

自製能力相對較弱的話,建議還是去好點的培訓機構,實力和規模在國內排名前幾的大機構,推薦行業龍頭:王氏教育。
王氏教育全國直營校區面授課程試聽【復制後面鏈接在瀏覽器也可打開】: www.huixueba.com.cn/school/3dmodel?type=2&zdhhr-11y04r-245494221972772924

在「游戲設計/游戲製作」領域的培訓機構里,【王氏教育】是國內的老大,且沒有加盟分校,都是總部直營的連鎖校區。跟很多其它同類型大機構不一樣的是:王氏教育每個校區都是實體面授,老師是手把手教,而且有專門的班主任從早盯到晚,爆肝式的學習模式,提升會很快,特別適合基礎差的學生。

大家可以先把【繪學霸】APP下載到自己手機,方便碎片時間學習——繪學霸APP下載: www.huixueba.com.cn/Scripts/download.html

Ⅵ Android opengl es 2.0怎麼學習

OpenGL ES學習
OpenGL定義了自己的數據類型。應該堅持使用這些OpenGL的數據類型,從而保證可移植性和效率。OpenGL ES 目前不支持64位數據類型。OpenGL ES 只支持三邊形。OpenGL ES 只支持gl開頭的函數,glu庫都不支持。

Android系統下OpenGL ES 2.0學習入門
完成工具的安裝以後,繼續在Eclipse中創建一個新的Android項目。項目名稱雖然不重要,但是該節將與主要活動有關,因此應認真學習掌握。
首先,新建一個GLSurfaceView對象 */ private GLSurfaceView mGLSurfaceView;
GLSurfaceView是一個特殊的視圖,它為我們管理OpenGL表面並將其繪制到Android視圖系統中。它還添加許多可以簡化OpenGL使用的功能,包括但並不局限於:
它為OpenGL提供一個專用的渲染線程,使主線程得以繼續。
它支持連續或按需渲染,維護屏幕設置以及OpenGL和底層窗口系統之間的介面。代碼如下:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new GLSurfaceView(this); // 檢測系統是否支持 OpenGL ES 2.0 final ActivityManager activityManager = (ActivityManager) getSystemService(Context. ACTIVITY_SERVICE); final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; if (supportsEs2) { mGLSurfaceView.setEGLContextClientVersion(2); mGLSurfaceView.setRenderer(new LessonOneRenderer()); } else { return; } setContentView(mGLSurfaceView); }

在onCreate()方法裡面主要是創建OpenGL ES 2.0上下文以及做一些初始化工作。在onCreate()中,調用超類之後的第一件事情就是創建GLSurfaceView。然後確定系統是否支持OpenGL ES 2.0。因此,我們需要一個可以與全局系統狀態相交互的ActivityManager實例,以及使用這個實例來得到設備配置信息,該信息將通知我們設備是否支持OpenGL ES 2.0。
一旦確定設備是否支持OpenGL ES 2.0後,就會通知表面視圖需要一個與OpenGL ES 2.0相兼容的視圖,然後傳遞一個自定義渲染。這個渲染將在任何需要調整表面或者繪制一個新的幀的時候被系統調用。我們還通過傳遞一個不同的渲染來支持OpenGL Es 1.x,盡管可能由於APIs的不同,導致我們需要編寫不同的代碼,但在這一節中,我們將只關注OpenGL ES 2.0。
最後,我們為GLSurfaceView設置內容視圖,它通知Android活動內容應該填補OpenGL表面,代碼如下:

@Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); }
GLSurfaceView要求我們在任何父Activity的onResume()和onPause()方法被調用的時候調用onResume()和onPause()方法。

Ⅶ OpenGL怎麼學就業能做啥呢

OpenGL就業主要能做3D游戲開發,學習需要一個系統的流程,如下:

openGL學習建議按照如下的步驟進行:

1、基本的線性代數知識,不需要很深入,大學時的線性代數拿出來復習一下足夠用了,特別是矩陣變換部分。

2、C++開發語言,一定要非常熟練。

3、《計算機圖形學》這個應該是高校教材了,這個也是所有圖形學的基礎知識。

4、《3D游戲編程大師技巧》等基礎入門教材,這一類圖書基本上是將基礎知識和openGL API如何使用結合起來,使得讀者可以開始上手開發。同樣的還有 https://learnopengl-cn.github.io/ 這一類網站,都是比較好的入門資料。

5、《openGL編程指南》俗稱「紅寶書」,《OpenGL Super Bible 5th》俗稱「藍寶書」,不過這兩本書更加適合作為查詢手冊,用到哪一塊需要深入了解時進行查詢。

6、再深入就是了解詳細的管線處理流程、shader語言開發等。

openGL主要屬於計算機圖形學方面的內容,這一塊屬於比較專業的領域了。

目前主要做3D游戲開發這一塊用得最多,大公司做游戲引擎開發主要以openGL為主,即便現在很多基於U3D開發的手游,至少也需要熟悉基本的openGL管線流程和一些shader知識。

其次,做一些專業領域的模擬會很多,再次在做各種濾鏡、特效方面也需要用到openGL知識,不過這些方面還需要圖像處理方面的一些知識。

PpenGL的設計

OpenGL規范描述了繪制2D和3D圖形的抽象API。盡管這些API可以完全通過軟體實現,但它是為大部分或者全部使用硬體加速而設計的。

OpenGL的API定義了若干可被客戶端程序調用的函數,以及一些具名整型常量(例如,常量GL_TEXTURE_2D對應的十進制整數為3553)。

雖然這些函數的定義表面上類似於C編程語言,但它們是語言獨立的。因此,OpenGL有許多語言綁定,值得一提的包括:javaScript綁定的WebGL(基於OpenGL ES 2.0在Web瀏覽器中的進行3D渲染的API);C綁定的WGL、GLX和CGL;iOS提供的C綁定;Android提供的Java和C綁定。

OpenGL不僅語言無關,而且平台無關。規范隻字未提獲得和管理OpenGL上下文相關的內容,而是將這些作為細節交給底層的窗口系統。出於同樣的原因,OpenGL純粹專注於渲染,而不提供輸入、音頻以及窗口相關的API。

OpenGL是一個不斷進化的API。新版OpenGL規范會定期由Khronos Group發布,新版本通過擴展API來支持各種新功能。每個版本的細節由Khronos Group的成員一致決定,包括顯卡廠商、操作系統設計人員以及類似Mozilla和谷歌的一般性技術公司。

除了核心API要求的功能之外,GPU供應商可以通過擴展的形式提供額外功能。擴展可能會引入新功能和新常量,並且可能放鬆或取消現有的OpenGL函數的限制。

然後一個擴展就分成兩部分發布:包含擴展函數原型的頭文件和作為廠商的設備驅動。供應商使用擴展公開自定義的API而無需獲得其他供應商或Khronos Group的支持,這大大增加了OpenGL的靈活性。OpenGL Registry負責所有擴展的收集和定義。

每個擴展都與一個簡短的標識符關系,該標識符基於開發公司的名稱。例如,英偉達(nVidia)的標識符是NV。如果多個供應商同意使用相同的API來實現相同的功能,那麼就用EXT標志符。

這種情況更進一步,Khronos Group的架構評審委員(Architecture Review Board,ARB)正式批准該擴展,那麼這就被稱為一個「標准擴展」,標識符使用ARB。

第一個ARB擴展是GL_ARB_multitexture。

OpenGL每個新版本中引入的功能,特別是ARB和EXT類型的擴展,通常由數個被廣泛實現的擴展功能組合而成。

Ⅷ 如何使用Android中的OpenGL ES媒體效果

准備

為了開始本次的教程,你必須具備:
1.一款支持Android開發的IDE,如果你沒有的話,可以在Android Developer website下載最新版本的Android studio。
2.一款運行Android4.0之上Android手機,並且GPU支持OpenGL ES2.0
3.對OpenGL的基本知識了解

設置OpenGL ES環境

創建GLSurfaceView

為了顯示OpenGL的圖形,你需要使用GLSurfaceView類,就像其他任何的View子類意義,你可以將它添加到你的Activity或Fragment之上,通過在布局xml文件中定義或者在代碼中創建實例。

在本次的教程中,我們使用GLSurfaceView作為唯一的View在我們的Activity中,因此,為了簡便,我們在代碼中創建
GLSurfaceView的實例並將其傳入setContentView中,這樣它將會填充你的整個手機屏幕。Activity中的onCreate方
法如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

GLSurfaceView view = new GLSurfaceView(this);
setContentView(view);
}123456123456

因為媒體效果的框架僅僅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中傳入2;
view.setEGLContextClientVersion(2);11

為了確保GLSurfaceView僅僅在必要的時候進行渲染,我們在setRenderMode 方法中進行設置:
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);11

創建Renderer

Renderer負責渲染GLSurfaceView中的內容。

創建類實現介面GLSurfaceView.Renderer,在這里我們打算將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下:
public class EffectsRenderer implements GLSurfaceView.Renderer {

public EffectsRenderer(Context context){
super();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
}

@Override
public void onDrawFrame(GL10 gl) {
}
}

回到Activity中調用setRenderer方法,讓GLSurfaceView使用我們創建的Renderer:
view.setRenderer(new EffectsRenderer(this));11

編寫Manifest文件

如果你想要發布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />11

這會確保你的app只能被安裝在支持OpenGL ES2.0的設備之上。現在OpenGL環境准備完畢。

創建一個OpenGL平面

定義頂點

GLSurfaceView是不能直接顯示一張照片的,照片首先應該被轉化為紋理,應用在OpenGL square之上。在本次教程中,我將創建一個2D平面,並且具有4個頂點。為了簡單,我將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。
public class Square {

}123123

默認的OpenGL系統的坐標系中的原點是在中心,因此4個角的坐標可以表示為:

左下角: (-1, -1)
右下角:(1, -1)
右上角:(1, 1)
左上角:(-1, 1)

我們使用OpenGL繪制的所有的物體都應該是由三角形決定的,為了畫一個方形,我們需要兩個具有一條公共邊的三角形,那意味著這些三角形的坐標應該是:

triangle 1: (-1, -1), (1, -1), 和 (-1, 1)
triangle 2: (1, -1), (-1, 1), 和 (1, 1)

創建一個float數組來代表這些頂點:
private float vertices[] = {
-1f, -1f,
1f, -1f,
-1f, 1f,
1f, 1f,
};123456123456

Ⅸ 如何使用Android中的OpenGL ES媒體效果

創建GLSurfaceView
為了顯示OpenGL的圖形,需要使用GLSurfaceView類,就像其他任何的View子類意義,可以將它添加到自己的Activity或Fragment之上,通過在布局xml文件中定義或者在代碼中創建實例。
在這里,咱使用GLSurfaceView作為唯一的View在咱們的Activity中,因此,為了簡便,在代碼中創建GLSurfaceView的實例並將其傳入setContentView中,這樣它將會填充自己的整個手機屏幕。Activity中的onCreate方法如下:
<code class="hljs" java="">protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView view = new GLSurfaceView(this); setContentView(view);}</code>
因為媒體效果的框架僅僅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中傳入2;
<code avrasm="" class="hljs">view.setEGLContextClientVersion(2);</code>
為了確保GLSurfaceView僅僅在必要的時候進行渲染,咱們在setRenderMode 方法中進行設置:
<code avrasm="" class="hljs">view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);</code>
創建Renderer
Renderer負責渲染GLSurfaceView中的內容。
創建類實現介面GLSurfaceView.Renderer,在這里咱打算將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下:
<code class="hljs" java="">public class EffectsRenderer implements GLSurfaceView.Renderer { public EffectsRenderer(Context context){ super(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { } @Override public void onDrawFrame(GL10 gl) { }}</code>
回到Activity中調用setRenderer方法,讓GLSurfaceView使用咱創建的Renderer:
<code class="hljs" cs="">view.setRenderer(new EffectsRenderer(this));</code>
編寫Manifest文件
如果想要發布自己的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句:
<code class="hljs" xml=""><uses-feature android:glesversion="0x00020000" android:required="true"></uses-feature></code>
這會確保自己的app只能被安裝在支持OpenGL ES2.0的設備之上。現在OpenGL環境准備完畢。
創建一個OpenGL平面
定義頂點
GLSurfaceView是不能直接顯示一張照片的,照片首先應該被轉化為紋理,應用在OpenGL square之上。在這里,咱將創建一個2D平面,並且具有4個頂點。為了簡單,將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。
<code class="hljs" cs="">public class Square {}</code>
默認的OpenGL系統的坐標系中的原點是在中心,因此4個角的坐標可以表示為:
左下角: (-1, -1) 右下角:(1, -1) 右上角:(1, 1) 左上角:(-1, 1)
咱們使用OpenGL繪制的所有的物體都應該是由三角形決定的,為了畫一個方形,咱們需要兩個具有一條公共邊的三角形,那意味著這些三角形的坐標應該是:
triangle 1: (-1, -1), (1, -1), 和 (-1, 1) triangle 2: (1, -1), (-1, 1), 和 (1, 1)
創建一個float數組來代表這些頂點:
<code class="hljs" cpp="">private float vertices[] = { -1f, -1f, 1f, -1f, -1f, 1f, 1f, 1f,};</code>
為了在square上定位紋理,需要確定紋理的頂點坐標,創建另一個數組來表示紋理頂點的坐標:
<code class="hljs" cpp="">private float textureVertices[] = { 0f,1f, 1f,1f, 0f,0f, 1f,0f};</code>
創建緩沖區
這些坐標數組應該被轉變為緩沖字元(byte buffer)在OpenGL可以使用之前,接下來進行定義:
<code class="hljs" cs="">private FloatBuffer verticesBuffer;private FloatBuffer textureBuffer;</code>
在initializeBuffers方法中去初始化這些緩沖區:使用ByteBuffer.allocateDirect來創建緩沖區,因為float是4個位元組,那麼咱們需要的byte數組的長度應該為float的4倍。
下面使用ByteBuffer.nativeOrder方法來定義在底層的本地平台上的byte的順序。使用asFloatBuffer方法將ByteBuffer轉化為FloatBuffer,在FloatBuffer被創建後,調用put方法來將float數組放入緩沖區,最後,調用position方法來保證咱們是由緩沖區的開頭進行讀取。
<code avrasm="" class="hljs">private void initializeBuffers(){ ByteBuffer buff = ByteBuffer.allocateDirect(vertices.length * 4); buff.order(ByteOrder.nativeOrder()); verticesBuffer = buff.asFloatBuffer(); verticesBuffer.put(vertices); verticesBuffer.position(0); buff = ByteBuffer.allocateDirect(textureVertices.length * 4); buff.order(ByteOrder.nativeOrder()); textureBuffer = buff.asFloatBuffer(); textureBuffer.put(textureVertices); textureBuffer.position(0);}</code>
創建著色器
著色器只不過是簡單的運行在GPU中的每個單獨的頂點的C程序,在這里,咱使用兩種著色器:頂點著色器和片段著色器。
頂點著色器的代碼:
<code class="hljs" glsl="">attribute vec4 aPosition; attribute vec2 aTexPosition; varying vec2 vTexPosition; void main() { gl_Position = aPosition; vTexPosition = aTexPosition; };</code>
片段著色器的代碼
<code class="hljs" glsl="">precision mediump float; uniform. sampler2D uTexture; varying vec2 vTexPosition; void main() { gl_FragColor = texture2D(uTexture, vTexPosition); };</code>
如果了解OpenGL,那麼這段代碼來說是熟悉的,如果不能理解這段代碼,可以參考OpenGL documentation。

Ⅹ android 使用opengl es2.0瀏覽全景圖片

先上效果圖

我是android opengl es的初學者,有很多東西還不懂,仍在學習;這里實現全景圖瀏覽的一個思路是,先使用opengl繪制一個球體,這個球體中心位置在手機屏幕的中心,球體的半徑為3。默認攝像機的位置在球體正前方半徑為3的位置上,看著球體的中心,在收觸摸屏幕的時候,不斷調整攝像機的位置,但是保持距離球體中心的位置不變。

球體繪製成功後,將准備好的全景圖,貼在球體的表面,就完成了(不需要對全景圖進行特殊處理,我剛開始的思路是繪制一個正方體天空盒,然後對全景圖進行處理,獲得天空盒六個面的圖像,然後將圖像貼在六個面上,結果發現我不會。。。。)。

這里涉及到
opengl的繪制,可以看看 android opengl es2.0完全入門這篇文章

繪制球體,opengl es2.0隻能繪制點,線和三角形,如果要繪制球體的話,需要將球體表面切分成成千上萬個小矩形,矩形又可以切分成三角形來繪制,只要切分的夠細,看上去就是球體。

繪制球體需要你掌握一點三維空間和三角函數的知識

閱讀全文

與androidopengl入門相關的資料

熱點內容
msf埠遷移命令 瀏覽:880
工商app積分怎麼查詢 瀏覽:143
鐵路app怎麼買火車票 瀏覽:309
移魅族除的app怎麼添加 瀏覽:240
兔籠子大號加密 瀏覽:171
單片機程序燒錄操作成功 瀏覽:878
指標高拋低吸點位源碼 瀏覽:205
25匹壓縮機銅管 瀏覽:570
單片機單燈左移05 瀏覽:150
買伺服器練手什麼配置 瀏覽:783
伺服器被毀該怎麼辦 瀏覽:939
python私有庫 瀏覽:514
Python有中文嗎 瀏覽:736
麥塊的伺服器為什麼都進不去 瀏覽:474
新買的伺服器如何打開 瀏覽:35
安卓軟體游戲怎麼開發 瀏覽:319
用撲克擺愛心解壓神器怎麼擺 瀏覽:70
松下製冷壓縮機 瀏覽:275
pdf里怎麼修改文字 瀏覽:686
已保存文檔加密如何設置 瀏覽:413