OpenGL: материалы со списками отображения? - PullRequest
2 голосов
/ 25 сентября 2010

Я использую JOGL с OpenGL.Я рисую все через списки отображения.Я пытаюсь выяснить, как указать материалы.

Я искал эту документацию .Следующее выглядит довольно просто:

glPushMatrix();
    glTranslatef (-1.25, 3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    auxSolidSphere();
glPopMatrix();

Как это сделать со списками отображения?Без них мое приложение работает слишком медленно.

Ответы [ 2 ]

1 голос
/ 13 июля 2012

Поместите вызовы glMaterial в свой список отображения.

int displayList = glGenLists(1);
glNewList(displayList, GL_COMPILE);
FloatBuffer ambient = BufferUtils.createFloatBuffer(4);
ambient.put(1.0f); // red
ambient.put(0.0f); // green
ambient.put(0.5f); // blue
ambient.put(1.0f); // alpha
ambient.flip(); // now OpenGL can read the buffer
glMaterial(GL_FRONT, GL_AMBIENT, ambient);
// put other material properties here
// put glVertex/glColor calls here
glEndList();
0 голосов
/ 25 сентября 2010

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

Что касается работы со списком отображения, то это довольно просто.Вы в основном просто рисуете в список отображения, затем, когда вы хотите отобразить что-то, вы говорите, чтобы воспроизвести список отображения с glCallList.Есть некоторые операции, которые вы не можете поместить в список отображения, но, по крайней мере, если память служит (хотя это может и не произойти - я давно не использовал списки), вы можете просто поместить glMaterialfv в список отображения.

...