opengl - 我的地面不亮

标签 opengl

我有点被我的灯光困住了。我的灯可以照亮网格,但它不会照亮我的地面。

这是我的一些代码

光:

glEnable(GL_LIGHT0);

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);
glEnable(GL_COLOR_MATERIAL);


GLfloat ambient_light0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position_light0[] = { 0.0f, 8.0f, 0.0f, 0.9f };


GLfloat spotDirection_light0[] = {0.0, -1.0, 0.0 };
GLfloat specularLightcolor[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, position_light0 );
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection_light0 );
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5);

glLightfv( GL_LIGHT0, GL_AMBIENT, ambient_light0 );
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLightcolor);

glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 60.0f );
glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 50.0f );

地面:
void drawGround(int id) {

glEnable(GL_TEXTURE_2D);

glEnable(GL_COLOR_MATERIAL);



getTexture(id);

glBindTexture(GL_TEXTURE_2D, id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



GLfloat material_diffuse[] = {0.9, 0.9, 0.9, 1.0 };

    GLfloat material_specular[] = { 1, 1, 1, 1 };



glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);


glBegin(GL_QUADS); 



for(int i = 0; i<3; i++){

    for(int j= 0; j<3; j++){

    glNormal3f(0.0f, 1.0f, 0.0f);

    glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);

        glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);

        glMaterialf(GL_FRONT, GL_SHININESS, 80.0);



    glTexCoord2f(1, 1);

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));

    glTexCoord2f(1, 0);     

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0,0);  

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0, 1);     

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));


    }

}


glDepthMask( 1.0 );

glDisable(GL_TEXTURE_2D);

glEnd();

}

地面的绘制发生在光被调用之后。
有谁知道为什么我的地面不亮?

这是我的问题的屏幕截图 ---> Image

最佳答案

问题是,默认的固定函数 OpenGL 照明仅在顶点处进行照明,然后仅对生成的颜色进行插值。由于地面的所有 4 个顶点都光线昏暗,因此整个四边形变暗。

解决方案:

  • 进一步分割您的地面,以便有更多的光采样点。到目前为止,您只有 3×3 分,这还远远不够。考虑 100×100 甚至更多,以获得不错的照明效果。

  • 或者
  • 使用片段着色器来实现每像素照明。

  • 顺便说一句,您在那里遇到了典型的 OpenGL 新手陷阱。

    更新:

    附带说明:您也没有为飞机提供法线。因此,照明将根本不起作用。

    关于opengl - 我的地面不亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7963482/

    相关文章:

    python - Eclipse + PyDev 在大量导入时变得极其缓慢

    c++ - 在 openGL/GLUT 中绘制多个形状

    opengl - Visual Studio 2012 Express 附带什么版本的 OpenGL?

    c++ - 使用 OpenGL 中具有 Alpha 的纹理渲染 3D 模型

    java - 我没有告诉它 VBO 渲染顶点

    c++ - 使用 OpenGL 计算着色器的朴素框模糊非常慢

    opengl - 链接到 NVIDIA OpenGL 库

    c++ - 基于 OpenGL 四元数的 FPS 相机抖动

    c++ - 我应该始终对 OpenGL 中的所有纹理使用 GL_ARGB 格式吗?

    c++ - 窗口未关闭 GLFW