Android openngl學(xué)習(xí)筆記一形病,如何利用opengl畫基本圖形

OpenGL在java層實(shí)現(xiàn)制圖博杖,一般都是通過GlsurfaceView來顯示的 屡谐,
以下內(nèi)容源于:<a >傳送門</a>
(加小部分的個(gè)人理解)
先介紹下GlSurfaceView的幾個(gè)特點(diǎn):
1、管理一個(gè)平面籍琳,這個(gè)平面是一個(gè)特殊的內(nèi)存塊菲宴,它可以和android視圖系統(tǒng)混合
2、管理一個(gè)EGL顯示趋急,他能夠讓OpenGl渲染到一個(gè)屏幕喝峦,關(guān)于EGL 是個(gè)什么鬼,詳見:<a >EGL接口解析與理解</a>
3呜达、接受一個(gè)用戶提供的實(shí)際顯示的Renderer對(duì)象(...渲染器谣蠢,可以理解為GlSurface是畫布,而Renderer是畫筆查近,文中通過setRenderer(mRenderer)關(guān)聯(lián)起來)
4眉踱、使用一個(gè)專用線程去渲染從而和UI線程解耦(話說SurfaceView 也是可以直接在子線程更新UI的說)
5、支持on-demand和連續(xù)的渲染
6霜威、可選的包谈喳,追蹤或者錯(cuò)誤檢查這個(gè)渲染器的OpenGl調(diào)用

接下來直接上代碼:

public class MainActivity extends   AppCompatActivity {
private GLSurfaceView glSurfaceVie;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
glSurfaceVie= new GLSurfaceView(this);
setContentView(glSurfaceVie);
glSurfaceVie.setRenderer(new EffectsRender(this));
}

@Override
protected void onResume() {
super.onResume();
glSurfaceVie.onResume();
}

@Override
protected void onPause() {
super.onPause();
glSurfaceVie.onPause();
}
}

//渲染器

public class EffectsRender implements GLSurfaceView.Renderer {
    private Bitmap mBitmap;
    private int photow,photoh;
    private int textures[] = new int[2];    
    private Square square;
    private Context mContext;
    public EffectsRender(Context context) {
        super();
        this.mContext =context;
        square = new Square();
      /*  mBitmap = BitmapFactory.decodeResource(context.getResources(),R.mipmap.bitmap);
        photow=mBitmap.getWidth();
        photoh =mBitmap.getHeight();*/
    }
    private void getSquare(){

        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);

    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //清除屏幕顏色
        gl.glClearColor(0.0f,0.0f,0.0f,1.0f);
        //
        gl.glClearDepthf(1.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        //這里告訴OpenGL我們希望進(jìn)行最好的透視修正。這會(huì)十分輕微的影響性能戈泼。但使得透視圖看起來好一點(diǎn).
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);
        //啟用smooth shading(陰影平滑).陰影平滑通過多邊形精細(xì)的混合色彩婿禽,并對(duì)外部光進(jìn)行平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
       // 關(guān)閉服務(wù)器端GL功能,在GL中很多都是一對(duì)一對(duì)的,比如這個(gè)的另一個(gè)gl.glEnable(...).
        gl.glDisable(GL10.GL_DITHER);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        if(height==0){
            height=1;
        }
        float aspect=(float)width/height;

