2010-10-26 3 views
4

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

Данное изображение представляет собой сравнение моей текущей программы (слева) и выборки (справа). 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

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

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

Показатель блеска также довольно высок - вы пробовали набрать это несколько пазов?

1

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

+0

... и это помогает как? – DarkDust

+1

Возможно, он может экспериментировать со значениями для диффузного (не столь яркого 1,0) окружающего и зеркального? его свет - большая белая звезда, сияющая во всех направлениях, если он точно настраивает значения на более желтоватый прожектор, он получит лучшие результаты. –