Инкапсуляции QGLShaderProgram и QGLBuffer [Qt, GL]

 
+4
 
C++
ava
Jeka178RUS | 24.01.2013, 14: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();


Насколько такое решение адекватно?
Ответы (0)

Комментарии не добавлены

Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить