【问题标题】:Why specular doesn't work after glOrtho?为什么 glOrtho 后镜面反射不起作用?
【发布时间】:2012-08-23 15:58:22
【问题描述】:

我尝试了许多不同的 GL_SPECULAR,但都没有达到我期望的闪亮效果。

代码有什么问题?

GLfloat mat_ambient[]={0.329412, 0.223529, 0.027451};                                                                                                                                                                                                                         
GLfloat mat_diffuse[]={0.780392, 0.568627, 0.113725};
GLfloat mat_specular[]={0.992157, 0.941176, 0.807843};
GLfloat mat_shininess[]={0.21794872 * 128};


GLfloat light_position[]={1.0,1.0,1.0,0.0};
GLfloat light_ambient[]={1.0,1.0,1.0,1.0};
GLfloat light_diffuse[]={1.0,1.0,1.0,1.0};
GLfloat light_specular[]={1.0,1.0,1.0,1.0};

unsigned char last_key = 0;
unsigned char channel = 'r';

void init(void) {
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_SMOOTH);

    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);

    glLightfv(GL_LIGHT0,GL_POSITION, light_position);
    glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0,GL_SPECULAR, light_specular);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}


void display(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    const int length = 100;
    glBegin(GL_QUADS);
        glVertex2f(50, 50);
        glVertex2f(50 + length, 50);
        glVertex2f(50 + length, 50 + length);
        glVertex2f(50, 50 + length);
    glEnd();
    glFlush();
}


void reshape(int w, int h) {
    glViewport(0,0,(GLsizei) w,(GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, 0, h,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc,char**argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("lighting demo");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

【问题讨论】:

    标签: opengl


    【解决方案1】:

    您没有为GL_QUADS 指定任何glNormal。您可能还需要考虑 glEnable(GL_NORMALIZE) 在模型视图转换后保留单位长度。

    【讨论】:

    • 如果我将 glNormal 添加到每个顶点,它仍然不起作用。你有 glOrtho 的工作示例吗?
    【解决方案2】:

    我看不出这段代码有什么问题,但你没有显示你在画什么。如果您没有正确的顶点法线,那么光泽将不起作用。

    【讨论】:

    • 我正在通过GL_QUADS绘制一个矩形
    • 单个矩形并不能很好地说明镜面反射光,因为任何镜面反射光对其颜色有贡献,在矩形上都是均匀的。
    • 你的意思是glOrtho之后看不到2D镜面光的效果吗?
    • 不,我的意思是你无法在平面上清楚地看到镜面光的效果。要很好地查看镜面高光,您需要一个曲面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多