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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值