c - opengl 的镜面光太多

标签 c opengl lighting

这些是我的漫反射、环境光和镜面光的设置以及灯光的位置。我的场景看起来非常明亮,带有镜面光。我尝试过调整灯光的位置,但没有任何效果。 GLfloat greenDiffuseMaterial[] = {0.0, 1.0, 0.0,1.0}; GLfloat 白色镜面 Material [] = {1.0, 1.0, 1.0,1.0}; GLfloat greenAmbientMaterial[] = {0.0, 1.0, 0.2,1.0};

GLfloat greenEmissiveMaterial[] = {0.0, 1.0, 0.5,1.0};
GLfloat lightPosition[] = { 0.0,1.0,0.0, 0.0};
GLfloat ambientLight[]  = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuseLight[]  = { 1.0, 1.0, 1.0, 1.0 };
GLfloat specularLight[] = { 1.0, 1.0, 1.0, 1.0 };

编辑 1

 for (int g =0;g<6400;g++){
    glBegin(GL_QUADS);
        if(mountText %2 ==0){glTexCoord2f(islandVert[g][0] /xscale,islandVert[g][2] / zscale);}
        else{
                glEnable(GL_NORMALIZE);
        glDisable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, greenAmbientMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greenDiffuseMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mShininess);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
                        glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
                    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);}
        glNormal3f(vertNorm[g][0],vertNorm[g][1],vertNorm[g][2]);

        glVertex3f(islandVert[g][0],islandVert[g][1],islandVert[g][2]);
        g++;
        if(mountText %2 ==0){glTexCoord2f(islandVert[g][0] / xscale, islandVert[g][2] / zscale);}
        else{
            glEnable(GL_NORMALIZE);
        glDisable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, greenAmbientMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greenDiffuseMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mShininess);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
                    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);}
        glNormal3f(vertNorm[g][0],vertNorm[g][1],vertNorm[g][2]);
        glVertex3f(islandVert[g][0],islandVert[g][1],islandVert[g][2]);
        g++;

        if(mountText %2 ==0){glTexCoord2f(islandVert[g][0] / xscale, islandVert[g][2] / zscale);}
        else{
                glEnable(GL_NORMALIZE);
        glDisable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, greenAmbientMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greenDiffuseMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mShininess);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);            
                            glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);}
        glNormal3f(vertNorm[g][0],vertNorm[g][1],vertNorm[g][2]);
        glVertex3f(islandVert[g][0],islandVert[g][1],islandVert[g][2]);

        g++;

        if(mountText %2 ==0){glTexCoord2f(islandVert[g][0] / xscale, islandVert[g][2] / zscale);}
        else{
                glEnable(GL_NORMALIZE);
        glDisable(GL_TEXTURE_2D);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_DEPTH_TEST);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, greenAmbientMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, greenDiffuseMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whiteSpecularMaterial);
                        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mShininess);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
                            glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
                    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);}
        glNormal3f(vertNorm[g][0],vertNorm[g][1],vertNorm[g][2]);
        glVertex3f(islandVert[g][0],islandVert[g][1],islandVert[g][2]);
    glEnd();
}

基本上,在每个坐标处,我都会检查纹理是否打开,如果没有,我想将其设置为原始的绿色 Material 。我得到的结果是我的对象的一侧被极度照亮,而另一侧是环境光。顶点法线起作用是因为有平滑的阴影,但我认为这可能与我的灯光位置有关。当我尝试改变它时,场景仍然是一样的。

最佳答案

仅此部分

GLfloat greenEmissiveMaterial[] = {0.0, 1.0, 0.5,1.0};

已经使任何对象以颜色 (0, 1, 0.5) 显示,与您指定的任何光源无关。真实的灯光只会添加该颜色,使其更加明亮。

关于c - opengl 的镜面光太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22893484/

相关文章:

javascript - Three.js:转换基本阴影时出现问题

在函数名前加上 '&' 调用函数

opengl - 如何在 OpenGL 中使用多个视口(viewport)?

python - 一种在 C 中模拟命名参数的方法

opengl - GLFW - 无法打开窗口

c++ - OpenGL,为什么这不是立方体?

c++ - D3D11 : variable number of lights in HLSL

three.js - 光照模型的计算在着色器程序中是如何工作的?

c - 跨平台使用 void 指针

c - 使用指针实现 strcat