        //設(shè)置可見區(qū)域
        gl.glViewport(0,0,width,height);
        //有3種模式: GL_PROJECTION 投影, GL_MODELVIEW 模型視圖, GL_TEXTURE 紋理.===>處理之前提前告訴計(jì)算機(jī),
        gl.glMatrixMode(GL10.GL_PROJECTION);
        //重設(shè)視圖模型變換 大猛, 用于觀測(cè)創(chuàng)建的物體.
        gl.glLoadIdentity();
        //個(gè)人理解 ===》即為視角 -  - 不知道準(zhǔn)不準(zhǔn)
        GLU.gluPerspective(gl,45,aspect,0.1f,100.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

//這里會(huì)一直執(zhí)行扭倾,相當(dāng)于一個(gè)無限循環(huán)的線程
    @Override
    public void onDrawFrame(GL10 gl) {
        //將緩存清除為預(yù)先的設(shè)置值.
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        gl.glTranslatef(0f,00f,-6f);
        square.draw(gl);


    }
}

繪制圖形:

public class Square {
private FloatBuffer vertexBuffer;
private ByteBuffer indexBuffer;
  //這個(gè)是坐標(biāo)軸的坐標(biāo),一個(gè)條數(shù)據(jù)代表一個(gè)坐標(biāo)點(diǎn)挽绩,分別是XYZ軸的坐標(biāo)點(diǎn)
private float[] vertices={
    -1.0f,-1.0f,0.0f,
    1.0f,-1.0f,0.0f,
    -1.0f,1.0f,0.0f,
    1.0f,1.0f,0.0f
};
private byte[] indices={0,1,2};
public Square(){

//創(chuàng)建一個(gè)緩沖區(qū)吆录,長(zhǎng)度是verticesBuffer的四倍 應(yīng)為verticesBuffer 是四個(gè)字節(jié)的
ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);
//定義在底層的本地平臺(tái)上的byte的順序=====》這個(gè)沒弄懂,感覺就像fragmenglayout的層級(jí)關(guān)系差不多
vbb.order(ByteOrder.nativeOrder());
//把byte類型的buff轉(zhuǎn)成Float
vertexBuffer=vbb.asFloatBuffer();
vertexBuffer.put(vertices);
//保證是從緩沖區(qū)的開頭讀取琼牧,相當(dāng)于list的第一個(gè)數(shù)據(jù)下標(biāo)
vertexBuffer.position(0);


indexBuffer=ByteBuffer.allocateDirect(indices.length);
indexBuffer.put(indices);
indexBuffer.position(0);
}

//此方法在后面被它的實(shí)例對(duì)象調(diào)用
public void draw(GL10 gl){

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//第一個(gè)參數(shù)代表每個(gè)坐標(biāo)點(diǎn)用幾個(gè)坐標(biāo)表示(即xyz三軸)恢筝,第二個(gè)參數(shù)指坐標(biāo)軸應(yīng)當(dāng)被解析為folat類型(這樣OpenGL就可以知道每個(gè)值占用幾位)
//第三個(gè)參數(shù)可以稱為“步長(zhǎng)”,代表每個(gè)點(diǎn)之間有幾位分割巨坊。本例中撬槽,0代表一個(gè)點(diǎn)挨著一個(gè)點(diǎn),有時(shí)候你可能會(huì)在點(diǎn)的后面定義顏色趾撵,這時(shí)侄柔,你應(yīng)該指出每個(gè)顏色占用的位長(zhǎng)共啃,以便OpenGL在解析時(shí)跳過這段長(zhǎng)度.
gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,vertices.length/3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暂题,隨后出現(xiàn)的幾起案子移剪,更是在濱河造成了極大的恐慌,老刑警劉巖薪者,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纵苛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡言津,警方通過查閱死者的電腦和手機(jī)攻人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬槽,“玉大人怀吻,你說我怎么就攤上這事〕跗牛” “怎么了蓬坡?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)磅叛。 經(jīng)常有香客問我渣窜,道長(zhǎng),這世上最難降的妖魔是什么宪躯? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮位迂,結(jié)果婚禮上访雪,老公的妹妹穿的比我還像新娘。我一直安慰自己掂林,他們只是感情好臣缀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泻帮,像睡著了一般精置。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锣杂,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天脂倦,我揣著相機(jī)與錄音,去河邊找鬼元莫。 笑死赖阻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踱蠢。 我是一名探鬼主播火欧,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了苇侵?” 一聲冷哼從身側(cè)響起赶盔,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榆浓,沒想到半個(gè)月后于未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哀军,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年沉眶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杉适。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谎倔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猿推,到底是詐尸還是另有隱情片习,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布蹬叭,位于F島的核電站藕咏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秽五。R本人自食惡果不足惜孽查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坦喘。 院中可真熱鬧盲再,春花似錦、人聲如沸瓣铣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棠笑。三九已至梦碗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓖救,已是汗流浹背洪规。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留循捺,地道東北人淹冰。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巨柒,于是被迫代替她去往敵國(guó)和親樱拴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柠衍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容