OpenGL: ограничение изменений только для объекта - PullRequest
1 голос
/ 14 декабря 2011

Я делаю основную игру в openGL с GLUT, и я наткнулся на небольшую заминку.

Когда я пытаюсь нарисовать объект из класса в своем мире, он дает всему оттенок цвета, который был в последний раз создан с помощью функции makeMaterial (см. Ниже).

Кто-нибудь знает, как я могу ограничить применение этих изменений только к объекту? Я пробовал push / pop, но, похоже, это ничего не ограничивает. Кроме того, если последний нарисованный цвет - черный, я вообще ничего не вижу, кроме моего снеговика.

Вот соответствующий код:

makeMaterial: -

makeMaterial( float r,float g,float b,float a,float s )  
{   
    float color[4];  
    float white[4]; 
    GLfloat surfshine[1] ; 
    surfshine[0]=s*128.0 ; 
    color[0]=r;color[1]=g;color[2]=b;color[3]=a;  
    white[0]=0.5;white[1]=0.5;white[2]=0.5;white[3]=1.0;   
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,color);  
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,color);  
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,white); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,surfshine); 
} 

makeMaterial используется: -

makeMaterial(0.05f,0.05f,0.05f,1.00f, 0.4f);
glPushMatrix(); 
glutSolidCube(10.0); 
glPopMatrix(); 

моя функция рисования: -

void drawToScene(void) {    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity();   
    uniformFPS.setStartTime(glutGet(GLUT_ELAPSED_TIME));

    camera.updateCamera();
    lvl1.drawLevel();
    enemy.drawSnowman(350.0f,6.0f, 200.0f);
    crosshair.show();

    glutSwapBuffers();      
    uniformFPS.enforceChecks();
}

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Если вы действительно хотите убедиться, что вы ограничиваете изменения в определенном разделе, вы должны иметь возможность использовать glPushAttrib(GL_LIGHTING_BIT) до того, как вы сделаете ваш makeMaterial вызов, и glPopAttrib после того, как вы нарисовали объект. Ссылка для glPushAttrib здесь показывает, какие свойства передаются каждым из возможных битов, которые вы можете предоставить. Однако я не знаю, что это особенно уважаемый способ справиться с вашим состоянием.

Более общим решением было бы сделать вызов makeMaterial с соответствующими значениями перед каждым набором команд рисования, т. Е. При условии, что у вас есть только один материал для вашего снеговика и один материал для вашего мира:

//...
makeMaterial(1.0f,1.0f,1.0f,1.0f,1.0f);
lvl1.drawLevel();
makeMaterial(0.5f,0.5f,0.5f,0.5f,0.5f);
enemy.drawSnowman(350.0f,6.0f,200.0f);
//...
1 голос
/ 14 декабря 2011

OpenGL ведет себя как конечный автомат, когда речь заходит о таких свойствах, как текущий цвет, текущие свойства материала, текущая ширина линии и т. Д. Предоставленные значения сохраняются, если они не изменяются при вызовах explicity методов setter.

Правильный способ решения вашей проблемы - иметь все такие свойства, быть свойствами нарисованного объекта и вызывать соответствующие методы перед рендерингом объектов.

...