Инкапсуляции 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();


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

Kommentare werden nicht hinzugefügt

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden