2013-12-14 4 views
-1

상황 : OpenGL을 사용하여 조명 예제를 만들고 있습니다. 제 목표는 아래 그림과 같이 20 개의 무작위로 채색 된 구체, 입방체 및 3 개의 광원이 존재한다는 것입니다.OpenGL - GLmaterialfv 조명시 여러 객체의 문제

http://i.stack.imgur.com/b4uwu.png

문제점 : 내가 pushMatrix 및 Popmatrix을 제거 할 경우에만 위의 광원에 의해 영향을 볼 수 있지만, 큐브는이 세 가지 광원 (적색, 녹색, 청색)에 의해 원활하게 영향을받는 구체를 참조한다. 큐브의 색깔은 내가 깨달을 수없는 이유 때문에 변하고 있습니다. 이 입방체는 구체와 항상 흰색 인 3 가지 광원에 의해 영향을 받도록해야합니다.

코드 부분 :

이것은 유성의 묘사 방법입니다.

void meteor::draw(){ 

glPushMatrix(); 

    glTranslatef(posx,posy,posz); 
    glutSolidSphere(radious,40,20); 


    GLfloat MaterialColor[] = {red, green, blue, 1.0}; 
    GLfloat ambientColor[] = {red, green, blue, 1.0}; 

     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambientColor); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor); 



glPopMatrix(); 

} 

이것은 큐브의 그리기 방법입니다.

void Ship::draw(){ 
glPushMatrix(); 

    glTranslatef (posx, posy, 95.0); 
    glutSolidCube(5.0); 

     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, MaterialColor1); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor1); 

glPopMatrix(); 

}

그리고이 화면에 모든 개체를 그립니다 표시 방법 : 당신이 코드의 나머지 부분을보고 싶다면

void display (void) 
{ 
    GLfloat position0[] = { 8.0, -10.0, 100.0, 1.0}; //red 
    GLfloat position1[] = { -8.0, -10.0, 100.0, 1.0}; 
    GLfloat position2[] = { 0.0, 10.0, 100.0, 1.0}; 

    GLfloat LightColor[]= {1.0f,0.0f,0.0f};//red 
    GLfloat LightColor1[]= {0.0f,1.0f,0.0f};//green 
    GLfloat LightColor2[]= {0.0f,0.0f,1.0f};//blue 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 

    gluLookAt (0.0, 0.0, 500.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 


glPushMatrix(); 

      glLightfv (GL_LIGHT0, GL_POSITION, position0); 
      glLightfv (GL_LIGHT0, GL_DIFFUSE, LightColor); 



      glLightfv (GL_LIGHT1, GL_POSITION, position1); 
      glLightfv (GL_LIGHT1, GL_DIFFUSE, LightColor1); 


      glLightfv (GL_LIGHT2, GL_POSITION, position2); 
      glLightfv (GL_LIGHT2, GL_DIFFUSE, LightColor2); 


    //This is where the spheres are drawn 
      for(iter1 = objects.begin(); iter1 != objects.end(); ++iter1) 
         { 

          (*iter1)->draw(); 


         } 
//This is where the spheres are drawn 

       shipCan->draw(); 



glPopMatrix(); 

glPopMatrix(); 

glFlush(); 
} 

, 나는 그것을 제공 할 수 있습니다.

+0

답변을 찾았습니다. 나의 평판 때문에, 8 시간 후에 나는 내가 찾은 해결책을 쓸 수있을 것이다. –

+0

고정 함수 파이프 라인 조명을 사용하는 것이 꼭지점에서만 계산되기 때문에 입방체를 테셀 레이트해야한다는 것을 알았습니까? 현대식 OpenGL 프로그래밍을하는 법을 배우는 것이 좋습니다. 그것은 결국 훨씬 쉽습니다. 여기 훌륭한 튜토리얼이 있습니다. http://arcsynthesis.org/gltut – datenwolf

+0

@datenwolf 맞습니다. 해결책은 없지만 실수는 내 큐브뿐만 아니라 구체에도 똑같은 문제가있었습니다. 나는 현대 OpenGL을 의심 할 여지없이 배울 것이다. 이 링크는 매우 유용합니다. 매우 감사 :) –

답변

0

답변을 찾았습니다. 누구나 먼저 OpenGL 렌더링 파이프 라인을 이해해야합니다. OpenGL은 상태 시스템처럼 작동합니다. 예를 들어 화면에 sth를 그리기 전에 색상을 정의하면 해당 정보가 그래픽 카드로 전송됩니다. 그리고 모든 물체는이 색을 사용합니다. 다른 오브젝트를 그리기 전에이 색상을 변경하지 않으면 색상은 동일하게 유지됩니다.

하기 전에 : : 이제

void meteor::draw(){ 

glPushMatrix(); 

glTranslatef(posx,posy,posz); 
glutSolidSphere(radious,40,20); 


GLfloat MaterialColor[] = {red, green, blue, 1.0}; 
GLfloat ambientColor[] = {red, green, blue, 1.0}; 

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambientColor); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor); 



glPopMatrix(); 

} 

:

void meteor::draw(){ 

GLfloat MaterialColor[] = {red, green, blue, 1.0}; 
    GLfloat ambientColor[] = {red, green, blue, 1.0}; 

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambientColor); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor); 

glPushMatrix(); 

glTranslatef(posx,posy,posz); 
glutSolidSphere(radious,40,20); 

glPopMatrix(); 

} 

이 변경과 함께, 내가 자료를 보내 내가 glPushMatrix() 같은 기능을 외부에 모든 glMaterialFv 기능을 이동

정보를 그래픽 카드로 가져온 다음 그립니다. 따라서 화면에 실수가 없습니다.