Как цвета и текстуры работают вместе? - PullRequest
0 голосов
/ 21 августа 2011

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

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

Вот моя текстура (.png).

enter image description here

А вот рендеринг:

enter image description here

Вот некоторые важные части моего кода (я знаю, что я делаю много вещей неправильно, например, использую треугольные полосы вместо четырехугольников, не использую HLSL и т. Д. - я новичок:)

Начальная часть:

//glInit
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND); //<-- blending is disabled!

Текстурная часть:

glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 4,  tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

Чертежная часть:

glBegin(GL_TRIANGLE_STRIP);
   glColor3f(1, 0, 0);  //red front face
   glTexCoord2d(0, 0);
   glVertex3d(-a, -a, -a);
   glTexCoord2d(0, 1);
   glVertex3d(-a, -a, a);
   glTexCoord2d(1, 0);
   glVertex3d(a, -a, -a);
   glTexCoord2d(1, 1);
   glVertex3d(a, -a, a);
glEnd();

glBegin(GL_TRIANGLE_STRIP);
   glColor3f(0, 1, 0);  //green back face
   glVertex3d(-a, a, -a);
   glVertex3d(-a, a, a);
   glVertex3d(a, a, -a);
   glVertex3d(a, a, a);
glEnd();

glBegin(GL_TRIANGLE_STRIP);
   glColor3f(0, 0, 1);  //blue right face
   glVertex3d(a, -a, -a);
   glVertex3d(a, -a, a);
   glVertex3d(a, a, -a);
   glVertex3d(a, a, a);
glEnd();

//etc.

Итак, не могли бы вы помочь мне сохранить цвет моей текстуры, чтобы он не стал красноватым? Если какая-то другая часть моего кода необходима, чтобы понять, что я делаю неправильно, просто скажите, что я буду редактировать. Заранее большое спасибо.

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Если вы намереваетесь нарисовать одну сторону куба с текстурой, а другие - без нее, то вам нужно glEnable(GL_TEXTURE_2D) для стороны с текстурой и glDisable(GL_TEXTURE_2D) для сторон без нее.Это не ваша проблема, но это все еще нужно сделать.

Если вы пытаетесь рендерить только с текстурой, вы можете передать (1, 1, 1) для цвета.Тем не менее, это просто закрашивает проблему.

Если вы действительно намерены придерживаться фиксированной функции OpenGL, то вам нужно использовать текстурное окружение .Каждый текстурный блок (glActiveTexture(GL_TEXTURE0 + texture_unit)) имеет «текстурную среду», которая, по сути, является математической операцией, которая объединяет определенное значение, извлеченное из текстуры, с интерполированным цветом для каждой вершины или предыдущей командой текстурной среды.Они выполняются в порядке текстурных блоков.По умолчанию используется значение GL_MODULATE, которое умножает цвет на текстуру.Вы хотите GL_REPLACE.

0 голосов
/ 26 августа 2011

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

0 голосов
/ 21 августа 2011

Я только что взглянул на ваш .png и не могу найти там альфа-канал. Если его нет, вы принимаете GL_RGBA и принимаете 4 байта на пиксель. Это может вызвать видимое смешение цветов.

...