Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с наложением текстур.


Автор: KaraKum 22.6.2008, 10:28
Доброе время суток.
Такой обычный кусок кода:
Код

...
//back quad:
glEnable(GL_TEXTURE_2D);
glTexCoord2f(1, 1);
glVertex3d(1, 1, 1);
glTexCoord2f(1, 0);
glVertex3d(1, 0, 1);
glTexCoord2f(0, 0);
glVertex3d(-1, 0, 1);
glTexCoord2f(0, 1);
glVertex3d(-1, 1, 1);
glDisable(GL_TEXTURE_2D);
...

Но вот текстура накладывается не только на этот прямоугольник, но и на всё подряд, причём половина сцены вообще не рисуется.
Пробовал закомментировать функцию glEnable(GL_TEXTURE_2D); и в инициализации и в этой части кода (то есть везде) - всё равно текстура накладывается! (и также везде).
Подскажите, пожалуйста, в чём проблема?

Автор: FIaR 24.6.2008, 00:13
Насколько я еще помню, glEnable(GL_TEXTURE_2D); нужно вставлять перед glBegin(GL_.....);, а не внутри. Т.е. Если хочеш затекстуировать прямоугольник, то он должен быть отдельным мэшем.

Автор: KaraKum 24.6.2008, 00:40
Помогло. Молодец, ты. Такую мелочь запомнил - репутация +1.

Полигон, на который накладывается текстура, окрашивается в чёрный цвет, а сама текстура рисуется только цветом, который выбран для заполнения полигона. В чём дело?

Автор: FIaR 24.6.2008, 07:41
Может проблема с текстурными координатами, но лучше бы было посмотреть на код отрисовки  
 smile 

Автор: KaraKum 24.6.2008, 09:42
Код инициализации DevIL и загрузки текстуры:
Код

ILuint texName;
ilGenImages(1, &texName);
ilBindImage(texName);
ilLoadImage("CatEye.bmp");
unTexture[0] = ilutGLBindTexImage();
glBindTexture(GL_TEXTURE_2D, unTexture[0]);
int imageWidth = ilGetInteger(IL_IMAGE_WIDTH);
int imageHeight = ilGetInteger(IL_IMAGE_HEIGHT);
glTexImage2D(GL_TEXTURE_2D, 0, 3, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData());
ilDeleteImages(1, &texName);


Код прорисовки полигона:
Код

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, unTexture[0]);
glBegin(GL_QUADS);
   glTexCoord2f(1, 1);
   glVertex3d(1, 1, 1);
   glTexCoord2f(1, 0);
   glVertex3d(1, 0, 1);
   glTexCoord2f(0, 0);
   glVertex3d(-1, 0, 1);
   glTexCoord2f(0, 1);
   glVertex3d(-1, 1, 1);
glEnd();
glDisable(GL_TEXTURE_2D);

Автор: FIaR 24.6.2008, 15:50
Попробуй так:

Код

glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH),
    ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());


*.bmp формат - это GL_BGR, поэтому для универсальности кода, лучше пользоваться ilGetInteger(IL_IMAGE_FORMAT)

Автор: KaraKum 24.6.2008, 16:10
Да, точно. Но от этого только цвета инвертируются, но текстура так и рисуется только одним цветом (цветом полигона, на который она "наклеивается").

Автор: FIaR 24.6.2008, 16:54
Я не совсем понимаю, зачем тут нужен unTexture[0] = ilutGLBindTexImage();
А если загрузить текстуру из JPG или TGA - тот же результат??

Автор: KaraKum 24.6.2008, 17:13
Цитата

Я не совсем понимаю, зачем тут нужен unTexture[0] = ilutGLBindTexImage();

Так было в статье, по которой я писал этот код. Удалил эту строку и всё также работает.

Цитата

А если загрузить текстуру из JPG или TGA - тот же результат?? 

Да, результат тот же (текстура рисуется только чёрным цветом и цветом, которым закрашен полигон, на который она наложена).

Автор: KaraKum 27.6.2008, 10:33
Решил вопрос.
Чтобы текстура рисовалась только своим цветом и не смешивалась с цветом полигона, на который она накладывается (что не по умолчанию), нужно вызвать функцию
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

Вопрос решён  smile .

Автор: sgi1981 31.7.2008, 19:46
А вот у меня вопрос следующий.
Есть возможность написать свой собственный шейдер фрагментов и загрузить его на выполнение в графическую карту.

Допустим, на входе у шейдера атрибуты фрагментов такие
fragment.color
fragment.texcoord[0]
texture[0]

Пример части шейдера

Код

TEMP baseMap, outColor; #объявление временных регистров (регистры - векторы)
ALIAS lightMap = baseMap; #псевдоним

MOV outColor, fragment.color; #записываем входное значение первичного цвета фрагмента
TEX baseMap, fragment.texcoord[0], texture[0], 2D; #на входе известно для 2D: ID текстурной единицы 0, текстурные координаты, получаем цвет текселя текстуры
MUL outColor, outColor, baseMap; #накладываем цвет текселя на первичный цвет фрагмента путем умножения цветов
TEX lightMap, fragment.texcoord[1], texture[1], 2D; #получаем цвет текселя для текстурной единицы 1
MUL outColor, outColor, lightMap; #накладываем цвет текселя текстурной единицы 1


Но ведь на фрагмент может быть не наложена никакая текстура. Тогда нужно это как-то определить. Допустим, что на вход шейдера поступает фрагмент примитива без текстуры.
Тогда что будет содержаться в texture[0] ? Как пропустить наложение цвета текселя.
Дело в том, что я уже испытывал свой шейдер фрагментов для генерации тумана, и те примитивы, что задавались без текстуры - рисовались цветом одного из текселей текстуры, которая была наложена на другое тело. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)