android平臺(tái)下OpenGL ES 3.0繪制圓點(diǎn)泄鹏、直線和三角形

OpenGL ES 3.0學(xué)習(xí)實(shí)踐

目錄

新建SimpleRenderer

public class SimpleRenderer implements GLSurfaceView.Renderer

定義圓點(diǎn)坐標(biāo)

private float[] vertexPoints = new float[]{
        0.0f, 0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f
};

理想狀態(tài)下的屏幕坐標(biāo)系躬翁,我們定義的就是下圖中的三角形的三個(gè)頂點(diǎn)。

image

分配本地內(nèi)存

因?yàn)?code>OpenGL作為本地系統(tǒng)庫(kù)運(yùn)行在系統(tǒng)中拾给,虛擬機(jī)需要分配本地內(nèi)存,供其存取兔沃。

public SimpleRenderer() {
        //分配內(nèi)存空間,每個(gè)浮點(diǎn)型占4字節(jié)空間
        vertexBuffer = ByteBuffer.allocateDirect(vertexPoints.length * 4)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        //傳入指定的坐標(biāo)數(shù)據(jù)
        vertexBuffer.put(vertexPoints);
        vertexBuffer.position(0);
}

頂點(diǎn)著色器

#version 300 es
layout (location = 0) in vec4 vPosition;
void main() {
     gl_Position  = vPosition;
     gl_PointSize = 10.0;
}

上述頂點(diǎn)著色器的描述:

  • 第一行表示:著色器的版本蒋得,OpenGL ES 2.0版本可以不寫(xiě)。
  • 第二行表示:輸入屬性的數(shù)組(一個(gè)名為vPosition的4分量向量)乒疏,layout (location = 0)表示這個(gè)變量的位置是頂點(diǎn)屬性0额衙。
  • 第三行表示:聲明一個(gè)main函數(shù)。
  • 第四行表示:它將vPosition輸入屬性拷貝到名為gl_Position的特殊輸出變量怕吴。
  • 第五行表示:它將浮點(diǎn)數(shù)據(jù)10.0拷貝到gl_PointSize的變量中窍侧。

片段著色器

#version 300 es
precision mediump float;
out vec4 fragColor;
void main() {
     fragColor = vec4(1.0,1.0,1.0,1.0);
}

上述片段著色器的描述:

  • 第一行表示:著色器的版本,OpenGL ES 2.0版本可以不寫(xiě)转绷。
  • 第二行表示:聲明著色器中浮點(diǎn)變量的默認(rèn)精度伟件。
  • 第三行表示:著色器聲明一個(gè)輸出變量fragColor,這個(gè)是一個(gè)4分量的向量议经。
  • 第五行表示:表示將顏色值(1.0,1.0,1.0,1.0)斧账,輸出到顏色緩沖區(qū)。

編譯和加載著色器

    /**
     * 編譯
     *
     * @param type  頂點(diǎn)著色器:GLES30.GL_VERTEX_SHADER
     *               片段著色器:GLES30.GL_FRAGMENT_SHADER
     * @param shaderCode
     * @return
     */
    private static int compileShader(int type, String shaderCode) {
        //創(chuàng)建一個(gè)著色器
        final int shaderId = GLES30.glCreateShader(type);
        if (shaderId != 0) {
            //加載到著色器
            GLES30.glShaderSource(shaderId, shaderCode);
            //編譯著色器
            GLES30.glCompileShader(shaderId);
            //檢測(cè)狀態(tài)
            final int[] compileStatus = new int[1];
            GLES30.glGetShaderiv(shaderId, GLES30.GL_COMPILE_STATUS, compileStatus, 0);
            if (compileStatus[0] == 0) {
                String logInfo = GLES30.glGetShaderInfoLog(shaderId);
                System.err.println(logInfo);
                //創(chuàng)建失敗
                GLES30.glDeleteShader(shaderId);
                return 0;
            }
            return shaderId;
        } else {
            //創(chuàng)建失敗
            return 0;
        }
    }

