2008-11-07 2 views
2

У меня есть треугольная сетка, у которой нет текстуры, а цвет набора (вид синего) и альфа (0.7f). Эта сетка генерирует время выполнения, и нормали являются правильными. Я нахожу, что при освещении цвет моего объекта меняется, когда он перемещается по уровню. Кроме того, освещение не выглядит правильным. Когда я рисую этот объект, это код:Проблемы с освещением в OpenGL

glEnable(GL_COLOR_MATERIAL); 
float matColor[] = { cur->GetRed(), cur->GetGreen(), cur->GetBlue(), cur->GetAlpha() }; 
float white[] = { 0.3f, 0.3f, 0.3f, 1.0f }; 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matColor); 
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white); 

Другая странная вещь я заметил, что освещение терпит неудачу, когда я отключить GL_FRONT_AND_BACK и использовать только GL_FRONT или GL_BACK. Вот мое освещение установить (делается один раз в начале рендер):

m_lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
m_lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
m_lightPosition[] = { 0.0f, 1200.0f, 0.0f, 1.0f }; 

glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient); 
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular); 
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition); 

EDIT: Я сделал много, чтобы сделать нормали «более» правильные (т.к. я генерируя поверхность сам), но цвет объектов по-прежнему изменяется в зависимости от того, где он находится. Почему это? Есть ли у openGL какое-то особое смешение условий, о котором я не знаю? EDIT: Оказывается, изменение цвета было связано с тем, что предыдущая текстура находилась в стеке текстур, и хотя он не рисовался, glMaterialfv смешивался с ним.

ответ

1

Если ваше освещение не срабатывает, когда GL_FRONT_AND_BACK отключен, возможно, что ваши нормали перевернуты.

+0

но, конечно же, он будет работать только с одним из GL_FRONT или GL_BACK ... который он не делает. – DavidG 2008-11-07 15:18:32

0

Если ваши треугольники альфа-смеси, разве вам не нужно сортировать свои лица по z-порядку с камеры? В противном случае вы можете визуализировать лицо в задней части объекта поверх лица спереди.

+0

Это 1 призыв к призыву для этого объекта и тестирования z ... отлично работает для других сеток в игре (полупрозрачные текстурированные шары), но эта конкретная сетка работает неправильно. есть много различий между этим и другими, были через все варианты: S – DavidG 2008-11-07 14:41:50

1

Не могли бы вы опубликовать код, который инициализирует OpenGL? Вы говорите, что все другие сетки сделаны отлично? Вы выполняете их одновременно?

0

@sebastion: несколько вызовов рисования, каждый объект получает glDrawArrays. некоторые текстурированы, некоторые окрашены, все с нормалями. gl init код: glMatrixMode (GL_MODELVIEW);

// Vertices! 
glEnableClientState(GL_VERTEX_ARRAY); 

// Depth func 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

// Enable alpha blending 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

// Lighting 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 
glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient); 
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular); 
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition); 

// Culling 
glDisable(GL_CULL_FACE); 
// Smooth Shading 
glShadeModel(GL_SMOOTH); 

m_glSetupDone = true; 

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

+0

Я отключил заднюю сторону, отбраковывая здесь только для проверки – DavidG 2008-11-10 09:52:03

1

@response в stusmith:

Z-тестирование не поможет с прозрачными треугольниками, вы будете нуждаться в-треугольник альфа сортировка тоже. Если у вас есть объект, который в любой момент может иметь перекрывающиеся треугольники, обращенные к камере (вогнутый объект), сначала вы должны нарисовать самые дальние треугольники, чтобы гарантировать, что смешение выполняется правильно, так как Z-тестирование не учитывает прозрачность. Рассмотрите эти два перекрывающихся (и прозрачных) треугольника и подумайте о том, что произойдет, когда эта маленькая область перекрытия будет нарисована, с или без Z-тестирования. Вы, вероятно, придете к выводу, что порядок рисования действительно имеет значение. Прозрачность сосет: P

/\ /\ 
/\/\ 
/ \/ \ 
/ /\  \ 
/_____/__\_____\ 

Я не уверен, что это ваша проблема, но альфа сортировка является то, что вам нужно принимать во внимание при рассмотрении частично прозрачными объектами.

+0

. Теперь я перешел к длительности отключения прозрачности. все еще не получая освещения. : S – DavidG 2008-11-10 09:48:47

0

Вы уверены, что ваш нормали нормирован? Если нет, и вы задаете нормалей через glNormal вызовы, вы можете попробовать, чтобы позволить OpenGL сделать нормализацию для вас, имейте в виду, что это следует избегать, но вы можете проверить это:

glEnable(GL_NORMALIZE); 

Таким образом, вы сообщают OpenGL об изменении всех нормальных векторов, предоставляемых через glNormal.

Смежные вопросы