導航:首頁 > 操作系統 > androidopengl全景

androidopengl全景

發布時間:2022-07-05 12:21:14

android開發openGL問題

最好能貼出具體的代碼,是通過C++原生代碼還是直接調用android的SDK關於Opengl的API?如果用得是API,需要具體看下google提供的文檔。

② Android 實現360度全景 求助

您好,希望以下回答能幫助您

相關文章 相關文章
老鳥們來看一下這個android:layout_weight是什麼意思呢?
回聲消除
這是 一段實現360度全景的 代碼單獨跑 能起來 現在 想寫一個單擊事件觸發器 觸發這個 我觸發器要寫在繼承於Activity類 的下面 如何寫 急!~ 小弟自學 求指教 啦!~~
http://code.google.com/p/panoramagl-android/downloads/list?can=1&q=
/*
* This file is part of the PanoramaGL library for Android.
*
* Authors: Javier Baez <[email protected]> and Miguel 刟u朼y <[email protected]>
*
* $Id$
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; version 3 of
* the License
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package panoramagl.examples;

import javax.microedition.khronos.opengles.GL10;

import com.android.panoramagl.PLTexture;
import com.android.panoramagl.PLView;
import com.android.panoramagl.enumeration.PLViewType;
import com.android.panoramagl.structs.PLRange;

import android.util.Log;

public class HelloPanorama extends PLView
{
@Override
protected void onGLContextCreated(GL10 g1)
{
super.onGLContextCreated(g1);

System.out.println(g1);

try
{
/*
* Important Note: You must edit AndroidManifest.xml and put android:configChanges="keyboardHidden|orientation" attribute in activity else you have memory problems
*/

//If you want to use setDeviceOrientationEnabled(true), activity orientation only must be portrait. Eg. android:screenOrientation="portrait"
//設置定點陣圖像(false)
this.setDeviceOrientationEnabled(false);

//You can use accelerometer你可以用加速計
this.setAccelerometerEnabled(false);
this.(true);
this.setAccelerometerUpDownEnabled(false);

//Scrolling and Inertia滾動和慣性
this.setScrollingEnabled(true);
this.setInertiaEnabled(true);

//setFovRange determines Zoom range. Range values from -1.0f to 1.0f設置縮放范圍
this.getCamera().setFovRange(PLRange.PLRangeMake(0.0f, 1.0f));

//Example with Sphere type (you need one image)球面型為例,你需要一張圖片
this.setType(PLViewType.PLViewTypeSpherical);//設置風格球形景觀類型
// this.addTextureAndRelease(PLTexture.textureWithImage(this.getImageWithResouce(R.drawable.pano)));
this.addTextureAndRelease(PLTexture.textureWithImage(this.getImageWithResouce(R.drawable.aa)));
}
catch(Throwable ex)
{
Log.e("HelloPanorama::onGLContextCreated", "Error:" + ex.getMessage());
}
}

}

package panoramagl.examples;

import android.app.Activity;
import android.content.Intent;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import javax.microedition.khronos.opengles.GL10;

import com.android.panoramagl.PLView;

