Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Инкапсуляции QGLShaderProgram и QGLBuffer [Qt, GL]


Автор: Jeka178RUS 24.1.2013, 13:19
Добрый день! Ни как не могу разобраться c логикой использования QGLShaderProgram и QGLBuffer.

Ситуация класс CModel инкапсулирует QGLBuffer в котором хранит вершины. Для рисования данных используется функция 
Код

       glClear( GL_COLOR_BUFFER_BIT );

    mShader.bind();
    
    mModel.bindBuffer();
    mShader.setAttributeBuffer( "verts", GL_FLOAT, 0, 2 );
    mShader.enableAttributeArray( "verts" );
    glDrawArraysInstanced( GL_TRIANGLE_FAN, 0, 9, mInstanceCount );
    mShader.disableAttributeArray( "verts" );
    mModel.releaseBuffer();
    mShader.release();


Возникает противоречие: для mShader.setAttributeBuffer( ... ) необходимо знать параметры буфера, которые логично спрятаны в CModel. glDrawArraysInstanced( .. ) должен знать размер буфера (9), и порядок расположения вершин(GL_TRIANGLE_FAN). Возникает желание спрятать все в метод CModel::draw( ... ), но в таком случае этот метод должен знать имя атрибута( или его location ) в шейдере, что опять не совсем логично.

Подскажите как лучше выйти из этого положения?

Я придумал такое решение:
Код

void CCircle::draw( GLuint AttribLocation )
{
    mVertsBuffer.bind(); // QGLBuffer
    glVertexAttribPointer( AttribLocation, 2, GL_FLOAT, GL_FALSE, 0, 0  );
    glEnableVertexAttribArray( AttribLocation  );
    glDrawArrays( GL_TRIANGLE_FAN, 0, mVerts.size() ); // mVerts - vector с вершинами
    glDisableVertexAttribArray( AttribLocation );
}


Вызов такой:
Код

       glClear( GL_COLOR_BUFFER_BIT );

    mShader.bind();
    mModel.draw( mShader.attributeLocation( "verts" ) );
    mShader.release();


Насколько такое решение адекватно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)