鏈接到著色器

    /**
     * 鏈接小程序
     *
     * @param vertexShaderId 頂點(diǎn)著色器
     * @param fragmentShaderId 片段著色器
     * @return
     */
    public static int linkProgram(int vertexShaderId, int fragmentShaderId) {
        final int programId = GLES30.glCreateProgram();
        if (programId != 0) {
            //將頂點(diǎn)著色器加入到程序
            GLES30.glAttachShader(programId, vertexShaderId);
            //將片元著色器加入到程序中
            GLES30.glAttachShader(programId, fragmentShaderId);
            //鏈接著色器程序
            GLES30.glLinkProgram(programId);
            final int[] linkStatus = new int[1];
            GLES30.glGetProgramiv(programId, GLES30.GL_LINK_STATUS, linkStatus, 0);
            if (linkStatus[0] == 0) {
                String logInfo = GLES30.glGetProgramInfoLog(programId);
                System.err.println(logInfo);
                GLES30.glDeleteProgram(programId);
                return 0;
            }
            return programId;
        } else {
            //創(chuàng)建失敗
            return 0;
        }
    }

設(shè)置視口

這一步通常在onSurfaceChanged中完成

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
     GLES30.glViewport(0, 0, width, height);
}

清除顏色緩沖區(qū)

GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

緩沖區(qū)將會(huì)用GLES30.glClearColor指定的顏色清除煞肾,清除的顏色被設(shè)置為(0.5f, 0.5f, 0.5f, 0.5f)咧织,所以屏幕顯示為灰色。

繪制圓點(diǎn)

public void onDrawFrame(GL10 gl)回調(diào)方法中:

//準(zhǔn)備坐標(biāo)數(shù)據(jù)
GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer);
//啟用頂點(diǎn)的句柄
GLES30.glEnableVertexAttribArray(0);
//繪制三個(gè)點(diǎn)
GLES30.glDrawArrays(GLES30.GL_POINTS, 0, 3);

//禁止頂點(diǎn)數(shù)組的句柄
GLES30.glDisableVertexAttribArray(0);

剛才的頂點(diǎn)著色器已經(jīng)將vPosition變量與輸入屬性位置0綁定了籍救,頂點(diǎn)著色器中每個(gè)屬性都由一個(gè)無(wú)符號(hào)整數(shù)值唯一標(biāo)識(shí)的位置习绢。

image

繪制直線

//繪制直線
GLES30.glDrawArrays(GLES30.GL_LINE_STRIP, 0, 2);
GLES30.glLineWidth(10);

繪制如圖所示:

image

繪制三角形

//繪制三角形
GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 2);
image

常用圖元類型

圖元類型 描述
GL_POINTS 點(diǎn)精靈圖元,對(duì)指定的每個(gè)頂點(diǎn)進(jìn)行繪制钧忽。
GL_LINES 繪制一系列不相連的線段毯炮。
GL_LINE_STRIP 繪制一系列相連的線段逼肯。
GL_LINE_LOOP 繪制一系列相連的線段,首尾相連桃煎。
GL_TRIANGLES 繪制一系列單獨(dú)的三角形篮幢。
GL_TRIANGLE_STRIP 繪制一系列相互連接的三角形。
GL_TRIANGLE_FAN 繪制一系列相互連接的三角形为迈。

直線圖元類型:

image

三角形圖元類型

image

項(xiàng)目地址:
https://github.com/byhook/opengles4android

原文地址:
http://blog.csdn.net/byhook/article/details/83719500

參考:
《OpenGL ES 3.0 編程指南第2版》
《OpenGL ES應(yīng)用開(kāi)發(fā)實(shí)踐指南Android卷》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末三椿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葫辐,更是在濱河造成了極大的恐慌搜锰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耿战,死亡現(xiàn)場(chǎng)離奇詭異蛋叼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剂陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)狈涮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鸭栖,你說(shuō)我怎么就攤上這事歌馍。” “怎么了晕鹊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵松却,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溅话,道長(zhǎng)晓锻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任公荧,我火速辦了婚禮带射,結(jié)果婚禮上同规,老公的妹妹穿的比我還像新娘循狰。我一直安慰自己,他們只是感情好券勺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布绪钥。 她就那樣靜靜地躺著,像睡著了一般关炼。 火紅的嫁衣襯著肌膚如雪程腹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天儒拂,我揣著相機(jī)與錄音寸潦,去河邊找鬼色鸳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛见转,可吹牛的內(nèi)容都是我干的命雀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斩箫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吏砂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乘客,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狐血,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后易核,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匈织,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年牡直,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了报亩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡井氢,死狀恐怖弦追,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情花竞,我是刑警寧澤劲件,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站约急,受9級(jí)特大地震影響零远,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厌蔽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一牵辣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奴饮,春花似錦纬向、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至投剥,卻和暖如春师脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吃警, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糕篇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓酌心,卻偏偏與公主長(zhǎng)得像娩缰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谒府,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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