Я просто хочу сделать простую штриховку по Гуро с разными цветами на моих объектах. В основном моя проблема в том, что я не могу ввести значения цвета в шейдеры, он просто отображает черный цвет. Если я определяю вектор в шейдере как цвет для всего объекта, он работает нормально.

Основная программа:

protected void initOpenGL() {
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    startTime = Sys.getTime();

    m = new Matrix4f();
    m.m00 = 1;
    m.m11 = 1;
    m.m22 = -(101.0f / 99);
    m.m32 = -(200.0f / 99);
    m.m23 = -1;
    m.m33 = 0;

    makeCube();

    sp = new ShaderProgram("gouraud");
    glBindAttribLocation(sp.getId(), 0, "corners");
    glBindAttribLocation(sp.getId(), 1, "colors");

}

@Override
protected void render() {

    gamma = gamma + 1;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    Matrix4f newMat = new Matrix4f(m);
    Matrix4f.translate(new Vector3f(0, 0, -5), newMat, newMat);
    newMat.rotate(gamma/100, new Vector3f(0, 1, 0));
    newMat.rotate(gamma/200, new Vector3f(1, 0, 0));

    FloatBuffer fb = BufferUtils.createFloatBuffer(16);
    newMat.store(fb);
    fb.flip();
    GL20.glUniformMatrix4(GL20.glGetUniformLocation(sp.getId(), "matrix"),
            false, fb);

    GL20.glUseProgram(sp.getId());


    glBindVertexArray(vaoId);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_QUADS, 0, corners.length/3);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);
    glBindVertexArray(0);

}

private void makeCube(){
    corners = new float[] {
            // cube
            // front
            -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,
            // left
            -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1,
            // bottom
            -1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1,
            // right
            1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1,
            // top
            -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, -1,
            // back
            -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,

    };

    FloatBuffer eckenBuffer = BufferUtils.createFloatBuffer(corners.length);
    eckenBuffer.put(corners);
    eckenBuffer.flip();

    vaoId = glGenVertexArrays();
    glBindVertexArray(vaoId);
    int vboId = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboId);
    glBufferData(GL_ARRAY_BUFFER, eckenBuffer, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);


    colors = new float[] {
            // front
            1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,

            // right
            1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

            // back
            1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,

            // left
            0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

            // top
            0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,

            // bottom
            1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f };

    FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length);
    colorBuffer.put(colors);
    colorBuffer.flip();

    int vboIdB = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboIdB);
    glBufferData(GL_ARRAY_BUFFER, colorBuffer, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

Shader :

Темя

#version 150
in vec4 corners;
in vec4 colors;

vec4 colorTest = vec4(1.0,0.0,0.0,1.0);

out vec4 colorToFrag;

uniform mat4 matrix;

void main(void) {
colorToFrag = colors ;
gl_Position = matrix * corners;

}

Фрагмент

#version 150
in vec4 colorToFrag;

out vec4 colorOut;

void main(void) {
colorOut = colorToFrag;
}
0
user2922706 23 Янв 2014 в 14:26
Не включайте / отключайте массивы attrib до и после рисования с использованием VAO. На самом деле в этом весь смысл VAO. Первоначально, когда вы создаете VAO, он запускается со всеми отключенными массивами, вы можете включить те, которые вам нужны, при создании VAO. Затем все, что вам нужно сделать, это изменить привязанный VAO непосредственно перед рисованием. Набор включенных массивов напрямую привязан к тому, что VAO привязано при рисовании. Это не решит вашу проблему, но вам следует об этом знать.
 – 
Andon M. Coleman
23 Янв 2014 в 22:44
Кроме того, вы слишком рано звоните GL20.glUniformMatrix4(GL20.glGetUniformLocation(sp.getId(), "matrix"),. Это нужно сделать после звонка glUseProgram (...). И glGetUniformLocation (...) не то, что вы должны делать каждый кадр, вычислять этот индекс после связывания вашей программы и затем сохранять значение в вашем классе, потому что поиск единообразного местоположения по имени крайне неэффективен - они не меняются.
 – 
Andon M. Coleman
23 Янв 2014 в 22:49

1 ответ

Лучший ответ

Вы не разместили код для компиляции / связывания шейдера, но поскольку вы вызываете glBindAttribLocation, но не вызываете glLinkProgram в остальной части кода, я делаю обоснованное предположение, что связывание происходит только в конструкторе ShaderProgram.

Вызовы glBindAttribLocation будут влиять только на любые операции связывания, которые идут после него (очевидно). Таким образом, ваши привязки к местоположению вообще не эффективны - их назначает GL.

Теперь, если вы не используете атрибут colors в шейдере, он будет оптимизирован, и атрибут не будет активен - поэтому он вообще не получит местоположения, а corners, вероятно, получит index 0, как и следовало ожидать. Обратите внимание, что GL не требуется для присвоения местоположений атрибутов последовательно, начиная с нуля, но в большинстве случаев это необходимо. Если вы действительно используете «цвета», он может оказаться в позиции 0, что полностью нарушит ваш рендеринг.

В качестве еще одного примечания: на nvidia я заметил, что местоположения атрибутов, назначенные GL, похоже, на самом деле лексикографически упорядочены по именам переменных в шейдере, поэтому «цвета» будут стоять перед «углами». Я не уверен, было ли это просто совпадением или как другие реализации справляются с этим.

1
derhass 23 Янв 2014 в 23:17