2013-09-04 4 views
4

Я обрабатываю SVG, используя Каир. Выходной формат Cairo - ARGB. Затем я помещаю визуализированное изображение в SDL_Surface, поэтому я могу использовать его как текстуру openGL.Как использовать цвет ARGB в opengl/SDL?

Полученное изображение выглядело просто отлично, когда я использую непосредственно SDL_Surface. Но мне пришлось использовать поверхность как текстуру в openGL, потому что мне нужна была функция openGL. Проблема в том, что весь цвет перевернулся. OpenGL использует RGBA, а не ARGB.

Мне было интересно, может ли кто-нибудь помочь мне преобразовать ARL в SDL_Surface в RGBA.

Полезная информация:
Я использовал этот учебник для визуализации моего SVG. http://tuxpaint.org/presentations/sdl_svg_svgopen2009_kendrick.pdf
Моя программа написана на C.

EDIT: Я использовал этот учебник, чтобы использовать SDL_Surface как OPENGL текстуры.
http://www.sdltutorials.com/sdl-tip-sdl-surface-to-opengl-texture

Как процесс рендеринга, так и текстура opengl такие же, как и учебные пособия.

+0

Вам нужно будет показать нам ваш код OpenGL. –

+0

"* Затем я помещаю визуализированное изображение в SDL_Surface, поэтому я могу использовать его как текстуру openGL. *« Вы знаете, что OpenGL имеет функции для загрузки самих данных текстуры, правильно? У вас нет * * использовать SDL для него. –

+0

Я мог бы отобразить svg в Каире и напрямую применить его к текстуре openGL? Это был бы лучший вариант. @Luka, код довольно большой, я думал, что ссылок tuxpaint будет достаточно, так как рендеринг на поверхность будет тем же. Но проблема в том, что Каир использует ARGB. Я не думаю, что могу много поделать. – user1586263

ответ

11

Судя по вашему Tux пример кода, вы можете пропустить SDL полностью и кормить OpenGL пиксельные данные вручную, используя следующий код:

GLuint tex; 

glGenTextures (1, &tex); 
glBindTexture (GL_TEXTURE_2D, tex); 

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image); 

Важные детали здесь являются GL_BGRA format for the pixel data и GL_UNSIGNED_INT_8_8_8_8_REV data type (это меняет порядок каналов во время операций передачи пикселей). OpenGL позаботится о преобразовании данных пикселя в соответствующий формат texel для вас. OpenGL ES, с другой стороны, не будет этого делать; чтобы сделать этот перенос, вы можете захотеть преобразовать данные пикселей в RGBA или BGRA самостоятельно ...

+0

Привет, спасибо за ваш ответ, он сработал + сделал некоторую оптимизацию. Ты восхитителен! – user1586263

+0

Поскольку это решило вашу проблему, было бы неплохо, если бы вы могли отметить ее как принятый ответ. – legends2k

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