C++ OpenGL 照明只照亮某些墙壁

标签 c++ opengl lighting

我在 opengl 中照亮我的场景,有 4 面墙,其中只有 2 面被照亮。 我认为法线有问题,但我不确定。

这是照明代码:

glShadeModel(GL_SMOOTH);
//glEnable(GL_CULL_FACE);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

GLfloat lightpos0[] = {-5, 1, 0, 0.};
GLfloat AmbientLight0[] = {0.2, 0.2, 0.2,1.0}; 
GLfloat DiffuseLight0[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight0[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT0, GL_POSITION, lightpos0);
glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientLight0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseLight0);
glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularLight0);

GLfloat lightpos1[] = {5, 1, 0, 0};
GLfloat AmbientLight1[] = {0.2, 0.2, 0.2,1.0}; 
GLfloat DiffuseLight1[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight1[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT1, GL_POSITION, lightpos1);
glLightfv(GL_LIGHT1, GL_AMBIENT, AmbientLight1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, DiffuseLight1);
glLightfv(GL_LIGHT1, GL_SPECULAR, SpecularLight1);

这是绘制 4 面墙的代码。

    //north
    glBegin(GL_QUADS);
glNormal3f(1.0,0,0);
glVertex3f(-10,0,-10);
glVertex3f( 10,0,-10);
glVertex3f( 10,5,-10);
glVertex3f(-10,5,-10);
glEnd();
//south
glBegin(GL_QUADS);
glNormal3f(-1.0, 0, 0);
glVertex3f(-10,0, 10);
glVertex3f( 10,0, 10);
glVertex3f( 10,5, 10);
glVertex3f(-10,5, 10);
glEnd();
//east
glBegin(GL_QUADS);
glNormal3f(0,0, -1.0);
glVertex3f( 10,0,-10);
glVertex3f( 10,0,10);
glVertex3f( 10,5,10);
glVertex3f( 10,5,-10);
glEnd();
//west
glBegin(GL_QUADS);
glNormal3f(0,0,1.0);
glVertex3f( -10,0,-10);
glVertex3f( -10,0,10);
glVertex3f( -10,5,10);
glVertex3f( -10,5,-10);
glEnd();

如果有帮助,请看下面的图片:http://i.stack.imgur.com/xRgVL.png

最佳答案

正如 Vladislav Khorev 所指出的,法线必须指向所有点共有的坐标(考虑到这种特殊的正交排列)。 但也应该考虑多边形的缠绕:

 // Polygon A --  north     Polygon B -- south
 glVertex3f(-10,0,-10);     glVertex3f(-10,0, 10); 
 glVertex3f( 10,0,-10);     glVertex3f( 10,0, 10);
 glVertex3f( 10,5,-10);     glVertex3f( 10,5, 10);
 glVertex3f(-10,5,-10);     glVertex3f(-10,5, 10);
 Normal(0,0,1),             Normal(0,0,-1);

这两个多边形(北面和南面)的缠绕方式不同。第一个是从点 0,0,0 观察到的 ClockWise,另一个是 CCW。应该与这些一致。

关于C++ OpenGL 照明只照亮某些墙壁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766346/

相关文章:

c++ - OpenAcc标准中内核与并行指令之间的区别

c++ - vs2013 : static member does not link

c++ - 我什么时候使用 bad_typeid?

OpenGL 程序纹理抗锯齿

c++ - openGL 中的对象有限制吗?

C++x0 unique_ptr GCC 4.4.4

c++ - 粘在相机上的 ASSIMP 动画网格,看起来是 2D

c++ - 使聚光灯静止

ios - 如何在OpenGL中多次添加光?

android - OpenGL-ES 2.0 (for Android), 如何创建二维动态光照效果?