слишком много зеркального света opengl

это мои настройки для диффузного, окружающего и зеркального отражения, а также положение моего источника света. Моя сцена выглядит чрезвычайно освещенной зеркальным светом. Я попытался отрегулировать положение света, но это ни к чему не привело. GLfloat greenDiffuseMaterial[] = {0.0, 1.0, 0.0,1.0}; GLfloat whiteSpecularMaterial[] = {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();
}

В основном на каждой координате я проверяю, включена текстура или нет, и если это не так, я хочу установить исходный зеленый материал. Результат, который я получаю, заключается в том, что одна сторона моего объекта очень освещена, а другая сторона окружена. Нормали вершин работают, потому что есть плавное затенение, но я думаю, что это может быть как-то связано с положением моего источника света. Когда я пытаюсь изменить его, сцена остается прежней.


person user3474409    schedule 06.04.2014    source источник


Ответы (1)


Только эта часть

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

уже заставит любой объект появиться в цвете (0, 1, 0,5) независимо от любого источника света, который вы укажете. Реальное освещение лишь добавит этого цвета, сделав его еще ярче.

person derhass    schedule 06.04.2014
comment
Я забыл упомянуть, что у меня есть другие материалы setGLfloat greenDiffuseMaterial[] = {0.0, 1.0, 0.0,1.0}; GLfloat whiteSpecularMaterial[] = {1.0, 1.0, 1.0,1.0}; GLfloat greenAmbientMaterial[] = {0.0, 1.0, 0.2,1.0}; - person user3474409; 06.04.2014
comment
Затем предоставьте соответствующие части кода, которые показывают проблему, с которой вы столкнулись. - person derhass; 06.04.2014