Могу ли я использовать фиксированный glEnable (GL_LIGHTING) вместе с фрагментными / вершинными шейдерами? - PullRequest
2 голосов
/ 26 июля 2011

Я просмотрел много онлайн-статей, и добавление освещения кажется очень простым, но я не могу получить результат.Я использую OpenGL 3.0 и использую вершинные и фрагментные шейдеры для моей модели анимации.Кстати, я новичок в OpenGL.

Не обращая внимания на освещение У меня все отлично работает с 3D-символом, бегающим по среде.

    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    *snip*

    glEnable(GL_LIGHTING);
    glEnable (GL_LIGHT0);

    float ambientLight0[] = { 0.2f, 0.2f, 0.2f, 1.0f };
    float diffuseLight0[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    float specularLight0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
    float position0[] = { -2.5f, 1.0f, -1.0f, 1.0f };   
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0);
    glLightfv(GL_LIGHT0, GL_POSITION, position0);

    //glEnable(GL_COLOR_MATERIAL);
    //float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    //glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor);

    m_Beast.onRender();

Вот как выглядит m_Beast.onRender ()

    glPushMatrix();

    Vector3 pos = getPosition();
    glTranslatef(pos.x, pos.y, pos.z);

    glBindTexture(GL_TEXTURE_2D, m_beastTextureID);

    static float modelviewMatrix[16];
    static float projectionMatrix[16];

    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix);
    glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix);

    m_shaderProgram->bindShader();
    m_shaderProgram->sendUniform4x4("modelview_matrix", modelviewMatrix);
    m_shaderProgram->sendUniform4x4("projection_matrix", projectionMatrix);
    m_shaderProgram->sendUniformTexture("texture0", 0);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, m_interpolatedFrame.vertices.size());

    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

    glPopMatrix();

Мне просто нужен быстрый способ получить направленное освещение на моей модели.Мне действительно не интересно писать шейдер освещения на данный момент.

1 Ответ

5 голосов
/ 26 июля 2011

Как только вы используете вершинные шейдеры, вы должны сами выполнить расчеты освещения. В старом OpenGL можно было использовать вершинный конвейер с фиксированной функцией и программировать только этап фрагмента. Но с OpenGL-3 и более поздними версиями вы должны делать все это.

Однако вы не должны чувствовать себя слишком плохо по этому поводу. В конце вы напишете меньше, потому что огромное количество вызовов функций, необходимых для настройки фиксированной функции, можно заменить гораздо более коротким и лаконичным кодом шейдера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...