IOS Opengl ES 用多光源實現材質,陰影,高光效果

在Opengl ES 1.0 中, 要實現材質效果,往往需要光源的設置, 如果環境光和漫反射光強了,材質效果難以體現, 如果環境光和漫反射光弱了,材質就暗了



實現陰影效果,可以放置一個主平行光源, 爲了材質效果,需要將環境光設到比較弱,漫反射光設到稍強

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    const GLfloat			lightAmbient[]  = {0.08, 0.08, 0.08, 1.0};
    const GLfloat			lightDiffuse[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat			lightSpecular[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat			lightPosition[] = {50, 100, 50, 0.0};

    glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

將環境光調到很低, 增強漫反射光, 爲體現材質,將鏡面光調到最高



此時暗面非常暗, 需要往暗面打一個光

    glEnable(GL_LIGHT1);

    const GLfloat	    lightAmbient2[]  = {0.08, 0.08, 0.08, 1.0};
    const GLfloat           lightDiffuse2[] = {0.2, 0.2, 0.2, 1.0};
    const GLfloat	    lightSpecular2[]  = {0.1, 0.1, 0.1, 1.0};
    const GLfloat           lightPosition2[] = {-500, -1000, 500.0, 1.0};


    glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient2);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse2);
    glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular2);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition2);

由於是暗面光,將漫反射光調低


此時發現物體亮度不夠, 因此在主光源的同一位置再加兩個光源

    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    const GLfloat           lightAmbient3[]  = {0.06, 0.06, 0.06, 1.0};
    const GLfloat           lightDiffuse3[] = {0.3, 0.3, 0.3, 1.0};
    const GLfloat	    lightSpecular3[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat           lightPosition3[] = {20, 40, 20, 1.0};
    const GLfloat           lightPosition4[] = {50, 100, 50, 0.0};

    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient3);
    glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse3);
    glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular3);
    glLightfv(GL_LIGHT2, GL_POSITION, lightPosition3);
    
    glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient3);
    glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse3);
    glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular3);
    glLightfv(GL_LIGHT3, GL_POSITION, lightPosition4);

將鏡面光都調到最大, 更好的體現材質效果


最後加上材質

    const GLfloat	    matAmbient[]    = {0.4, 0.4, 0.4, 1.0};
    const GLfloat	    matDiffuse[]    = {0.6, 0.6, 0.6, 1.0};
    const GLfloat	    matSpecular[]   = {0.5, 0.5, 0.5, 1.0};
    const GLfloat           matEmission[]   = {0.0, 0.0, 0.0, 1.0};   

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, matEmission);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, lightShininess);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章