2011-08-29 19 views
5

En el antiguo OpenGL en desuso, podríamos hacer algo como esto:Colores menos de vértices

glBegin(...); 
    glColor3f(r_1,g_1,b_1); 
    glVertex3f(x_1, y_1, z_1); 
    glVertex3f(x_2, y_2, z_2); 
    ... 
    glVertex3f(x_n, y_n, z_n); 

    glColor3f(r_2, g_2, b_2); 
    glVertex3f(x_(n+1), y_(n+1), z_(n+1)); 
    glVertex3f(x_(n+2), y_(n+2), z_(n+2)); 
    ... 
    glVertex3f(x_2n, y_2n, z_2n); 

    ... 
glEnd(); 

Eso es, estoy diciendo que cada n vértices consecutivos comparten el mismo color. ¿Se puede hacer lo mismo con el OpenGL nuevo y no obsoleto?

Por ejemplo, si tengo un cubo, significa que tengo 36 vértices. Si quiero que cada cara tenga 1 color, cada 6 vértices consecutivos debe compartir ese color. Actualmente, he copiado artificialmente los datos de color 6 veces para cada color, de modo que los tamaños de matriz de vértices y matriz de colores sean los mismos. ¿Hay alguna otra forma de evitar esto? Espero que mi pregunta sea clara.

Respuesta

10

Tal vez este tipo de pseudocódigo borra las cosas para usted:

GLfloat color_state{r,g,b}; 
GLfloat normal_state{x,y,z}; 
... 

glColor4f(r,g,b,a): 
    color_state.r = r 
    color_state.g = g 
    color_state.b = b 
    color_state.a = a 

glNormalf(x,y,z): 
    normal_state.x = x 
    normal_state.y = y 
    normal_state.z = z 

glVertex3f(x,y,z): 
    __glinternal_submit_vertex(
     position = {x,y,z}, 
     normal = normal_state, 
     color = color_state, 
     ...); 

Así es como OpenGL trabajos inmediatos internamente. Los colores no se compartieron entre los vértices. Se creó una copia a partir del estado actual para cada vértice enviado. Ahora, con Vertex Arrays y Vertex Buffer Object, la carga recae sobre usted, para hacer la duplicación de datos correcta.

+1

Ah, bien, ya veo. Gracias de nuevo :) –

Cuestiones relacionadas