public class asa extends Activity {
private PLView plView = new PLView();
//private GLSurfaceView gl_view = null;
private Button button;
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//gl_view = new GLSurfaceView(this);
//
//gl_view.setRenderer(new BaseRend());
//this.setContentView(gl_view);
如您還有疑問可繼續追問。

③ 為什麼使用 android opengl

准備 為了開始本次的教程,你必須具備: 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媒體效果

設置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方法來保證我們是由緩沖區的開頭進行讀取。

創建著色器
著色器只不過是簡單的運行在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。這里有一個簡明扼要的解釋:

頂點著色器負責繪制單個頂點。aPosition是一個變數被綁定到FloatBuffer上,包含著這些頂點的坐標。相似的,aTexPosition 是一個變數被綁定到FloatBuffer上,包含著紋理的坐標。gl_Position 是一個在OpenGL中創建的變數,代表每一個頂點的位置,vTexPosition是一個數組變數,它的值被傳遞到片段著色器中。

在本教程中,片段著色器負責square的著色。它使用texture2D方法從紋理中拾取顏色,並且使用一個在OpenGL中被創建的變數gl_FragColor將顏色分配到片段。

在該類中,著色器的代碼應該被轉化為String。

創建程序
創建新的方法initializeProgram來創建一個編譯和鏈接著色器的OpenGL程序。

使用glCreateShader創建一個著色器對象,並且返回以int為表示形式的指針。為了創建頂點著色器,傳遞GL_VERTEX_SHADER給它。相似的,為了創建一個片段著色器,傳遞GL_FRAGMENT_SHADER給它。下面使用glShaderSource方法關聯相對應的著色器代碼到著色器上。使用glCompileShader編譯著色器代碼。
在編譯了著色器的代碼後,創建一段新的的程序glCreateProgram,與glCreateShader相似,它也返回一個以int為表示形式的指針。調用glAttachShader方法附著著色器到程序中,最後,調用glLinkProgram進行鏈接。

你可能會發現,OpenGL的方法(以gl開頭的)都是在GLES20類中,這是因為我們使用的是OpenGL ES2.0,如果我們使用更高的版本,就會用到這些類:GLES30,GLES31。

畫出形狀
現在定義draw方法來利用我們之前定義的點和著色器進行繪制。

下面是你需要做的:
1.使用glBindFramebuffer方法創建一個幀緩沖對象(FBO)
2.調用glUseProgram創建程序,就像之前所提
3.傳遞GL_BLEND給glDisable方法,在渲染過程中禁用顏色的混合。
4.調用glGetAttribLocation得到變數aPosition和aTexPosition的句柄
5.使用glVertexAttribPointer連接aPosition和aTexPosition的句柄到各自的verticesBuffer和textureBuffer
6.使用glBindTexture方法綁定紋理(作為draw方法的參數傳入)到片段著色器上
7.調用glClear方法清空GLSurfaceView的內容
8.最後,使用glDrawArrays方法畫出兩個三角形(也就是方形)

<code avrasm="" class="hljs">public void draw(int texture){
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glUseProgram(program);
GLES20.glDisable(GLES20.GL_BLEND);

int positionHandle = GLES20.glGetAttribLocation(program, aPosition);
int textureHandle = GLES20.glGetUniformLocation(program, uTexture);
int texturePositionHandle = GLES20.glGetAttribLocation(program, aTexPosition);

GLES20.glVertexAttribPointer(texturePositionHandle, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
GLES20.glEnableVertexAttribArray(texturePositionHandle);

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
GLES20.glUniform1i(textureHandle, 0);

GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, verticesBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}</code>
在構造函數中添加初始化方法:

<code class="hljs" cs="">public Square(){
initializeBuffers();
initializeProgram();
}</code>
渲染OpenGL平面和紋理

現在我們的渲染器什麼也沒做,我們需要改變它來渲染我們在前面創造的平面。

首先,讓我們創建一個Bitmap,添加一張照片到res/drawable文件夾之下,我把它命名為forest.jpg,使用BitmapFactory將照片轉化為Bitmap。另外將照片的尺寸存儲下來。

改變EffectsRenderer的構造函數如下,

<code class="hljs" java="">private Bitmap photo;
private int photoWidth, photoHeight;
public EffectsRenderer(Context context){
super();
photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.forest);
photoWidth = photo.getWidth();
photoHeight = photo.getHeight();
}</code>
創建一個新的方法generateSquare,將Bitmap轉化為紋理,並且出初始化Square對象,你也需要一個數組來保存對紋理的引用,使用glGenTextures來初始化這個數組,glBindTexture方法來在位置0激活紋理。
現在,調用glTexParameteri設置不同的級別,決定紋理被怎樣渲染。

設置GL_TEXTURE_MIN_FILTER(修正功能),GL_TEXTURE_MAG_FILTER(放大功能)給GL_LINEAR,確保圖片是平滑的在它被拉伸的時候。

設置GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T給GL_CLAMP_TO_EDGE,保證紋理不會重復。

最後調用texImage2D方法將Bitmap放置到紋理中,實現方法如下:

<code avrasm="" class="hljs">private int textures[] = new int[2];
private Square square;

private void generateSquare(){
GLES20.glGenTextures(2, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, photo, 0);
square = new Square();
}</code>
當GLSurfaceView的尺寸發生改變時,onSurfaceChanged方法被調用,這時我們需要調用glViewPort確認新的尺寸。調用glClearColor使其變為黑色,接著調用generateSquare重新初始化紋理和平面。

<code class="hljs" java="">@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0,0,width, height);
GLES20.glClearColor(0,0,0,1);
generateSquare();
}</code>
最後在onDrawFrame調用draw方法:


