2010-05-12 86 views
1

我正在努力在我的OpenGL ES iPhone场景中获得简单的照明。我正在显示一个以原点为中心的简单对象,并使用一个弧形球通过触摸屏幕来旋转它。除了我尝试添加一个固定光源(固定的眼睛位置)并且拧得很紧:所有这些都很好地工作,但是整个对象(本例中为二十面体)均匀点亮,即它们全都显示为相同的颜色。照明和OpenGL ES

我简化了我的代码尽可能所以它是独立的,仍然再现我的经历:

glClearColor (0.25, 0.25, 0.25, 1.); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable (GL_DEPTH_TEST); 

    glEnable(GL_LIGHTING); 

    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    glOrthof(-1, 1, -(float)backingWidth/backingHeight, (float)backingWidth/backingHeight, -10, 10); 

    glMatrixMode (GL_MODELVIEW); 
    glLoadIdentity(); 

    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f }; 
    GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
    GLfloat position[] = { -1.5f, 1.0f, -400.0f, 0.0f }; 

    glEnable(GL_LIGHT0); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); 
    glLightfv(GL_LIGHT0, GL_POSITION, position); 

    glShadeModel(GL_SMOOTH); 
    glEnable(GL_NORMALIZE); 

    float currRot[4]; 
    [arcball getCurrentRotation:currRot]; 
    glRotatef (currRot[0], currRot[1], currRot[2], currRot[3]); 

    float f[4]; 
    f[0] = 0.5; f[1] = 0; f[2] = 0; f[3] = 1; 
    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, f); 
    glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, f); 

    f[0] = 0.2;  f[1] = 0.2; f[2] = 0.2; f[3] = 1; 
    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, f); 

    glEnableClientState (GL_VERTEX_ARRAY); 
    drawSphere(0, 0, 0, 1); 

其中drawSphere函数实际上绘制了一个二十面体:

static void drawSphere (float x, float y, float z, float rad) 
{ 
    glPushMatrix(); 
    glTranslatef (x, y, z); 
    glScalef (rad, rad, rad); 

    // Icosahedron 
    const float vertices[] = 
    { 0., 0., -1., 0., 0., 1., -0.894427, 0., -0.447214, 0.894427, 0., 
      0.447214, 0.723607, -0.525731, -0.447214, 0.723607, 0.525731, 
      -0.447214, -0.723607, -0.525731, 0.447214, -0.723607, 0.525731, 
      0.447214, -0.276393, -0.850651, -0.447214, -0.276393, 0.850651, 
      -0.447214, 0.276393, -0.850651, 0.447214, 0.276393, 0.850651, 
      0.447214 }; 
    const GLubyte indices[] = 
    { 1, 11, 7, 1, 7, 6, 1, 6, 10, 1, 10, 3, 1, 3, 11, 4, 8, 0, 5, 4, 0, 
      9, 5, 0, 2, 9, 0, 8, 2, 0, 11, 9, 7, 7, 2, 6, 6, 8, 10, 10, 4, 3, 
      3, 5, 11, 4, 10, 8, 5, 3, 4, 9, 11, 5, 2, 7, 9, 8, 6, 2 }; 

    glVertexPointer (3, GL_FLOAT, 0, vertices); 
    glDrawElements (GL_TRIANGLES, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_BYTE, indices); 
    glPopMatrix(); 
} 

电影是什么我看到的结果是here。感谢任何能够阐明这一点的人(不要开玩笑!)。我敢肯定它对于某个人来说看起来会很尴尬,但是我发誓在这之前我已经看过很多照明教程,并且陷入困境。

回答

1

尝试使用glNormalPointer()添加一些顶点法线。它看起来像OpenGL ES只是使用default normal的一切。

+1

你说得对。我也是对的,我现在感到羞愧:) – 2010-05-12 22:27:28