Проблемы с освещением в OpenGL - PullRequest
2 голосов
/ 07 ноября 2008

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

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);

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

Ответы [ 6 ]

1 голос
/ 10 ноября 2008

@ ответ Стусмиту:

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

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

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

1 голос
/ 07 ноября 2008

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

1 голос
/ 07 ноября 2008

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

0 голосов
/ 05 января 2009

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

glEnable(GL_NORMALIZE);

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

0 голосов
/ 10 ноября 2008

@ Себастион: несколько вызовов отрисовки, каждый объект получает glDrawArrays. некоторые текстурированные, некоторые цветные, все с нормалью. Код инициализации GL: 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 голосов
/ 07 ноября 2008

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

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