首页 > 解决方案 > OPENGL 光照结果错误

问题描述

我想要的结果(红色)

嗨,我正在尝试在 opengl c++ 中编写我的代码来生成这个(光线来自 (1,1,1)),但它不起作用并生成这个。谁能教我为什么?

起初我以为是关于矩阵计算或照明使用,但现在不太确定了。

灯光功能

void init_light(void) {

    glLoadIdentity();

    glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMat);
    ProjectionMatrix = glm::make_mat4(ProjectionMat);

    glGetFloatv(GL_MODELVIEW_MATRIX, ViewMat);
    ViewMatrix = glm::make_mat4(ViewMat);

    
    glm::mat4 InverseProjectionMatrix = glm::inverse(ProjectionMatrix);

    glm::mat4 InverseViewMatrix = glm::inverse(ViewMatrix);

    glm::mat4 M = glm::inverse(ProjectionMatrix * ViewMatrix);

    glm::mat4 Matr = ProjectionMatrix * ViewMatrix;

    glClearColor(1.0, 1.0, 1.0, 0.0);
    //glClearDepth(0.0);

    GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 };
    GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
    //GLfloat position0[] = { 1., 1., 1., 0.0 };
    //GLfloat position1[] = { 1., 1., 1., 1.0 };

    GLfloat pos[] = { (GLfloat)(InverseViewMatrix * glm::make_vec4(position0))[0],
        (GLfloat)(InverseViewMatrix * glm::make_vec4(position0))[1],
        (GLfloat)(InverseViewMatrix * glm::make_vec4(position0))[2],
        (GLfloat)(InverseViewMatrix * glm::make_vec4(position0))[3] };

    GLfloat spot_direction[] = { 1.0, 1.0, 1.0 };

    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
    glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 1.0);
    glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 80.);
    //glLightfv(GL_LIGHT0, GL_POSITION, position0);
    //glLightfv(GL_LIGHT0, GL_POSITION, pos);
    //glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 2.0);


    //glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
    //glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
    //glLightfv(GL_LIGHT1, GL_POSITION, position1);

    

    GLfloat mat_ambient[] = { 0.2, 0.2, 0.8, 0.0 };
    GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 0.0 };
    GLfloat mat_specular[] = { 0.5, 0.5, 0.5, 0.0 };
    //GLfloat mat_emissive[] = { 0.0, 0.0, 0.0, 0.0 };
    GLfloat mat_shininess[] = { 120.0 };


    

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    //glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emissive);


    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glColorMaterial(GL_FRONT, GL_SHININESS);
    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glEnable(GL_NORMALIZE);
    glEnable(GL_AUTO_NORMAL);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
}

渲染场景

void renderScene(void) {


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    

    double ratio = window_size[0] * 1.0 / window_size[1];

    if (rotationbool == 1) {
        xRot = temp_xRot;
        yRot = temp_yRot;
    }

    
    

    glPopMatrix();
    gluPerspective(fovy, ratio, zNear + (zoom_factor)* ratio, zFar + (zoom_factor)* ratio);
    glLightfv(GL_LIGHT0, GL_POSITION, position0);
    glLightfv(GL_LIGHT1, GL_POSITION, position1);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glPopMatrix();
    glRotatef(xRot, 1.0, .0, .0);
    glRotatef(yRot, .0, 1.0, .0);
    glTranslatef(xTrans, yTrans, zTrans);
    glPushMatrix(); ...
}

主功能

int main(int argc, char* argv[]) {

    bool cad_draw = true;

    if (cad_draw) {
        glutInit(&argc, argv);
    }

    double L_base[3] = { 0.1, 0.1, 0.1 };


    if (cad_draw) {
        finemost_limit[0] = L_base[0];
        finemost_limit[1] = L_base[1];
        finemost_limit[2] = L_base[2];

        window_params_init();

        //glDepthRange(1.0, 0.);

        

        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glEnable(GL_DEPTH_TEST);
        glDepthMask(GL_FALSE);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(window_size[0], window_size[1]);
        glutCreateWindow("Interactive boundary design");
        glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);

        
        
        //init_sfc();
        //init_light();
        
        // register callbacks
        glDepthFunc(GL_LEQUAL);
        //glDepthFunc(GL_GEQUAL);
        glDepthRange(1.0, 0.);  // left handed에서 right hanaded로 변경
        glutDisplayFunc(renderScene);
        glutReshapeFunc(changeSize);
        init_light();
        ///glutMouseWheelFunc(render_wheel);
        glutMouseFunc(mousePress);
        glutMotionFunc(mouseDrag);
        glutPassiveMotionFunc(passive_mouse);
        glutKeyboardFunc(simple_keyboard_binding);
        // enter GLUT event processing cycle
        glutMainLoop();

    }

    return 0; 
}

标签: c++opengllighting

解决方案


推荐阅读