Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с наложением текстур. Накладываются бесконтрольно на всё подря 
V
    Опции темы
KaraKum
  Дата 22.6.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Доброе время суток.
Такой обычный кусок кода:
Код

...
//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); и в инициализации и в этой части кода (то есть везде) - всё равно текстура накладывается! (и также везде).
Подскажите, пожалуйста, в чём проблема?
PM MAIL WWW   Вверх
FIaR
Дата 24.6.2008, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



Насколько я еще помню, glEnable(GL_TEXTURE_2D); нужно вставлять перед glBegin(GL_.....);, а не внутри. Т.е. Если хочеш затекстуировать прямоугольник, то он должен быть отдельным мэшем.
--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
KaraKum
  Дата 24.6.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



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

Полигон, на который накладывается текстура, окрашивается в чёрный цвет, а сама текстура рисуется только цветом, который выбран для заполнения полигона. В чём дело?
PM MAIL WWW   Вверх
FIaR
Дата 24.6.2008, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



Может проблема с текстурными координатами, но лучше бы было посмотреть на код отрисовки  
 smile 
--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
KaraKum
  Дата 24.6.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Код инициализации 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);

PM MAIL WWW   Вверх
FIaR
Дата 24.6.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



Попробуй так:

Код

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)

--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
KaraKum
  Дата 24.6.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Да, точно. Но от этого только цвета инвертируются, но текстура так и рисуется только одним цветом (цветом полигона, на который она "наклеивается").
PM MAIL WWW   Вверх
FIaR
Дата 24.6.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



Я не совсем понимаю, зачем тут нужен unTexture[0] = ilutGLBindTexImage();
А если загрузить текстуру из JPG или TGA - тот же результат??
--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
KaraKum
  Дата 24.6.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Цитата

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

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

Цитата

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

Да, результат тот же (текстура рисуется только чёрным цветом и цветом, которым закрашен полигон, на который она наложена).
PM MAIL WWW   Вверх
KaraKum
Дата 27.6.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



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

Вопрос решён  smile .
PM MAIL WWW   Вверх
sgi1981
Дата 31.7.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



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

Допустим, на входе у шейдера атрибуты фрагментов такие
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] ? Как пропустить наложение цвета текселя.
Дело в том, что я уже испытывал свой шейдер фрагментов для генерации тумана, и те примитивы, что задавались без текстуры - рисовались цветом одного из текселей текстуры, которая была наложена на другое тело. 


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.