OpenGL 矩形

在前面的三角形的基礎上繪制矩形就簡單很多了杈抢,改下頂點坐標就可以繪制出來,這里有兩種繪制方式仑性。

第一種繪制方式

class RectangleRender : GLSurfaceView.Renderer {

    private val vao = IntArray(1)
    private val vbo = IntArray(1)
    private val ebo = IntArray(1)
    private var esShader = Shader()

    private var vertices = floatArrayOf(
        0.5f, 0.5f, 0.0f,   // 右上角
        0.5f, -0.5f, 0.0f,  // 右下角
        -0.5f, -0.5f, 0.0f, // 左下角
        -0.5f, 0.5f, 0.0f   // 左上角
    )

    private var indices = shortArrayOf(
        0, 1, 3, // 第一個三角形
        1, 2, 3  // 第二個三角形
    )

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES30.glClearColor(0.2f, 0.3f, 0.3f, 1.0f)

        //vao
        GLES30.glGenVertexArrays(1, vao, 0)
        GLES30.glBindVertexArray(vao[0])
        //vbo
        GLES30.glGenBuffers(1, vbo, 0)
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0])
        val vertexBuffer = DataUtil.createByteBuffer(vertices)
        //復制數(shù)據(jù)到opengl
        GLES30.glBufferData(
            //頂點緩沖對象當前綁定到GL_ARRAY_BUFFER目標上
            GLES30.GL_ARRAY_BUFFER,
            //指定傳輸數(shù)據(jù)的大小(以字節(jié)為單位)
            vertices.size * DataUtil.sizeof(GLES30.GL_FLOAT),
            //發(fā)送的實際數(shù)據(jù)
            vertexBuffer,
            //GL_STATIC_DRAW :數(shù)據(jù)不會或幾乎不會改變惶楼。
            //GL_DYNAMIC_DRAW:數(shù)據(jù)會被改變很多。
            //GL_STREAM_DRAW :數(shù)據(jù)每次繪制時都會改變
            GLES30.GL_STATIC_DRAW
        )
        //設置頂點數(shù)組指針
        GLES30.glVertexAttribPointer(
            //shader中 layout(location = 0)的值
            0,
            //頂點屬性的大小诊杆。頂點屬性是一個vec3歼捐,它由3個值組成,所以大小是3
            3,
            //數(shù)據(jù)的類型
            GLES30.GL_FLOAT,
            //GL_TRUE刽辙,數(shù)據(jù)被標準化窥岩,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間甲献。我們把它設置為GL_FALSE
            false,
            //步長宰缤,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
            3 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 這里只有頂點 位置數(shù)據(jù)在數(shù)組的開頭,所以這里是0
            0
        )
        GLES30.glEnableVertexAttribArray(0)
        //vbo end
        //vao end

        //ebo start
        GLES30.glGenBuffers(1, ebo, 0)
        GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, ebo[0])
        val indexBuffer = DataUtil.createByteBuffer(indices)
        //復制數(shù)據(jù)到opengl
        GLES30.glBufferData(
            //頂點緩沖對象當前綁定到GL_ELEMENT_ARRAY_BUFFER目標上
            GLES30.GL_ELEMENT_ARRAY_BUFFER,
            //指定傳輸數(shù)據(jù)的大小(以字節(jié)為單位)
            indices.size * DataUtil.sizeof(GLES30.GL_SHORT),
            //發(fā)送的實際數(shù)據(jù)
            indexBuffer,
            //GL_STATIC_DRAW :數(shù)據(jù)不會或幾乎不會改變晃洒。
            //GL_DYNAMIC_DRAW:數(shù)據(jù)會被改變很多慨灭。
            //GL_STREAM_DRAW :數(shù)據(jù)每次繪制時都會改變
            GLES30.GL_STATIC_DRAW
        )
        //ebo end

        //shader
        esShader.loadProgramFromAsset(MyApp.context, "triangle_vert.glsl", "triangle_frag.glsl")
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
    }

    override fun onDrawFrame(gl: GL10?) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)
        esShader.use()
        GLES30.glBindVertexArray(vao[0])

        GLES30.glDrawElements(
            //圖元的類型
            GLES30.GL_TRIANGLES,
            //定點個數(shù)
            6,
            //定點數(shù)據(jù)類型
            GLES30.GL_UNSIGNED_SHORT,
            //頂點偏移量
            0
        )

    }
}

這里跟繪制三角形有區(qū)別的地方是使用了索引來繪制,創(chuàng)建索引跟創(chuàng)建vbo是一樣的球及⊙踔瑁看代碼里面的注釋。
繪制時使用

GLES30.glDrawElements(
            //圖元的類型
            GLES30.GL_TRIANGLES,
            //定點個數(shù)
            6,
            //定點數(shù)據(jù)類型
            GLES30.GL_UNSIGNED_SHORT,
            //頂點偏移量
            0
        )

