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