生成一个中心对称的单峰贝塞尔曲面之后,加上光照效果不对,图案理应是接收固定光源,不会出现旋转之后亮度不一致的情况
//顶点数据
GLfloat ctrlpoints[4][4][3] = {
{ { -2.0, -1.5, -2.0 },
{ -0.5, -1.5, -2.0 },
{ 0.5, -1.5, -2.0 },
{ 2.0, -1.5, -2.0 }},
{ { -2.0, -1.5, -0.5 },
{ -0.5, 1.5, -0.5 },
{ 0.5, 1.5, -0.5 },
{ 2.0, -1.5, -0.5 }},
{ { -2.0, -1.5, 0.5 },
{ -0.5, 1.5, 0.5 },
{ 0.5, 1.5, 0.5 },
{ 2.0, -1.5, 0.5 }},
{ { -2.0, -1.5, 2.0 } ,
{ -0.5, -1.5, 2.0 },
{ 0.5, -1.5, 2.0 },
{ 2.0, -1.5, 2.0 } } };
//初始化
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };//环境光
GLfloat position[] = { 0.0, 2.0, 2.0, 0.0 };
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_emission[] = { 0.2, 0.2, 0.0, 1.0 };//物体放射光
GLfloat mat_diffuse[] = { 1.0, 1.0, 0.0, 1.0 };//漫反射光:物体颜色
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 60.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightfv(GL_LIGHT0, GL_SPECULAR, white);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
}
//绘制
void display(void)
{
static unsigned int rotate_flag = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPopMatrix();
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
if(rotate_flag == 0)
glRotatef(-30.0, 1.0, 0.0, 0.0);
else if(rotate_flag >= 60){
glRotatef(1.0, 0.0, 1.0, 0.0);
rotate_flag = 1;
}
rotate_flag++;
glPushMatrix;
glutSwapBuffers();
}
效果不对
使能下边这两句之后,光照效果就像不见了一样
//打开自动法矢量开关
glEnable(GL_AUTO_NORMAL);
//允许正则化法矢量
//glEnable(GL_NORMALIZE);
自问自答~
光照点位置设置的不对
归根到底是对坐标系的理解错误
再加上一些效果的使能也没有用上,故最终没有照上正确的光照效果