OpenGL Освещение борется - PullRequest
       3

OpenGL Освещение борется

4 голосов
/ 26 октября 2010

Я нахожусь в середине проекта, обучающего основам OpenGL.У меня большинство требований работают нормально с точки зрения поворота камеры, перевода и т. Д. Однако я много борюсь с освещением.

Это изображение - сравнение моей текущей программы (слева) собразец решения (справа).current program compared to sample solution

Если вы не можете сказать, я получаю очень монохромные цвета на грузовике.Тени очень острые и темные, высокие точки окрашены однократно, а не зеркально.Проект призывает к использованию текстур;та, которую я показал здесь, является базовой текстурой простых серых пикселей, но я мог бы использовать любую текстуру (включая пляжную, песчаную, используемую для земли).Я рисую объект из сетки:

GLfloat ambient[] = {0.1, 0.1, 0.1, 1};
GLfloat diffuse[] = {0.1, 0.1, 0.1, 1};
GLfloat specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat shine = 100.0;

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, shine);

glEable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureNumber);
glBegin(GL_TRIANGLES);

for (int i = 0; i < meshes[n]->nTriangles; i++) {
    for (int j = 0; j < 3; j++) {
        glNormal3fv(mesh -> normals[mesh->triangles[i][j]]);
        glTexCoord2fv(mesh->texCoords[mesh->triangles[i][j]]);
        glVertex3fv(mesh -> vertices[mesh->triangles[i][j]]);
    }
}
glEnd();

В сцене есть один источник света:

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


GLfloat diffuse0[]={1.0, 1.0, 1.0, 1.0};
GLfloat ambient0[]={1.0, 1.0, 1.0, 1.0};
GLfloat specular0[]={1.0, 1.0, 1.0, 1.0};
GLfloat light0_pos[]={1.0, 1.0, 1,0, 1.0};

glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 2.0);

Есть ли что-то важное, что я пропускаю, и это может быть причиной этогосерьезная разница?Конкретные значения, с которыми я должен играть?Или glEnable звонок, который я пропустил?Любая помощь, советы или указатели в другом месте высоко ценится.

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

Чтобы устранить резкое падение, усилите окружающий свет.В OpenGL нет модели глобального освещения, поэтому этот параметр не оказывает никакого влияния, кроме того цвета, которым будет лицо, если на него не падает никакой другой свет.

Поскольку вы используете вызовы типа glVertex, я пойдуна коне и предположить, что вы используете конвейер с фиксированной функциональностью?Если это так, то освещение рассчитывается по вершинам, а затем интерполируется по поверхностям многоугольника.Это означает, что зеркальные блики не очень хорошо работают на «больших» многоугольниках - грубо говоря, выделение не может появляться в середине многоугольника.Графические процессоры с программируемыми конвейерами (в том числе в мобильных телефонах в настоящее время) могут рассчитывать освещение на пиксель, а не на вершину, но OpenGL не делает этого за вас, так что вам придется самостоятельно заниматься программированием шейдеров.Или просто убедитесь, что ваша модель состоит из достаточно маленьких многоугольников.

Ваш показатель блеска также достаточно высок - вы пробовали набрать это на несколько ступеней?

1 голос
/ 26 октября 2010

при взгляде на фон, он выглядит как прожектор справа, просто погружая сцену в теплый свет, а Flakscheinwerfer слева греет все в сильном освещении, устраняя каждую тень

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...