OpenGL ES->GLSurfaceView进行点、线段、三角形等基本图元的绘制

GLSurfaceView代码见OpenGL ES->顶点着色器和片段着色器代码,只修改顶点数组,片段着色器的颜色,和绘制方式进行不同图元绘制

绘制点

  • GL_POINTS方式
kotlin 复制代码
// 顶点数据
val vertices = floatArrayOf(
    0.8f, -0.8f, 0.0f,
    -0.8f, -0.8f, 0.0f,
    0.0f, 0.8f, 0.0f,
)

// 顶点着色器代码
val vertexShaderCode = """#version 300 es
                        layout (location = 0) in vec4 aPosition;
                        
                        void main() {
                          gl_Position = aPosition;
                          
                        }""".trimIndent()
                        
// 片段着色器代码
val fragmentShaderCode = """#version 300 es
        precision mediump float;
        uniform vec4 vColor;
        out vec4 fragColor;
        
        void main() {
          fragColor = vColor;
        }""".trimIndent()

// 获得顶点数据
val positionHandle = GLES30.glGetAttribLocation(program, "aPosition")
GLES30.glEnableVertexAttribArray(positionHandle)
GLES30.glVertexAttribPointer(positionHandle, 3, GLES30.GL_FLOAT, false, 0, 0)

// 设置片段着色器的颜色
val colorHandle = GLES30.glGetUniformLocation(program, "vColor")
GLES30.glUniform4f(colorHandle, 1.0f,0.5f,0.5f,1.0f)
// 绘制
GLES30.glDrawArrays(GL_POINTS, 0, 3)

// 禁用顶点数据
GLES30.glDisableVertexAttribArray(positionHandle)

绘制线段

  • GL_LINES方式
kotlin 复制代码
// 顶点数据
val 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,
)

// 顶点着色器代码
val vertexShaderCode = """#version 300 es
                        layout (location = 0) in vec4 aPosition;
                        
                        void main() {
                          gl_Position = aPosition;
                          
                        }""".trimIndent()
                        
// 片段着色器代码
val fragmentShaderCode = """#version 300 es
        precision mediump float;
        uniform vec4 vColor;
        out vec4 fragColor;
        
        void main() {
          fragColor = vColor;
        }""".trimIndent()

// 获得顶点数据
val positionHandle = GLES30.glGetAttribLocation(program, "aPosition")
GLES30.glEnableVertexAttribArray(positionHandle)
GLES30.glVertexAttribPointer(positionHandle, 3, GLES30.GL_FLOAT, false, 0, 0)

// 设置片段着色器的颜色
val colorHandle = GLES30.glGetUniformLocation(program, "vColor")
GLES30.glUniform4f(colorHandle, 1.0f,0.5f,0.5f,1.0f)
GLES30.glLineWidth(20f) // 设置线条宽度,否则看不到线条
// 绘制
GLES30.glDrawArrays(GL_LINES, 0, 4)

// 禁用顶点数据
GLES30.glDisableVertexAttribArray(positionHandle)
  • GL_LINE_STRIP方式
kotlin 复制代码
// 顶点数据
val 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,
)

// 顶点着色器代码
val vertexShaderCode = """#version 300 es
                        layout (location = 0) in vec4 aPosition;
                        
                        void main() {
                          gl_Position = aPosition;
                          
                        }""".trimIndent()
                        
// 片段着色器代码
val fragmentShaderCode = """#version 300 es
        precision mediump float;
        uniform vec4 vColor;
        out vec4 fragColor;
        
        void main() {
          fragColor = vColor;
        }""".trimIndent()

// 获得顶点数据
val positionHandle = GLES30.glGetAttribLocation(program, "aPosition")
GLES30.glEnableVertexAttribArray(positionHandle)
GLES30.glVertexAttribPointer(positionHandle, 3, GLES30.GL_FLOAT, false, 0, 0)

// 设置片段着色器的颜色
val colorHandle = GLES30.glGetUniformLocation(program, "vColor")
GLES30.glUniform4f(colorHandle, 1.0f,0.5f,0.5f,1.0f)
GLES30.glLineWidth(20f) // 设置线条宽度,否则看不到线条
// 绘制
GLES30.glDrawArrays(GL_LINE_STRIP, 0, 4)