<code class="hljs" java="">@Override
public void onDrawFrame(GL10 gl) {
square.draw(textures[0]);
}</code>
最後,你可以運行程序,在手機上看到你選擇的圖片被渲染出來

⑤ qt android 怎樣使用opengl

qt 可以通過QGLWidget運行opengl。QGLWidget繼承QWidget,能夠直接在裡面調用opengl的介面。這個在qt文檔里有具體說明,也有相關例子,所以不贅述了。但是無法在正式軟體裡面執行,為什麼?因為正式軟體是用QGraphicsScene這個場景類操作和操作一切item,而用QGraphicsView將其顯示出來,而每一個item都是QGraphicsItem的子類。QGLWidget並不是QGraphicsItem類,我曾經嘗試用普通的QWidget類那樣,通過proxy來加進QGraphicsItem,但是沒有成功。或許有方法,但是沒有找到。
於是我放棄了用QGLWidget來操作opengl的打算,尋找直接在QGraphicsItem中操作opengl的方法。通過查看文檔和示例代碼,找到了這個方法:
1 往qt工程文件里添加opengl以及對應的lib。
2 對QGraphicsView進行一個三維對話框的指定,代碼如下:
QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
widget->makeCurrent();
QGraphicsView view;
view.setViewport(widget);
上述代碼告訴了 QGraphicsView 類當前繪制的對象是支持opengl的。於是所有的場景中的item都將繪制到widget 上。
3 寫一個QGraphicsItem的繼承類,特別要重寫paint函數。代碼如下:
void XXX::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->beginNativePainting();
glColor3f(0.5,1.0,0.2);
glBegin(GL_TRIANGLES);
glVertex3f(100.0,100.0,-100.0);
glVertex3f(150.0, 100.0, -100.0);
glVertex3f(100.0, 150.0, -100.0);
glEnd();
painter->endNativePainting();
}
上面這個函數主要是用opengl介面繪制了一個三角形。記住,在opengl繪制之前一定要執行painter->beginNativePainting()以及painter->endNativePainting()這兩個語句。
QGraphicsScene、 QGraphicsView和QGraphicsItem的關系可以查閱相關文檔,也不贅述了。
不過我按照這個方式畫的三角形,怎麼也在窗口上顯示不出來,找了半天才發現問題在這個函數上QGraphicsItem::boundingRect()。這個函數是 干什麼用的呢?主要用來返回該item的初始化大小,這個大小不會輕易改變,後續的改變都可以通過矩陣來完成,但是初始大小是不變的。QGraphicsView通過這個矩形來判斷當前item是不是需要重繪,如果在重繪區外,則不調用重繪函數了。同時碰撞檢測之類,也可以用這個矩形來判斷。原來,item本身的矩陣外包框不對,所以才導致了重回不出來,改過來就正確了。
上面說的很潦草,具體怎麼改的步驟就不說了。要想正確的繪制,必須得弄清楚坐標系的關系,QGraphicsScene、QGraphicsView以及QGraphicsItem這三個坐標繫到底是什麼關系。我看了文檔,也自己進行了測試,但是感覺文檔和測試的結果有些出入。具體出入不說了。說一下自己得心的吧。
先說明:涉及到一切大小和長度,都是像素大小,至少我測試的結果是這樣的。
在建立QGraphicsScene對象的時候,有一個構造函數是矩形,這個矩形是什麼含義呢?經過測試,發現這個矩形並沒有指定彈出窗口的位置,比如,我把矩形的左上角點指定為-1000,-1000,顯示的位置和1000,1000是一樣的,而長度則正確指定了(當然,可能會有滾動條)。所以,這個矩形的左上角點並不是顯示的窗口的位置,而是它在邏輯上的左上角點。我們顯示一切item,都是以這個邏輯上的坐標系為准來繪制的。比如,左上角點是-1000,-1000,而item的位置在-500,-500,則這個-500,-500相當於在顯示窗口的左上角往下各加500個像素的坐標的位置。
那麼 QGraphicsItem的boundingRect是什麼意思呢?返回的是什麼大小?是以什麼坐標系顯示的大小?首先,這個大小肯定是以像素為單位的,其次,這個矩形的坐標是以QGraphicsScene的邏輯坐標為準的。當然這個大小是沒有任何矩陣疊加的大小。有了矩陣疊加後,實際的矩形可能會發生變化。假如在boundingRect中指定矩形的左上角為100,100,那麼最終體現的位置則是QGraphicsScene邏輯坐標100,100的位置,如果QGraphicsScene的左上角點已經指定為-1000,-1000,那麼這個位置實際上就是離窗口左上角點1100,1100的位置(由於有滾動條,所以也不一定是這個長度。)
那麼在QGraphicsItem的paint函數中進行了opengl繪制用的是什麼坐標呢?其實用的也是QGraphicsScene的邏輯坐標。如上面的例子,繪制的直角三角形直角頂點是0,0,那麼顯示的位置就是距離顯示窗口左上角點1000,1000的位置。不過opengl的所有繪制都是沒有矩陣疊加的基礎上,如果用矩陣疊加,則顯示的位置肯定和指定的有區別了。比如,我用setPos強制指定一個位置,這個位置將和opengl繪圖坐標相疊加,最後顯示到窗口上。我推測setPos其實是改變了矩陣,是一個平移矩陣。

