2011-10-12 6 views
5

OpenGL에서 그려진 여러 객체에 대해 개별 재료 특성을 사용하려면 어떻게해야합니까? 렌더링 할 때OpenGL에서 다른 객체에 대한 별도의 재료 특성 설정

//************** Object 1 ************** 
glEnable(GL_COLOR_MATERIAL); 
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
glColor4f(149.0/255.0, 78.0/255.0, 22.0/255.0, 1.0); 
float mat_specular[] = {0.992157, 0.941176, 0.807843, 1.0}; 
float shininess = 10; 

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
glMaterialf(GL_FRONT, GL_SHININESS, shininess); 

glPushMatrix(); 
glTranslatef(0, 3.0, 0); 
drawSphere(0.1, 0.1, 0.1); 
glRotatef(10, 1, 0, 0); 

glDisable(GL_COLOR_MATERIAL); 


//************** Object 2 ***************** 
glEnable(GL_COLOR_MATERIAL); 
glColorMaterial(GL_FRONT, GL_DIFFUSE); 
glColor4f(48.0/255.0, 48.0/255.0, 48.0/255.0, 1.0); 
float mat_specular_2[] = {0.992157, 0.941176, 0.807843, 1.0}; 
float shininess_2 = 10; 

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_2); 
glMaterialf(GL_FRONT, GL_SHININESS, shininess_2); 

glPushMatrix(); 
glTranslatef(-0.6, 0.2, 1.6/2.0); 
drawSphere(0.1, 0.1, 0.1); 
glPopMatrix(); 

glDisable(GL_COLOR_MATERIAL); 

, 오브젝트 2에 설정된 색상이 전체 장면에 사용됩니다 : 나는 분명히에만 후에 색상을 보여줍니다 다음 코드를했다. 따라서 Object 1은 이미 자체 색상 세트가 있음에도 불구하고 Object 2의 색상으로 렌더링됩니다.

전체 물체에서 단 하나의 색상 대신 다른 색상으로 표시 될 수 있도록 2 개의 물체가 개별 재질 속성을 가질 수 있습니까?

+1

drawSphere()를 (를) 볼 수 있습니까? – Calvin1602

답변

1

먼저 예제 코드가 적당 해 보이며 실제로 개체의 재질이 달라야합니다.

하지만 두 개체의 반사 색상과 광택 값을 정확히 설정 했으므로 두 번째 오브젝트의 확산 재료 색상 만 변경한다는 점에 유의하십시오. OpenGL은 상태 기계입니다. 따라서 두 번째 객체의 분위기는 첫 번째 객체와 비슷합니다. 확산 채널에 색상 재료 만 사용하도록 설정했기 때문에 앰비언트는 첫 번째 객체와 동일하지 않습니다.

개체 사이의 유일한 차이는 확산 색이며이 차이는 (101, 30, 26)입니다. 그렇다면이 차이는 완전히 평등 한 대기 조건과 반사적 조건에 비하면 너무 비싸므로주의 할 수 없을 정도로 작습니까? 완전히 다른 재료를 사용해보고 실제로 차이가 없는지 확인하십시오.

0

첫 번째 객체를 그린 후에 glPopMatrix을 놓친 것처럼 보입니다. 그게 어떻게 변화 시킬지 모르겠습니다. 다음, 당신의 렌더링 함수에서 우선으로

glEnable(GL_COLOR_MATERIAL); 

을 빛 매개 변수를 설정 :

+2

'glPopMatrix()'가 사용되는 것을 이해하지 못하는 것 같습니다. 귀하의 대답은 문제를 해결하는 데 전혀 도움이되지 않습니다. –

3

당신은 넣어해야

glDisable(GL_COLOR_MATERIAL); 
glPushMatrix(); 

그런 다음 재료의 속성을 설정하고 개체를 호출.

glDisable(GL_COLOR_MATERIAL); 

을 다시는 두 번째 객체를 모델링하고 전에 : 방금 입력 한 다른 개체에 다른 재료를 사용하려면 지금부터 모든 개체는이 속성을해야합니다. 여전히 궁금한 점이 있으면 부탁드립니다.