Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 22:01   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию OpenGL. Маскирование в 3D сцене.

Приветствую заглянувших в эту тему форумчан. У меня возник вопрос. Можно ли использовать маскирование в 3D сценах? Нигде не найду об этом информацию. Раньше использовал готовый код, создававший прозрачные текстуры из TGA с альфа-каналом. Мне так не нравится.
Проблема заключается в том, что маска не работает, когда включен тест глубины(glEnable(GL_DEPTH_TEST)).
Приведу два кода. В ortho (glVertex2f) работает, а вот в 3d - нет.
Итак, рабочий код:
Код:
glDisable(GL_DEPTH_TEST);

	glEnable(GL_BLEND);
	glBlendFunc(GL_DST_COLOR,GL_ZERO);
	
	glBindTexture(GL_TEXTURE_2D,mask);
	glBegin(GL_QUADS);
	glTexCoord2f(1,1); glVertex2f(0.1f,0.1f);
        glTexCoord2f(0,1); glVertex2f(-0.1f,0.1f);
        glTexCoord2f(0,0); glVertex2f(-0.1f,-0.1f);
        glTexCoord2f(1,0); glVertex2f(0.1f,-0.1f);
	glEnd();

	glBlendFunc(GL_ONE,GL_ONE);
	glBindTexture(GL_TEXTURE_2D,tex);
	glBegin(GL_QUADS);
	glTexCoord2f(1,1); glVertex2f(0.1f,0.1f);
        glTexCoord2f(0,1); glVertex2f(-0.1f,0.1f);
        glTexCoord2f(0,0); glVertex2f(-0.1f,-0.1f);
        glTexCoord2f(1,0); glVertex2f(0.1f,-0.1f);
	glEnd();
	glDisable(GL_BLEND);
Вот нерабочий:
Код:
glDisable(GL_DEPTH_TEST);

	glEnable(GL_BLEND);
	glBlendFunc(GL_DST_COLOR,GL_ZERO);
	
	glBindTexture(GL_TEXTURE_2D,mask);
	glBegin(GL_QUADS);
	glTexCoord2f(1,1); glVertex3f(0.25,0.5,-3);
	glTexCoord2f(0,1); glVertex3f(-0.25,0.5,-3);
	glTexCoord2f(0,0); glVertex3f(-0.25,-0.5,-3);
	glTexCoord2f(1,0); glVertex3f(0.25,-0.5,-3);
	glEnd();

	glBlendFunc(GL_ONE,GL_ONE);
	glBindTexture(GL_TEXTURE_2D, tex);
	glBegin(GL_QUADS);
	glTexCoord2f(1,1); glVertex3f(0.25,0.5,-3);
	glTexCoord2f(0,1); glVertex3f(-0.25,0.5,-3);
	glTexCoord2f(0,0); glVertex3f(-0.25,-0.5,-3);
	glTexCoord2f(1,0); glVertex3f(0.25,-0.5,-3);
	glEnd();
	glDisable(GL_BLEND);
	glEnable(GL_DEPTH_TEST);
