2011-10-12 2 views
5

Come è possibile avere proprietà di materiali separate per oggetti diversi disegnati in OpenGL? ho fatto il seguente codice, che a quanto pare mostra solo il colore più tardi:Impostazione delle proprietà del materiale separate per oggetti diversi in 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); 

se fusi, il colore impostato per l'oggetto 2 viene utilizzato per l'intera scena. Quindi l'oggetto 1 viene reso anche nel colore dell'oggetto 2 nonostante abbia già il proprio set di colori.

Come posso avere i 2 oggetti per avere proprietà separate del materiale in modo che possano essere visualizzati come colori diversi invece di un solo colore nell'intera scena?

+1

Possiamo vedere drawSphere() per favore? – Calvin1602

risposta

1

In primo luogo, il codice di esempio sembra ragionevole e gli oggetti dovrebbero avere materiali diversi.

Ma tieni presente che si modifica solo il colore del materiale diffuso per il secondo oggetto, poiché si impostano esattamente gli stessi colori speculari e i valori di brillantezza per entrambi gli oggetti. Anche l'ambiente del secondo oggetto è lo stesso del primo, poiché si attiva solo il materiale a colori per il canale diffuso, quindi l'ambiente è invariato rispetto al primo oggetto, come OpenGL è una macchina a stati.

Quindi l'unica differenza di materiale tra gli oggetti è il loro colore diffuso e questa differenza è (101, 30, 26). Può essere, quindi, che questa differenza sia appena superata dai termini ambient e speculare che sono completamente uguali ed è quindi troppo piccola per te da notare? Prova materiali completamente diversi e vedi se non c'è davvero alcuna differenza.

0

Sembra che tu abbia perso uno glPopMatrix dopo aver disegnato il primo oggetto. Non so come questo cambierebbe le cose.

+2

Sembra che non si capisca a cosa serve un 'glPopMatrix()'. La tua risposta non aiuta a risolvere il problema. –

3

si dovrebbe mettere:

glEnable(GL_COLOR_MATERIAL); 

Come prima cosa nella vostra funzione di rendering, quindi impostare i parametri di luce:

glDisable(GL_COLOR_MATERIAL); 
glPushMatrix(); 

quindi impostare le proprietà del materiale e chiamare l'oggetto. Tutti gli oggetti d'ora in poi avranno questa proprietà, se si vuole utilizzare un altro materiale su un altro oggetto basta digitare:

glDisable(GL_COLOR_MATERIAL); 

di nuovo, prima di modellare il secondo oggetto, e così via. Se hai ancora domande, basta chiedere.