// 禁用顶点数据
GLES30.glDisableVertexAttribArray(positionHandle)
  • GL_LINE_LOOP方式
kotlin 复制代码
// 顶点数据
val 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,
)

// 顶点着色器代码
val vertexShaderCode = """#version 300 es
                        layout (location = 0) in vec4 aPosition;
                        
                        void main() {
                          gl_Position = aPosition;
                          
                        }""".trimIndent()
                        
// 片段着色器代码
val fragmentShaderCode = """#version 300 es
        precision mediump float;
        uniform vec4 vColor;
        out vec4 fragColor;
        
        void main() {
          fragColor = vColor;
        }""".trimIndent()

// 获得顶点数据
val positionHandle = GLES30.glGetAttribLocation(program, "aPosition")
GLES30.glEnableVertexAttribArray(positionHandle)
GLES30.glVertexAttribPointer(positionHandle, 3, GLES30.GL_FLOAT, false, 0, 0)

// 设置片段着色器的颜色
val colorHandle = GLES30.glGetUniformLocation(program, "vColor")
GLES30.glUniform4f(colorHandle, 1.0f,0.5f,0.5f,1.0f)
GLES30.glLineWidth(20f) // 设置线条宽度,否则看不到线条
// 绘制
GLES30.glDrawArrays(GL_LINE_LOOP, 0, 4)

// 禁用顶点数据
GLES30.glDisableVertexAttribArray(positionHandle)

绘制三角形

  • GL_TRIANGLES方式
kotlin 复制代码
// 顶点数据
val vertices = floatArrayOf(
      0.5f, 0f, 0.0f,
      0f, 0.5f, 0.0f,
     -0.5f, 0f, 0.0f,

     -0.6f, 0f, 0.0f,
     0f, -0.6f, 0.0f,
     0.6f, 0f, 0.0f,
)

// 顶点着色器代码
val vertexShaderCode = """#version 300 es
                        layout (location = 0) in vec4 aPosition;
                        
                        void main() {
                          gl_Position = aPosition;
                          
                        }""".trimIndent()
                        
// 片段着色器代码
val fragmentShaderCode = """#version 300 es
        precision mediump float;
        uniform vec4 vColor;
        out vec4 fragColor;
        
        void main() {
          fragColor = vColor;
        }""".trimIndent()

// 获得顶点数据
val positionHandle = GLES30.glGetAttribLocation(program, "aPosition")
GLES30.glEnableVertexAttribArray(positionHandle)
GLES30.glVertexAttribPointer(positionHandle, 3, GLES30.GL_FLOAT, false, 0, 0)

// 设置片段着色器的颜色
val colorHandle = GLES30.glGetUniformLocation(program, "vColor")
GLES30.glUniform4f(colorHandle, 1.0f,0.5f,0.5f,1.0f)
GLES30.glLineWidth(20f) // 设置线条宽度,否则看不到线条
// 绘制
GLES30.glDrawArrays(GL_TRIANGLES, 0, 6)

// 禁用顶点数据
GLES30.glDisableVertexAttribArray(positionHandle)
相关推荐
日光明媚2 小时前
一步生成视频!One-Forcing:DMD + 零成本 GAN,训练 200 步超越多步 SOTA
android·开发语言·kotlin
帅次3 小时前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
大鹏说大话3 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
plainGeekDev4 小时前
Android运行时面试题:ART和JVM的区别都搞不清,别写精通了
jvm·面试·kotlin
搜狐技术产品小编20236 小时前
破局与重构:纯端侧 Android 自动化引擎的尝试与未来推演
android·运维·重构·自动化
码云骑士7 小时前
Android SystemServer启动过程
android·systemserver
weiggle8 小时前
第三篇:可组合函数(Composable)——Compose 的基石
android·前端
独隅9 小时前
Android Studio 接入多种不同 AI 大模型进行开发的全面详细指南(Android Studio+AI)
android·人工智能·android studio
夜微凉49 小时前
三、MySQL
android·数据库·mysql
我命由我123459 小时前
Android 开发问题:项目同时引入了两个包含相同类文件的库(AndroidX 库、旧版本支持库),导致了重复类错误
android·java·java-ee·android studio·android-studio·androidx·android runtime