OpenGL 贝塞尔曲面 光照效果不对

问题遇到的现象和发生背景

生成一个中心对称的单峰贝塞尔曲面之后,加上光照效果不对,图案理应是接收固定光源,不会出现旋转之后亮度不一致的情况

img

img

问题相关代码,请勿粘贴截图
//顶点数据
        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);

我想要达到的结果


自问自答~
光照点位置设置的不对
归根到底是对坐标系的理解错误
再加上一些效果的使能也没有用上,故最终没有照上正确的光照效果