IOS Opengl ES 用多光源实现材质,阴影,高光效果

来源:互联网 发布:蓝牙扫描app安卓源码 编辑:程序博客网 时间:2024/04/30 16:04

在Opengl ES 1.0 中, 要实现材质效果,往往需要光源的设置, 如果环境光和漫反射光强了,材质效果难以体现, 如果环境光和漫反射光弱了,材质就暗了



实现阴影效果,可以放置一个主平行光源, 为了材质效果,需要将环境光设到比较弱,漫反射光设到稍强

    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    const GLfloatlightAmbient[]  = {0.08, 0.08, 0.08, 1.0};    const GLfloatlightDiffuse[]  = {1.0, 1.0, 1.0, 1.0};    const GLfloatlightSpecular[]  = {1.0, 1.0, 1.0, 1.0};    const GLfloatlightPosition[] = {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);



原创粉丝点击