這樣可以節(jié)省頂點數(shù)據(jù)吃引。

第二種繪制方式

這種就是定義6個頂點筹陵,繪制兩個三角形

class RectangleRender2 : GLSurfaceView.Renderer {

    private val vao = IntArray(1)
    private val vbo = IntArray(1)
    private var esShader = Shader()

    private var vertices = floatArrayOf(
        -0.5f, 0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        // second triangle
        -0.5f, 0.5f, 0.0f,
        0.5f, 0.5f, 0.0f,
        0.5f, -0.5f, 0.0f
    )

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES30.glClearColor(0.2f, 0.3f, 0.3f, 1.0f)

        //vao
        GLES30.glGenVertexArrays(1, vao, 0)
        GLES30.glBindVertexArray(vao[0])
        //vbo
        GLES30.glGenBuffers(1, vbo, 0)
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0])
        val vertexBuffer = DataUtil.createByteBuffer(vertices)
        //復制數(shù)據(jù)到opengl
        GLES30.glBufferData(
            //頂點緩沖對象當前綁定到GL_ARRAY_BUFFER目標上
            GLES30.GL_ARRAY_BUFFER,
            //指定傳輸數(shù)據(jù)的大小(以字節(jié)為單位)
            vertices.size * DataUtil.sizeof(GLES30.GL_FLOAT),
            //發(fā)送的實際數(shù)據(jù)
            vertexBuffer,
            //GL_STATIC_DRAW :數(shù)據(jù)不會或幾乎不會改變。
            //GL_DYNAMIC_DRAW:數(shù)據(jù)會被改變很多镊尺。
            //GL_STREAM_DRAW :數(shù)據(jù)每次繪制時都會改變
            GLES30.GL_STATIC_DRAW
        )
        //設置頂點數(shù)組指針
        GLES30.glVertexAttribPointer(
            //shader中 layout(location = 0)的值
            0,
            //頂點屬性的大小朦佩。頂點屬性是一個vec3,它由3個值組成庐氮,所以大小是3
            3,
            //數(shù)據(jù)的類型
            GLES30.GL_FLOAT,
            //GL_TRUE语稠,數(shù)據(jù)被標準化,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間弄砍。我們把它設置為GL_FALSE
            false,
            //步長仙畦,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
            3 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 這里只有頂點 位置數(shù)據(jù)在數(shù)組的開頭,所以這里是0
            0
        )
        GLES30.glEnableVertexAttribArray(0)
        //vbo end
        //vao end
        //shader
        esShader.loadProgramFromAsset(MyApp.context, "triangle_vert.glsl", "triangle_frag.glsl")
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
    }

    override fun onDrawFrame(gl: GL10?) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)
        esShader.use()
        GLES30.glBindVertexArray(vao[0])

        GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 6)

    }
}

代碼比較簡單音婶、也有注釋慨畸,就這樣了。

代碼

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣式,一起剝皮案震驚了整個濱河市先口,隨后出現(xiàn)的幾起案子型奥,更是在濱河造成了極大的恐慌,老刑警劉巖碉京,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厢汹,死亡現(xiàn)場離奇詭異,居然都是意外死亡谐宙,警方通過查閱死者的電腦和手機烫葬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡蜻,“玉大人搭综,你說我怎么就攤上這事』ǎ” “怎么了兑巾?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忠荞。 經(jīng)常有香客問我蒋歌,道長,這世上最難降的妖魔是什么委煤? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任堂油,我火速辦了婚禮,結果婚禮上碧绞,老公的妹妹穿的比我還像新娘府框。我一直安慰自己,他們只是感情好讥邻,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布迫靖。 她就那樣靜靜地躺著,像睡著了一般兴使。 火紅的嫁衣襯著肌膚如雪系宜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天鲫惶,我揣著相機與錄音蜈首,去河邊找鬼。 笑死欠母,一個胖子當著我的面吹牛欢策,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赏淌,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼踩寇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了六水?” 一聲冷哼從身側響起俺孙,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤辣卒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睛榄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荣茫,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年场靴,在試婚紗的時候發(fā)現(xiàn)自己被綠了啡莉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡旨剥,死狀恐怖咧欣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轨帜,我是刑警寧澤魄咕,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蚌父,受9級特大地震影響哮兰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜梢什,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一奠蹬、第九天 我趴在偏房一處隱蔽的房頂上張望朝聋。 院中可真熱鬧嗡午,春花似錦、人聲如沸冀痕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽言蛇。三九已至僻他,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腊尚,已是汗流浹背吨拗。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婿斥,地道東北人劝篷。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像民宿,于是被迫代替她去往敵國和親娇妓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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