2009-12-08 1 views
2

Я пытаюсь найти наиболее эффективный способ альфа-смеси в SDL. Мне не хочется возвращаться и переписывать код рендеринга вместо OpenGL (который я читал намного эффективнее с альфа-смешиванием), поэтому я пытаюсь выяснить, как я могу получить большинство соков из альфа-альфа-альфа смешивания.Как сделать аппаратное ускорение альфа-смешивания в SDL?

Я читал, что могу воспользоваться аппаратными поверхностями, но это означает, что мне нужно запустить игру в полноэкранном режиме. Может кто-нибудь прокомментировать это? Или что-нибудь еще относительно альфа-прозрачности в SDL?

+0

Похоже SDL 2 поддерживает его: https://wiki.libsdl.org/SDL_SetTextureBlendMode/HTTP: //lazyfoo.net/tutorials/SDL/13_alpha_blending/index.php –

ответ

0

Решил просто не использовать альфа-смешение для этой части. Смешение пикселей слишком велико для программных поверхностей, и OpenGL необходим, когда вы хотите использовать свое оборудование.

3

Я когда-то играл с аппаратными поверхностями sdl, и это было не самое приятное впечатление. SDL действительно прост в использовании, но когда он добирается до эффективности, вы должны действительно придерживаться того, что было специально разработано для такой задачи. OpenGL - хороший выбор здесь. Вы всегда можете комбинировать SDL (управление окнами и событиями) с openGL (графикой) и использовать некоторые из уже написанного кода.

Вы можете найти некоторую информацию об аппаратных поверхностях here и here

0

Использование OpenGL с SDL. Приятно познакомиться с библиотекой GL (в наши дни я почти не вижу возможности использования без графического ускорения, даже графические интерфейсы используют его сейчас). SDL_image имеет возможность проверить альфа-канал. Моя функция, которая создает текстуру из пути к файлу изображения (использует IMG_Load SDL_image() функция) имеет следующее:

// if we successfully open a file 
// do some gl stuff then 
SDL_PixelFormat *format = surface->format; 

int width, height; 
width = pow2(surface->w); 
height = pow2(surface->h); 

SDL_LockSurface(surface); // Call this whenever reading pixels from a surface 

/* Check for alpha channel */ 
if (format->Amask) 
    glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels); 
else 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels); 

SDL_UnlockSurface(surface); 

pow2() просто округляет число до следующей ближайшей мощности 2. Много видеокарт в настоящее время может обрабатывать немощные 2 значения для размеров текстур, но, насколько я могу судить, они определенно НЕ оптимизированы для него (проверенные рамки). Другие видеокарты просто отказываются оказывать, ваше приложение может произойти сбой, и т.д. и т.п.

код здесь: http://www.tatsh.net/2010-06-19/using-sdlimage-and-sdlttf-opengl

Смежные вопросы