OpenGL 彩色三角形

之前的都是單色的三角形禁筏,這次來點不一樣的味道滥朱,給每個頂點設(shè)置不同的顏色鞍历。

這里有三個步驟

1.定義頂點著色器
2.定義片段著色器
3.定義頂點和顏色數(shù)組乌询,設(shè)置數(shù)組指針

頂點著色器

#version 300 es
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
void main() {
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
    ourColor=aColor;
}

顏色不一樣 所以顏色要外面?zhèn)鬟M來呀打,要多加一個顏色變量

顏色著色器

#version 300 es
precision mediump float;
out vec4 FragColor;
in vec3 ourColor;
void main()
{
    FragColor = vec4(ourColor, 1.0f);
}

定義頂點和顏色數(shù)組矢赁,設(shè)置數(shù)組指針

private var vertices = floatArrayOf(
        // 位置              // 顏色
        0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,   // 右下
        -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,   // 左下
        0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f    // 頂部
    )
//設(shè)置頂點數(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之間额获。我們把它設(shè)置為GL_FALSE
            false,
            //步長,它告訴我們在連續(xù)的頂點屬性組之間的間隔 也就是繪制一個頂點要多少數(shù)據(jù) 字節(jié)單位
            6 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 這里頂點從0開始
            0
        )
        GLES30.glEnableVertexAttribArray(0)


        //設(shè)置頂點數(shù)組指針
        GLES30.glVertexAttribPointer(
            //shader中 layout(location = 0)的值
            1,
            //頂點屬性的大小恭应。頂點屬性是一個vec3抄邀,它由3個值組成,所以大小是3
            3,
            //數(shù)據(jù)的類型
            GLES30.GL_FLOAT,
            //GL_TRUE昼榛,數(shù)據(jù)被標準化境肾,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間。我們把它設(shè)置為GL_FALSE
            false,
            //步長胆屿,它告訴我們在連續(xù)的頂點屬性組之間的間隔 也就是繪制一個頂點要多少數(shù)據(jù) 字節(jié)單位
            6 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 前面有頂點 所以這里要偏移定點數(shù)據(jù) 三個定點*每個頂點的大小
            3 * DataUtil.sizeof(GLES30.GL_FLOAT)
        )
        //激活第二個(location=1)不然顏色不會顯示
        GLES30.glEnableVertexAttribArray(1)

上面就是主要步驟

screenshot-1550633596586.jpg

三星形有了奥喻,改下四邊形也是可以的


screenshot-1550634015852.jpg

代碼

package com.weihu.video.opengl.draw

import android.opengl.GLES30
import android.opengl.GLSurfaceView
import com.weihu.video.MyApp
import com.weihu.video.opengl.DataUtil
import com.weihu.video.opengl.Shader
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

/**
 * created by hupihuai on 2019/2/20
 */
class ColorRectangleRender : 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, 1.0f, 0.0f, 0.0f, // 右上角
        0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下角
        -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // 左下角
        -0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.5f  // 左上角
    )

    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)
        //復(fù)制數(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è)置頂點數(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之間。我們把它設(shè)置為GL_FALSE
            false,
            //步長酒朵,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
            6 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 這里只有頂點 位置數(shù)據(jù)在數(shù)組的開頭桦锄,所以這里是0
            0
        )
        GLES30.glEnableVertexAttribArray(0)

        //設(shè)置顏色數(shù)組指針
        GLES30.glVertexAttribPointer(
            //shader中 layout(location = 0)的值
            1,
            //頂點屬性的大小。頂點屬性是一個vec3蔫耽,它由3個值組成结耀,所以大小是3
            3,
            //數(shù)據(jù)的類型
            GLES30.GL_FLOAT,
            //GL_TRUE,數(shù)據(jù)被標準化匙铡,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間图甜。我們把它設(shè)置為GL_FALSE
            false,
            //步長,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
            6 * DataUtil.sizeof(GLES30.GL_FLOAT),
            //數(shù)據(jù)偏移量 編譯前面
            3 * DataUtil.sizeof(GLES30.GL_FLOAT)
        )
        GLES30.glEnableVertexAttribArray(1)
        //vbo end

        //ebo start
        GLES30.glGenBuffers(1, ebo, 0)
        GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, ebo[0])
        val indexBuffer = DataUtil.createByteBuffer(indices)
        //復(fù)制數(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

        //vao end

        //shader
        esShader.loadProgramFromAsset(MyApp.context, "color_triangle_vert.glsl", "color_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
        )

    }
}

好了 不同頂點不同顏色就完成了

源代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(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
  • 正文 為了忘掉前任碾篡,我火速辦了婚禮,結(jié)果婚禮上筏餐,老公的妹妹穿的比我還像新娘开泽。我一直安慰自己,他們只是感情好魁瞪,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布穆律。 她就那樣靜靜地躺著惠呼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峦耘。 梳的紋絲不亂的頭發(fā)上剔蹋,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音辅髓,去河邊找鬼泣崩。 笑死,一個胖子當著我的面吹牛洛口,可吹牛的內(nèi)容都是我干的矫付。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼第焰,長吁一口氣:“原來是場噩夢啊……” “哼买优!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起樟遣,我...
    開封第一講書人閱讀 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級特大地震影響,放射性物質(zhì)發(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)容