GLES 3.0 Android Студия

Я полностью облажался, написав простое приложение GLES 3.0, которое рисует треугольник в Android Studio. Хотя у меня довольно большой опыт программирования обычного современного OpenGl на C++, я не могу понять, почему мой код не работает. В большинстве руководств по GLES не используются такие вещи, как VertexArrayObjects или Buffers. Вот почему очень сложно найти примеры или исходные коды в Интернете. Пожалуйста помоги!!!

public class Triangle {
private int m_program;
private int[] m_vao = new int[1];
private int[] m_vbo = new int[1];
private float[] m_vertices = {
        -0.5f, -0.5f, 0.0f,
        0.0f, 0.5f, 0.0f,
        0.5f, -0.5f, 0.0f
};

private final String vertexShaderCode =
        "#version 300 es    \n" +
        "layout(location = 0) in vec3 position; \n" +
        "void main(){   \n" +
        "   gl_Position = vec4(position, 1.0);  \n" +
        "}  ";

private final String fragmentShaderCode =
        "#version 300 es    \n" +
        "precision mediump float; \n" +
        "out vec4 color;    \n" +
        "void main(){   \n" +
        "   color = vec4(1.0,0.0,0.0,1.0);  \n" +
        "}  ";

public Triangle()
{
    System.out.println("Triangle Created\n");
    m_program = CreateProgram(loadShader(GLES30.GL_VERTEX_SHADER,vertexShaderCode),loadShader(GLES30.GL_FRAGMENT_SHADER,fragmentShaderCode));

    ByteBuffer bb = ByteBuffer.allocateDirect(m_vertices.length * 4);
    bb.order(ByteOrder.nativeOrder());
    FloatBuffer vertexBuffer = bb.asFloatBuffer();
    vertexBuffer.put(m_vertices);
    vertexBuffer.position(0);

    GLES30.glGenVertexArrays(1,m_vao,0);
    GLES30.glBindVertexArray(m_vao[0]);
    GLES30.glGenBuffers(1,m_vbo,0);
    GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER,m_vbo[0]);
    GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER,m_vertices.length * 4, vertexBuffer,GLES30.GL_STATIC_DRAW);
    GLES30.glEnableVertexAttribArray(0);
    GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, m_vertices.length * 4, 0);
    GLES30.glBindVertexArray(0);

    System.out.println(m_vbo[0]);
}

public void Draw()
{
    GLES30.glUseProgram(m_program);
    GLES30.glBindVertexArray(m_vao[0]);
    GLES30.glDrawArrays(GLES30.GL_TRIANGLES,0,3);
    GLES30.glBindVertexArray(0);
}

private int loadShader(int type, String shaderCode)
{
    int shader = GLES30.glCreateShader(type);
    GLES30.glShaderSource(shader,shaderCode);
    GLES30.glCompileShader(shader);
    System.out.println(GLES30.glGetShaderInfoLog(shader));

    return shader;
}

private int CreateProgram(int vertexShader, int fragmentShader)
{
    int id;
    id = GLES30.glCreateProgram();
    GLES30.glAttachShader(id,vertexShader);
    GLES30.glAttachShader(id,fragmentShader);
    GLES30.glLinkProgram(id);
    System.out.println(GLES30.glGetProgramInfoLog(id));
    GLES30.glDeleteShader(vertexShader);
    GLES30.glDeleteShader(fragmentShader);

    return id;
}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
303
1

Ответы 1

Предпоследний аргумент метода glVertexAttribPointer - шаг. Шаг определяет расстояние в байтах между началом двух последовательных атрибутов вершины. В вашем случае каждая вершина начинается на 3 числа с плавающей запятой после предыдущей, поэтому шаг должен быть 3 * 4 (3 числа с плавающей запятой по 4 байта). Правильный код может выглядеть так:

GLES30.glEnableVertexAttribArray(0);
GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 3 * 4, 0);

Обратите внимание, что, поскольку данные плотно упакованы, вы также можете передать 0 в качестве шага.

Другие вопросы по теме