Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Как продырявить текстуру OpenGL? |
Философия, технологии, алгоритмы! |
|
Опции темы |
25.02.2010, 13:08 | #1 |
Форумец
Сообщений: 56
Регистрация: 06.11.2006
Возраст: 39
Не в сети |
Как продырявить текстуру 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
Не в сети |
Во-первых, если нужна производительность - советую забыть про все glGet* кроме glGetError. Если нужно получать доступ к данным текстуры, и эти данные рассчитываются на CPU - лучше хранить их копию в системной памяти.
Теперь почему возвращается INVALID_ENUM. Насколько я понимаю, в tex->texture лежит ID, полученный с помощью glGenTextures? Если это так - то понятно, откуда ошибка. В glTexImage2D (как и glGetTexImage) первым параметром передается не ID текстуры, а "точка привязки", т.е. например GL_TEXTURE_2D. И работа идет с той текстурой, которая была туда ранее привязана командой glBindTexture. Т.е. по идее, чтобы ваш код заработал, нужно исправить Цитата:
Цитата:
А, еще вдогонку. Если текстура RGBA 8 бит на канал, то в видеокарту рекомендуется ее заливать как GL_BGRA, потому что именно в таком виде оно хранится в видеопамяти. И если данные сразу давать в таком виде, то драйверу не надо будет делать дополнительных перестановок. |
||
25.02.2010, 17:30 | #3 |
Форумец
Сообщений: 113
Регистрация: 09.09.2008
Возраст: 40
Не в сети |
это, вообще говоря, не правда. данные драйвер будет так и эдак кукожить, потому что не свизленные текстуры очень медленные. современное железо умеет в том или ином виде делать свизлинг и на фетче. т.е. ргба станет бгра бесплатно, просто настройка регистрика в видеокарте
|
25.02.2010, 17:38 | #4 |
не исключающее или
Сообщений: 874
Регистрация: 07.03.2003
Не в сети |
lukas, по крайней мере для NV-железа 2005 года так:
http://download.nvidia.com/developer..._Transfers.pdf На более современном NV-железе (8800/9800) - то же самое, проверял. На ATI и Intel возможно по другому. |
26.02.2010, 06:59 | #6 |
не исключающее или
Сообщений: 874
Регистрация: 07.03.2003
Не в сети |
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 |
Форумец
Сообщений: 56
Регистрация: 06.11.2006
Возраст: 39
Не в сети |
Xop, спасибо большое!...) я был уверен что в glGetTexImage надо id от glGenTexture пихать..%)
Anyway, поразмыслив пока решил, действительно, все в системной памяти делать, как то оно попроще будет... А может шейдер написать?...)))) |
09.03.2010, 00:20 | #8 |
Форумец
Сообщений: 2,159
Регистрация: 15.01.2003
Не в сети |
А не проще добавить пару треугольников в поверхность и центральной вершине сделать прозрачную альфу? Производительность будет не на порядок, а на порядки больше. Опять же шейдеры есть.Чай не GF2MX400 на дворе. Производительность тоже не сильно пострадает.
|