⑥ 如何在Android上使用OpenGL ES 2.0繪制點

如何在Android使用OpenGL
ES
2.0繪制點,看上去並不是一個復雜的問題,但是上網一搜,滿眼都是繪制點的代碼。
如果你看到類似如下代碼,基本上你已經掉坑裡了。
···
c
glBeging();
...
glDrawPoint(...);
...
glEnd();
```
如上是使用OpenGL
ES
1.0繪制點的代碼。因為架構不同,在OPENGL
ES
2.0的世界裡,這一套已經徹底不管用了。
在OpenGL
ES
2.0里繪制點,要使用Shader,使用Shader,用Shader。。。。。。
具體怎麼繪制呢,首先你要搞清楚,如何用Shader繪制一個普通帶顏色的三角形。我這里假設你已經會了。
三角形顯示出來的那一刻,你一定會有這樣的代碼:
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,
0,
vertexCount);
那麼,只顯示三角形的三個頂點該怎麼辦,說來簡單,這行代碼改成
GLES20.glDrawArrays(GLES20.GL_POINTS,
0,
vertexCount);
即可。
但是,理想和現實的差距總是很大,改完後三角形消失了但是頂點沒有出現。正常OpenGL
2.0環境下應該怎麼做呢?
1)首先調用
GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
這樣在Shader中可以訪問glPointSize;
2)然後類似准備每個頂點色彩那樣准備頂點的大小的數值,三角形是三個頂點,就准備3個float。把頂點數據像色彩數據那樣,綁定到VOB,再綁定到Shader的參數中。基本上就是照準備色彩那樣准備頂點大小數據,不同之處在於每個色彩4個float,每個頂點尺寸1個float。
3)最後,把你的頂點Shader文件改好,增加頂點大小的輸入參數和gl_PointSize賦值。
4)另外,如果你打算顯示圓形頂點,而不是方形的,還要用GL20.glEnable()函數設置其他參數,具體可查OpenGL官網。
比如:
uniform
mat4
matrix;
attribute
vec4
aVertex;
attribute
vec4
aColor;
attribute
float
aPointSize;
varying
vec4
vColor;
void
main(){
vColor
=
aColor;
gl_Position
=
matrix
*
aVertex;
gl_PointSize
=
aPointSize;
}
這樣,基本上就搞定了。
現在,坑爹的問題來了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎認為在手機的3D環境下繪制點沒多大必要性,所以並沒有加上這個參數,好在預設情況下,模擬器中Shader中的gl_PointSize是打開的(Android
4.4.x)。所以你可以跳過第一步,直接傳遞點大小的參數,並把Shader改好就成。
那麼,為什麼你不寫gl_PointSize
=
aPointSize,點就顯示不出來呢。我估計預設情況下,gl_PointSize
=
0.0f,所以顯示不出來。
如果你顯示點的大小總是固定不變的,你甚至可以把傳遞頂點大小數值的步驟也省略掉,直接在Shader中寫上gl_PointSize
=
10.0f;即可。
閱讀本文,當你打算在Android上用OPENGL
ES
2.0顯示點時,即可跳過谷歌的那些坑了。我想,手機GPU硬體廠商的開發包應該對OpenGL
ES
2.0支持的更好些,比如高通的AdrenoSDK,建議大家下載嘗試。

⑦ 如何查看android系統的openGL版本

android中查看手機系統的OpenGL版本,可以使用如下代碼進行查詢:

ActivityManageram=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfoinfo=am.getDeviceConfigurationInfo();
info.reqGlEsVersion=0x00010001//代表opengles1.1
info.reqGlEsVersion=0x00020000//代表opengles2.0

ActivityManager是Android框架的一個重要部分,它負責一新ActivityThread進程創建,Activity生命周期的維護。ActivityManagerProxy實現了介面IActivitManager,但並不真正實現這些方法,它只是一個代理類,真正動作的執行為Stub類ActivityManagerService,ActivityManagerService對象只有一個並存在於system_process進程中,ActivityManagerService繼承於ActivityManagerNative存根類。

⑧ android opengl製作地圖 繪制圖片的問題

是要自己開發地圖引擎,還是需要用地圖引擎類似的功能啊。。。如果是後者那麼android的Google Map API 就是基於OpenGL ES 的,如果是想自己開發地圖引擎,既然Google做了,所以說是可行的,至於感覺如何只有自己做過了才知道啊

⑨ android怎樣構建真實的交互 opengl

你安裝android的sdk了嗎?裡面有個gles的demo程序,界面上畫了個綠色的小機器人三角形.你把那個demo工程創建出來就行了.裡面有最簡單的用法

閱讀全文

與androidopengl全景相關的資料

熱點內容
東營銀行app限額在哪裡設置 瀏覽:479
word虛擬列印pdf 瀏覽:733
pdf畫面 瀏覽:886
文件夾常用命令 瀏覽:203
被調侃的程序員 瀏覽:489
哪裡有無損音樂app下載 瀏覽:221
單片機如何使用proteus 瀏覽:991
java常用的伺服器 瀏覽:281
集結APP在哪裡下載 瀏覽:800
歐洲cf玩什麼伺服器 瀏覽:529
如何連接另一台電腦上的共享文件夾 瀏覽:681
如何讓桌面文件夾搬家到e盤 瀏覽:73
java自動格式化 瀏覽:619
ipad怎麼查看文件夾大小 瀏覽:583
手工粘土解壓球 瀏覽:552
在線視頻教育源碼 瀏覽:41
快四十學什麼編程 瀏覽:754
gnumakelinux 瀏覽:537
視易峰雲伺服器怎麼改系統 瀏覽:535
javamap取值 瀏覽:768