Объекты буфера вершин/объекты массива вершин с шейдерами

У меня проблемы с выводом чего-либо на экран.

private void initVBO() {
    vao = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vao);

    float[] vertices = {
            -0.5f, 0.5f, 0f,
            0.5f, 0.5f, 0f,
            0.5f, -0.5f, 0f,
            -0.5f, -0.5f, 0f
    };
    FloatBuffer vertBuffer = BufferUtils.createFloatBuffer(vertices.length);
    vertBuffer.put(vertices);
    vertBuffer.flip();

    this.vboID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vboID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW);
    positionAttribute = GL20.glGetAttribLocation(getMaterial().getShader()
            .getProgram(), "position");
    GL20.glEnableVertexAttribArray(positionAttribute);
    GL20.glVertexAttribPointer(positionAttribute, 3, GL11.GL_FLOAT, false, 0,
            0);

    Color c = getMaterial().getColor();
    float[] colors = {
        c.red, c.green, c.blue, c.alpha,
        c.red, c.green, c.blue, c.alpha,
        c.red, c.green, c.blue, c.alpha,
    };
    FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length);
    colorBuffer.put(colors);
    colorBuffer.flip();

    this.vbocID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbocID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW);
    colorAttribute = GL20.glGetAttribLocation(getMaterial().getShader().getProgram
            (), "color");
    GL20.glEnableVertexAttribArray(colorAttribute);
    GL20.glVertexAttribPointer(colorAttribute, 4, GL11.GL_FLOAT, false, 0, 0);

    byte[] indices = {
            0, 1, 2,
            2, 3, 0
    };
    ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indices.length);
    indicesBuffer.put(indices);
    indicesBuffer.flip();

    this.vboiID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer,
            GL15.GL_STATIC_DRAW);

    GL30.glBindVertexArray(0);

    GL20.glDisableVertexAttribArray(positionAttribute);
    GL20.glDisableVertexAttribArray(colorAttribute);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}

public void render() {
    GL20.glUseProgram(getMaterial().getShader().getProgram());

    GL30.glBindVertexArray(this.vao);
    GL20.glEnableVertexAttribArray(positionAttribute);
    GL20.glEnableVertexAttribArray(colorAttribute);

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);

    GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_BYTE, 0);

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL20.glDisableVertexAttribArray(colorAttribute);
    GL20.glDisableVertexAttribArray(positionAttribute);
    GL30.glBindVertexArray(0);
    GL20.glUseProgram(0);
}

Шейдеры компилируются правильно, и я правильно привязываю атрибуты для положения и цвета. Я просто использую glOrtho, и он настроен правильно, потому что рисование в непосредственном режиме работает просто отлично. Я не уверен, может ли проблема быть связана с созданием индексов или с проблемой внутри glVertexAttribPointer. Я просто пытаюсь получить цветной прямоугольник, нарисованный на экране.

Обновление: вершинный шейдер:

#version 150

in vec3 position;
in vec4 color;

out vec4 passColor;

void main(void) {
  gl_Position = vec4(position, 1.0);
  passColor = color;
}

Фрагментный шейдер:

#version 150

in vec4 passColor;

out vec4 outColor;

void main(void) {
  outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

Я также обновил код инициализации и рендеринга выше. Также вот код загрузки шейдеров:

private void load(File vertex, File fragment) {
        this.vertexID = FileUtility.loadShader(vertex, GL20.GL_VERTEX_SHADER);
        this.fragmentID = FileUtility.loadShader(fragment, GL20.GL_FRAGMENT_SHADER);

        programID = GL20.glCreateProgram();
        GL20.glAttachShader(programID, vertexID);
        GL20.glAttachShader(programID, fragmentID);

        GL20.glBindAttribLocation(programID, 0, "position");
        GL20.glBindAttribLocation(programID, 1, "color");

        GL30.glBindFragDataLocation(programID, 0, "outColor");

        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);

        int status = GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS);
        if (status != GL11.GL_TRUE) {
            Log.print(LogLevel.Error, GL20.glGetProgramInfoLog(programID));
        }
    }

person Greymouth    schedule 27.02.2017    source источник
comment
Как ваша проекционная матрица устанавливается в вершинном шейдере? glOrtho не будет этого делать, если вы не используете #version 110 и ftransform или gl_ProjectionMatrix и т. д.   -  person Robert Rouhani    schedule 27.02.2017
comment
Я создаю орфографическую матрицу через GL11.glViewport(0, 0, Configuration.getInstance().getWindowWidth(), Configuration.getInstance().getWindowHeight()); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity();i GL11.glOrtho(-1, 1, 1, -1, 1, -1); GL11.glMatrixMode(GL11.GL_MODELVIEW); Я не устанавливаю матрицу проекции в шейдерах; Я только устанавливаю цвет вершин.   -  person Greymouth    schedule 27.02.2017
comment
Как именно вы планируете использовать in/out в нерасширенных #version 120 шейдерах?   -  person genpfault    schedule 27.02.2017
comment
Я пытался использовать #version 150, но это не дало никаких результатов. я обновил код   -  person Greymouth    schedule 27.02.2017


Ответы (1)


Здесь есть много проблем, главная из которых заключается в том, что ваш VBO на самом деле не связан.

Вы создаете, привязываете и тут же отвязываете свой VAO. Поэтому удалите вызов glBindVertexArray(0) или переместите его в конец initVBO. Также не отвязывайте свои VBO до тех пор, пока не отвяжете свой VAO, иначе ваш VAO не будет привязан к VBO.

Вы не опубликовали свои шейдеры, но используете VAO, что означает, что у вас есть доступ как минимум к GLSL 1.30. glOrtho с шейдерами поддерживалась недолго, в GLSL 1.20 она устарела и была удалена из основного профиля. Я настоятельно рекомендую как можно скорее отказаться от стека матриц с фиксированной функцией. LWJGL имеет свои собственные матричные классы, переключение должно быть очень простым.

За исключением любых других проблем в вашем шейдере, первое, что должно появиться на экране

person Robert Rouhani    schedule 27.02.2017
comment
GL30.glBindVertexArray(0); GL20.glDisableVertexAttribArray(positionAttribute); GL20.glDisableVertexAttribArray(colorAttribute); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); Итак, я переместил все это вниз в этом порядке, но все равно ничего не рисую. - person Greymouth; 27.02.2017
comment
Можете ли вы обновить свой вопрос с вашими шейдерами? Также отключите отбраковку обратной стороны, если она еще не отключена, просто чтобы убедиться, что ваше лицо не отбрасывается. - person Robert Rouhani; 27.02.2017
comment
glOrtho никак не влияет на ваш шейдер. Вы устанавливаете свои вершины непосредственно в NDC в вершинном шейдере, не касаясь матричного стека с фиксированной функцией или применяя какие-либо преобразования. Вы должны увидеть квадрат цвета вашего материала в нижнем левом квадранте окна просмотра. Если нет, отключите отбраковку обратной стороны и установите постоянный цвет во фрагментном шейдере только для целей тестирования. - person Robert Rouhani; 01.03.2017
comment
Отбор отключен, а во фрагментном шейдере я использую постоянный цвет, он не работает. - person Greymouth; 01.03.2017