2012-01-29 19 views
5

He escrito un protector de pantalla OpenGL para Mac OS X 10.5 y superior que muestra un corazón giratorio construido con cubos de marcha. Funciona bien en mi negro desarrollo Macbook 13,3" corriendo Snow Leopard (10.6), bonito y brillante.Objeto OpenGL brillante/brillante en Mac OS X 10.6, pero no en 10.5. ¿Por qué?

Pero cuando lo intento en una nueva Macbook Pro, pero con Leopard (10.5), el ISN corazón No es brillante. Parece que solo está iluminado con luz ambiente/difusa, pero no con luz especular. Es como si hubiera configurado el componente especular de la luz a 0. La Macbook más nueva tiene una tarjeta gráfica Nvidia. corriendo el 10.6, una XMA3100 Intel.

Su e es mi código de inicialización OpenGL. El corazón se crea usando cubos de marcha y también estoy computando los vectores normales.

 
- (void)setUpOpenGL 
{ 
    [[glView openGLContext] makeCurrentContext]; 

    // Synchronize buffer swaps with vertical refresh rate 
    GLint swapInterval = 1; 
    [[glView openGLContext] setValues:&swapInterval 
         forParameter:NSOpenGLCPSwapInterval]; 

    glShadeModel(GL_SMOOTH); 
    glClearDepth(1.0); 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 

    // Light 
    GLfloat ambient_light[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat specular_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat position_light[] = { 0.0f, 0.0f, -1.0f, 0.0f }; 

    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light); 
    glLightfv(GL_LIGHT0, GL_POSITION, position_light); 

    // Material 
    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

    GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0}; 
    GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 }; 
    GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 }; 
    GLfloat mat_shininess[] = { 100.0 }; 

    glColor3f(1.0, 0.0, 0.0); 

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 

    // Copy isosurface vertices to graphics array 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, [marchingCubes vertices]); 
    glNormalPointer(GL_FLOAT, 0, [marchingCubes normals]); 
} 

El código de dibujo real se parece a esto:

 
- (void)drawRect:(NSRect)rect 
{ 
    [super drawRect:rect]; 

    [[glView openGLContext] makeCurrentContext]; 

    glDrawBuffer(GL_BACK); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Adjust viewpoint to give heart beat effect 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, radius, 2*radius/3, 
       0, 0, 0, 
       0, 0, 1); 

    // Adjust rotation to make heart spin 
    glRotatef(rotation, 0.0f, 0.0f, 1.0f); 

    // Draw heart 
    glDrawArrays(GL_TRIANGLES, 0, [marchingCubes vertexCount]/3); 

    glFlush(); 

    [[glView openGLContext] flushBuffer]; 

    // Rotate and scale a bit 
    rotation += 1.0f; 
    radius = 4.0 + 0.25*sin(rotation/4); 
} 

Cualquier idea por qué la diferencia de iluminación especular? ¿La iluminación especular simplemente no es compatible con algunas tarjetas gráficas? Cualquier puntero es muy apreciado.

+0

Nunca dado cuenta de esto, pero de código abierto del proyecto: –

Respuesta

1

El valor predeterminado para GL_SPECULAR (y otros colores) es { 0.0,0.0,0.0,1.0 }

GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 }; 

También puede hacer esto al final de su func configuración para optimizar el dibujo 1. y 2. volver a comprobar si la iluminación se aplica en realidad a la cara frontal mientras lo configuras.

glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
+0

https://github.com/thinkski/ValentineGL Gracias por la sugerencia. Añadí el sacrificio en la cara posterior y descubrí que la cara frontal estaba en el interior. Así que agregué una llamada a glFrontFace (GL_CW) justo después de "sincronizar los intercambios de buffer con la frecuencia de actualización vertical" en setUpOpenGL, pero todavía no brillar. Tanto la luz como los componentes especulares del material están configurados en {1.0, 1.0, 1.0, 1.0} como en el código anterior. Si ajusto a {0.0, 0.0, 0.0, 1.0}, el brillo también desaparecerá en 10.6. –

+0

Esto tiene que ver con las multiplicaciones cuando el material y los colores claros se mezclan. Negro * otro color da negro, cuando alfa también es 0.0, entonces el resultado es completamente transparente, cualquiera que sean los 3 componentes de color. Sugiero que defina explícitamente la atenuación de luz y otros valores accesibles usando glLight(). – Sam

+0

Voy a intentarlo. Ya no tengo acceso a la máquina de prueba 10.5, por lo que las pruebas serán más lentas. Otra cosa en la que pensé fue que 10.5 es un sistema operativo de 32 bits, mientras que 10.6 es de 64 bits, así que escribí los vectores y vértices normales en un archivo en cada uno y los comparé. Eran idénticos, así que ese no es el problema. –

Cuestiones relacionadas