Если во втором случае убрать glDisable(GL_DEPTH_TEST); то появляется черный полигон, следовательно, с координатами ошибок нет. Есть предположение, что второй код, написанный мной, - бред. Если это так, то мучает следующий вопрос. Какие есть оптимальные альтернативы? Шейдеры, или еще что-то. Какой наиболее оптимальный?
Буду благодарен.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.04.2012, 07:48   #2
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
Можно ли использовать маскирование в 3D сценах?
возможно тебе нужен Альфа-тест. (полностью прозрачный или непрозрачный участок текстуры) посмотри еще тут с 38-ого поста.
И лучше проиллюстрируй, что тебе в итоге надо и что имеется на данный момент.
Warn вне форума Ответить с цитированием
Старый 02.04.2012, 19:26   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Цитата:
возможно тебе нужен Альфа-тест
Я натыкался сегодня на него. Тоже думаю, что нужен мне именно альфа-тест. Хотелось бы узнать, есть ли устоявшийся стандарт загрузки таких изображений? Каким образом работаете Вы? Для альфа-теста годятся только TGA форматы или есть другие? А интересуюсь я вот почему. Мне хотелось бы управлять загрузкой текстур. Так сказать, регулировать каждый пиксель. Например, я имею изображение и его маску. При загрузке наложить маску как Alpha. Для обучения этому я собираюсь использовать этот урок. Могли бы вы как знающий сказать, не пустая ли это трата времени для достижения моей цели?
Цитата:
И лучше проиллюстрируй
Да ничего сложного. Есть спрайт в 3D поле(в буквальном смысле, на траве) на прямоугольном полигоне. Я хотел сделать его прозрачным. Думал маской получится, но прочитал, что это медленный способ.
Изображения
Тип файла: jpg ScreenShot.jpg (265.6 Кб, 137 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 02.04.2012 в 19:33.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.04.2012, 20:40   #4
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
Да ничего сложного. Есть спрайт в 3D поле(в буквальном смысле, на траве) на прямоугольном полигоне. Я хотел сделать его прозрачным. Думал маской получится, но прочитал, что это медленный способ.
Нужен хотя бы бит в растре (DXT1) для альфа канала. Что бы закодировать прозрачный это пиксель или нет. Можно конечно и больше. RGBA8888( BMP/TGA… with Alpha). Загружать-микшировать маску с изображением лучше все-таки не в рунтайме лучше заранее приготовить текстуры а в программе просто загрузить их.
Рисовать с блендингом и альфа тестом. Не выключая Z тест и запись в него.
Как-то так…

Код:
	glEnable(GL_ALPHA_TEST);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, bmpTexWithAlpha);
	DrawBox(100,100,400,400);
	glDisable(GL_BLEND);
	glDisable(GL_ALPHA_TEST);
Если тексель не проходит альфа-теста(условия можно задать) он далее не идет по конвейеру рендеринга и не проходит записи в цветовой буфер и буфер глубины. Вроде так...

Цитата:
Каким образом работаете Вы?
Использую DDS и TGA c альфа каналом)
DDS(DXT1 – для дырявых текстур (прозрачно / непрозрачно)) Сжатие 1:8
DDS(DXT5 – тоже для дырявых текстур или для %-прозрачности местами) Сжатия 1:4
TGA 8888 - для дырявых текстур или для %-прозрачности местами. Сжатие 1:1
Альфа-тест делаю в шейдере.
Загрузку TGA-DDS см в gl3texture.pas ниже.
Изображения
Тип файла: jpg Clipboard.jpg (42.4 Кб, 134 просмотров)
Вложения
Тип файла: rar gl3texture.rar (4.1 Кб, 20 просмотров)
Warn вне форума Ответить с цитированием
Старый 03.04.2012, 15:16   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Спасибо огромное.
Цитата:
не в рунтайме лучше заранее приготовить текстуры а в программе просто загрузить их.
Я это и хочу, только полностью управлять загрузкой изображения. Я где-то у Краснова видел.
Код:
procedure TfrmGL.BmpTexture; 
var
Bitmap: TBitmap;
Bits: Array [0..63, 0..63, 0..2] of GLubyte; // массив образа, 64x64 
i, j: Integer; begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('gold.bmp1); // загрузка текстуры из файла
{---заполнение битового массива---}
For i := 0 to 63 do
For ] := 0 to 63 do begin
bits [i, j, 0] := GetRValue(Bitmap.Canvas.Pixels [1,3]); 
bits [i, ;j, 1] := GetGValue(Bitmap.Canvas.Pixels[1,3]); 
bits [i, j, 2] := GetBValue(Ritmap.Canvas.Pixels[1,3]); 
end;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL NEAREST);
glTex!mage2D(GL_TEXTURE_2D, 0, GL_RGBA,
64, 64, // здесь задается размер текстуры
О, GL_RGB, GL_UNSIGNED_BYTE, @Bits); // чтобы цвет объекта не влиял на текстуру 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glEnable (GL__TEXTURE_2D) ; 
Bitmap.Free; 
end;
Вот как-то таким образом.
Цитата:
gl3texture.pas ниже.
А для c++ аналога нет? Многовато переводить придется.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL GBAXA Общие вопросы Delphi 2 30.07.2010 20:39
Текстурирование дерева в сцене OpenGL Miha85193 Мультимедиа в Delphi 0 29.03.2010 18:19
OpenGL Paul_AG Общие вопросы C/C++ 3 02.02.2010 20:28
Определение точки в трехмерной сцене F1Book Мультимедиа в Delphi 0 26.05.2009 11:45
как переключаться между объектами в сцене? lerka Мультимедиа в Delphi 5 19.03.2009 14:45