Старый 25.02.2010, 13:08   #1   
Форумец
 
Аватар для Roont
 
Сообщений: 56
Регистрация: 06.11.2006
Возраст: 39

Roont вне форума Не в сети
Как продырявить текстуру OpenGL?

доброго времени суток!

Такой вопрос: хочу продырявить текстуру, т.е. произвольным пикселям назначить альфу ноль.
Вся идея состояла в том, что бы glGetTexImage выдавал мне пиксели, я им по bmpшной маске обнулял альфу и glTexImage или glTexSubImage запихивал бы обратно в фрамебуфер.
На первый взгляд все логично, но glGetError после glGetTexImage() дает GL_INVALID_ENUM, что бы я не делал..


COLOR* pixels = new COLOR [ tex->m_nRealW * tex->m_nHeight ];
glGetTexImage( tex->texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
int err = glGetError();// 1280 всегда ...%)


for ( int x = 0; x < pen->Size().cx; x ++ )
{
for ( int y = 0; y < pen->Size().cy; y ++ )
{
POINT inmask_pt = {x,y};
if ( 0x00000000 != pen->Get( inmask_pt ) ) // pen- bmpешка, рисуем по белому
{
pixels[ ( pt.x + x ) + tex->m_nWidth * ( pt.y + y ) ] &= 0xffffff00;
}
}
}

glTexImage2D( tex->texture, 0, GL_RGBA8, tex->m_nRealW, tex->m_nRealH, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );



err = 1280 ( INVALID_ENUM );

GL_ALPHA_BLENDING is enabled, и текстура 2Dшная...
В чем проблема?
P.S. А вообще приму любой совет, как это ( дырку в текстуре ) можно оргаинзавать.
  Ответить с цитированием
Старый 25.02.2010, 14:40   #2   
не исключающее или
 
Сообщений: 874
Регистрация: 07.03.2003

Xop вне форума Не в сети
Во-первых, если нужна производительность - советую забыть про все glGet* кроме glGetError. Если нужно получать доступ к данным текстуры, и эти данные рассчитываются на CPU - лучше хранить их копию в системной памяти.

Теперь почему возвращается INVALID_ENUM. Насколько я понимаю, в tex->texture лежит ID, полученный с помощью glGenTextures? Если это так - то понятно, откуда ошибка. В glTexImage2D (как и glGetTexImage) первым параметром передается не ID текстуры, а "точка привязки", т.е. например GL_TEXTURE_2D. И работа идет с той текстурой, которая была туда ранее привязана командой glBindTexture. Т.е. по идее, чтобы ваш код заработал, нужно исправить
Цитата:
glGetTexImage( tex->texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
на
Цитата:
glBindTexture( GL_TEXTURE_2D, tex->texture );
glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
Ну и аналогично исправить место с glTexImage2D.

А, еще вдогонку. Если текстура RGBA 8 бит на канал, то в видеокарту рекомендуется ее заливать как GL_BGRA, потому что именно в таком виде оно хранится в видеопамяти. И если данные сразу давать в таком виде, то драйверу не надо будет делать дополнительных перестановок.
  Ответить с цитированием
Старый 25.02.2010, 17:30   #3   
Форумец
 
Сообщений: 113
Регистрация: 09.09.2008
Возраст: 40

lukas вне форума Не в сети
Цитата:
Сообщение от Xop Посмотреть сообщение
А, еще вдогонку. Если текстура RGBA 8 бит на канал, то в видеокарту рекомендуется ее заливать как GL_BGRA, потому что именно в таком виде оно хранится в видеопамяти. И если данные сразу давать
это, вообще говоря, не правда. данные драйвер будет так и эдак кукожить, потому что не свизленные текстуры очень медленные. современное железо умеет в том или ином виде делать свизлинг и на фетче. т.е. ргба станет бгра бесплатно, просто настройка регистрика в видеокарте
  Ответить с цитированием
Старый 25.02.2010, 17:38   #4   
не исключающее или
 
Сообщений: 874
Регистрация: 07.03.2003

Xop вне форума Не в сети
lukas, по крайней мере для NV-железа 2005 года так:
http://download.nvidia.com/developer..._Transfers.pdf

На более современном NV-железе (8800/9800) - то же самое, проверял. На ATI и Intel возможно по другому.
  Ответить с цитированием
Старый 25.02.2010, 22:46   #5   
Форумец
 
Сообщений: 113
Регистрация: 09.09.2008
Возраст: 40

lukas вне форума Не в сети
проверял что и как? железо работает примерно как я написал. можно почитать в разных странных местах - например доках хбокс1 или хбокс360 или пс3 или амд открыли спеки р600 и выше.
  Ответить с цитированием
Старый 26.02.2010, 06:59   #6   
не исключающее или
 
Сообщений: 874
Регистрация: 07.03.2003

Xop вне форума Не в сети
lukas, проверял, что если внутренний формат текстуры GL_RGBA8, то заливка из исходного формата GL_RGBA примерно в 3-4 раза медленнее, чем из GL_BGRA. Время в тестовой программе измерял - через EXT_timer_query. И в основной программе субъективно подгрузка текстур из BGRA происходила явно быстрее. Передавал через pixel_unpack_buffer. Охотно верю, что в железе свизлы бесплатные, но что тормоза были - это я точно помню. Хотя дело было примерно 1.5-2 года назад, возможно дело в кривости драйвера.
  Ответить с цитированием
Старый 26.02.2010, 09:50   #7   
Форумец
 
Аватар для Roont
 
Сообщений: 56
Регистрация: 06.11.2006
Возраст: 39

Roont вне форума Не в сети
Xop, спасибо большое!...) я был уверен что в glGetTexImage надо id от glGenTexture пихать..%)

Anyway, поразмыслив пока решил, действительно, все в системной памяти делать, как то оно попроще будет...
А может шейдер написать?...))))
  Ответить с цитированием
Старый 09.03.2010, 00:20   #8   
Форумец
 
Сообщений: 2,159
Регистрация: 15.01.2003

Akad вне форума Не в сети
А не проще добавить пару треугольников в поверхность и центральной вершине сделать прозрачную альфу? Производительность будет не на порядок, а на порядки больше. Опять же шейдеры есть.Чай не GF2MX400 на дворе. Производительность тоже не сильно пострадает.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind