/
am98pln
/
AndroidOpenGLESExample
Обзор
Документация
Войти
/
am98pln
/
AndroidOpenGLESExample
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Triangle/app/src/main/java/com/example/openglesdemo/Triangle.kt
116 строк
4 KB
Leonid Pakholkov
Fixed package's name and application's name for examples
12 янв 2026, 12:23
12 янв 2026, 12:23
d98e9af
Код
Авторство
О чём код?
package com.example.openglestriangle import android.opengl.GLES20 import java.nio.ByteBuffer import java.nio.ByteOrder import java.nio.FloatBuffer class Triangle { private var mProgram: Int companion object { // Количество координат на вершину const val COORDS_PER_VERTEX = 3 // Координаты вершин треугольника private val triangleCoords = floatArrayOf( // в порядке против часовой стрелки: 0.0f, 0.622008459f, 0.0f, // верх -0.5f, -0.311004243f, 0.0f, // левый нижний 0.5f, -0.311004243f, 0.0f // правый нижний ) // Цвета вершин в RGBA private val color = floatArrayOf(0.63671875f, 0.76953125f, 0.22265625f, 1.0f) private val vertexShaderCode = """ uniform mat4 uMVPMatrix; attribute vec4 vPosition; void main() { gl_Position = uMVPMatrix * vPosition; } """.trimIndent() private val fragmentShaderCode = """ precision mediump float; uniform vec4 vColor; void main() { gl_FragColor = vColor; } """.trimIndent() } private var vertexBuffer: FloatBuffer private var positionHandle: Int = 0 private var colorHandle: Int = 0 private var mvpMatrixHandle: Int = 0 private val vertexCount = triangleCoords.size / COORDS_PER_VERTEX private val vertexStride = COORDS_PER_VERTEX * 4 // 4 байта на float init { // Инициализируем буфер вершин val bb = ByteBuffer.allocateDirect(triangleCoords.size * 4) bb.order(ByteOrder.nativeOrder()) vertexBuffer = bb.asFloatBuffer() vertexBuffer.put(triangleCoords) vertexBuffer.position(0) // Компилируем шейдеры val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode) val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode) // Создаем программу OpenGL mProgram = GLES20.glCreateProgram() // Прикрепляем шейдеры GLES20.glAttachShader(mProgram, vertexShader) GLES20.glAttachShader(mProgram, fragmentShader) GLES20.glLinkProgram(mProgram) } private fun loadShader(type: Int, shaderCode: String): Int { val shader = GLES20.glCreateShader(type) GLES20.glShaderSource(shader, shaderCode) GLES20.glCompileShader(shader) return shader } fun draw(mvpMatrix: FloatArray) { // Используем программу GLES20.glUseProgram(mProgram) // Получаем хэндлы атрибутов positionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition") colorHandle = GLES20.glGetUniformLocation(mProgram, "vColor") mvpMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix") // Передаем матрицу преобразования GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mvpMatrix, 0) // Включаем массив вершин GLES20.glEnableVertexAttribArray(positionHandle) // Передаем координаты вершин GLES20.glVertexAttribPointer( positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer ) // Передаем цвет GLES20.glUniform4fv(colorHandle, 1, color, 0) // Рисуем треугольник GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount) // Отключаем массив вершин GLES20.glDisableVertexAttribArray(positionHandle) } }