Такой вопрос: хочу продырявить текстуру, т.е. произвольным пикселям назначить альфу ноль.
Вся идея состояла в том, что бы 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;
}
}
}
GL_ALPHA_BLENDING is enabled, и текстура 2Dшная...
В чем проблема?
P.S. А вообще приму любой совет, как это ( дырку в текстуре ) можно оргаинзавать.
[Ответ]
Xop 14:40 25.02.2010
Во-первых, если нужна производительность - советую забыть про все 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, потому что именно в таком виде оно хранится в видеопамяти. И если данные сразу давать в таком виде, то драйверу не надо будет делать дополнительных перестановок.
[Ответ]
lukas 17:30 25.02.2010
Сообщение от Xop:
А, еще вдогонку. Если текстура RGBA 8 бит на канал, то в видеокарту рекомендуется ее заливать как GL_BGRA, потому что именно в таком виде оно хранится в видеопамяти. И если данные сразу давать
это, вообще говоря, не правда. данные драйвер будет так и эдак кукожить, потому что не свизленные текстуры очень медленные. современное железо умеет в том или ином виде делать свизлинг и на фетче. т.е. ргба станет бгра бесплатно, просто настройка регистрика в видеокарте
[Ответ]
На более современном NV-железе (8800/9800) - то же самое, проверял. На ATI и Intel возможно по другому.
[Ответ]
lukas 22:46 25.02.2010
проверял что и как? железо работает примерно как я написал. можно почитать в разных странных местах - например доках хбокс1 или хбокс360 или пс3 или амд открыли спеки р600 и выше.
[Ответ]
Xop 06:59 26.02.2010
lukas, проверял, что если внутренний формат текстуры GL_RGBA8, то заливка из исходного формата GL_RGBA примерно в 3-4 раза медленнее, чем из GL_BGRA. Время в тестовой программе измерял - через EXT_timer_query. И в основной программе субъективно подгрузка текстур из BGRA происходила явно быстрее. Передавал через pixel_unpack_buffer. Охотно верю, что в железе свизлы бесплатные, но что тормоза были - это я точно помню. Хотя дело было примерно 1.5-2 года назад, возможно дело в кривости драйвера.
[Ответ]
Roont 09:50 26.02.2010
Xop, спасибо большое!...) я был уверен что в glGetTexImage надо id от glGenTexture пихать..%)
Anyway, поразмыслив пока решил, действительно, все в системной памяти делать, как то оно попроще будет...
А может шейдер написать?...))))
[Ответ]
Akad 00:20 09.03.2010
А не проще добавить пару треугольников в поверхность и центральной вершине сделать прозрачную альфу? Производительность будет не на порядок, а на порядки больше. Опять же шейдеры есть.Чай не GF2MX400 на дворе. Производительность тоже не сильно пострадает.
[Ответ]