Карта освещения с мультитекстурированием, отключение освещения для одной из текстур? - PullRequest
0 голосов
/ 10 января 2010

Как я могу отключить освещение только для одной из текстур в этой схеме мультитекстурирования? Я пытался использовать glDisable (GL_LIGHTING) и glEnable (GL_LIGHTING), но он не запоминает настройки при рендеринге четырехугольника.

Вот фрагмент кода:

glDisable(GL_LIGHTING);
glEnable(GL_BLEND);

glDisable(GL_TEXTURE_RECTANGLE_ARB);
glDisable(GL_TEXTURE_2D);

//------------------------
glActiveTextureARB(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP); // texture with black/white

//------------------------
glActiveTextureARB(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MY_TEXTURE); // normal texture
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);

glColor4f(1, 1, 1, 1);

glBegin(GL_QUADS);
    glNormal3f(0,0,1);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 1.0f);
    glVertex3f(1.0f,  1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

glActiveTextureARB(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

Редактировать: загрузка текстуры:

glGenTextures(1, &LIGHT_MAP);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

Странно то, что когда я включаю освещение в первой строке кода, я не вижу текстуры light_map, визуализированной вообще в мультитекстурном квадре. Кроме того, освещение, кажется, не влияет на этот квад, оно работает на других квадраторах (которые не мультитекстурированы) в моем приложении.

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 10 января 2010

Ваше первое предложение не имеет смысла. GL Lighting происходит на уровне вершин. текстурирование, будь то одиночная текстура или мультитекстура. случается намного позже. Более подробно:

Освещение, полученное для каждой вершины, интерполируется на каждый фрагмент, и это значение вводится на этапе 0 конвейера текстурирования.

Итак ... Светлый цвет L входит и объединяется с текстурой на стадии текстуры 0 (ваша карта освещения здесь), в соответствии с текстурным окружением стадии 0. Вы не показываете, как настраиваете Текстура среды для стадии текстуры 0, поэтому я не могу сказать вам, как она будет проходить.

Затем ваши выходные данные со стадии 0 (вычисленные по освещению и текстуре 0) отправляются на вход текстуры 1 (где привязана ваша «нормальная» текстура. Это называется диффузной текстурой). Здесь вы используете среду COMBINE с ADD как для RGB, так и для ALPHA, что не типично для карт освещения: вы добавляете ваше освещение + карту освещения к рассеянному цвету. Обычно вы хотите их умножить (GL_TEXTURE_ENV_MODE = GL_MODULATE, а не GL_COMBINE).

Кроме того, вы не установили SOURCE0_ALPHA и SOURCE1_ALPHA, поэтому я не уверен, что именно вы добавляете для генерации вывода ALPHA этапа 1.

В общем, я бы посоветовал сначала записать именно то, что вы хотите в результате (как математика), и попытаться отобразить это в конвейер мультитекстурирования GL.

Редактировать: После ваших комментариев, если вы не укажете TexEnv стадии 0, вы получите значение по умолчанию:

GL_TEXTURE_ENV_MODE по умолчанию GL_MODULATE и GL_TEXTURE_ENV_COLOR по умолчанию (0, 0, 0, 0).

Таким образом, ваш цвет, исходящий от освещения, модулируется вашей картой освещения (что может иметь смысл в зависимости от того, чего вы пытаетесь достичь). Это добавляется к вашему diffuse (где, как я уже сказал, скорее всего, он должен модулироваться).

Ничто из этого не меняет того, что я сказал ранее: запишите, какую именно математику вы бы хотели получить в результате. Исходя из этого, мы можем помочь найти, какое текстурное окружение вам может понадобиться. Но вы не сказали, какого результата вы хотите достичь.

...