2014-01-05 2 views
2

Я новичок в SDL/SDL2, с небольшим опытом работы в C/C++, некоторые с pygame, pyglet и PySide, и теперь я пытаюсь PySDL2 найти более быструю альтернативу Processing. Обработка предназначена для рисования, но есть простой API for direct pixel works.SDL2 пиксельный графический конвейер

Я начал с PySDL2 только вчера и провел целый день, написав шаблонный код, чтобы реализовать простой алгоритм пожара. Некоторые могут смеяться над ним - всего один день - но я думаю, что для графической библиотеки важно, чтобы вы могли что-то с этим сделать за один день. Моя проблема - плохой опыт работы на C/C++, а соответствующий API PySDL2 - mostly direct mapping to C API, поэтому из-за трудностей, связанных с терминологией и спецификой C, сложно найти все детали. Я отказался от простого обзора графического конвейера SDL2.

Графический контур - это путь, по которому байты и/или целые числа становятся пикселями на экране. Например, изображение высокого уровня для OpenGL находится здесь - http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html - и я ищу более подробное изображение трубопровода в SDL2.

Основная сложность с пониманием того, как пиксель рисуется в SDL2, заключается в том, что SDL2 API предоставляет полезные помощники, которые скрывают эти детали низкого уровня. Как вы загружаете растровое изображение и получаете поверхность. Затем вы перемещаете поверхность по текстуре. Затем SDL2 каким-то образом перемещает текстуру в видеопамять. Затем говорит GPU, чтобы показать его на экране. Это не то, как я это понял, но нет ссылки, которую я могу дать вам там, где она была упомянута. Так, это:

[data array] --> [pixel array] --> [surface] --> [texture] --> [video memory] ┐ 
                       | 
    ..made with uglihunds ascii editor..       [screen] <-┘ 
    (which haz no graphics pipeline) 

И для моего применения это должно выполняться 25 раз в секунду. Когда я пишу это на Python, мне действительно нужно знать, какой конвейер должен решить, где оптимизировать. Но я не уверен, что конвейер верен, и я немного потерял внутри API - есть много помощников, и я не знаю, даже есть отправная точка, как мои рассчитанные пиксельные данные могут и должны выглядеть.

Так что мне нужно знать:

  1. какие виды входных данных, которые SDL2 поддерживает (BMP, указатель памяти, и т.д.)
  2. есть промежуточный формат данных, к которым вход преобразуется
  3. , что это преобразование данных цепь
  4. как управляется цепью преобразования
  5. какие виды продукции, что SDL2 поддерживает

  6. Как это должно выглядеть в PySDL2

Существует также this question downvoted кто-то, что говорит мне, что я не одинок в своих неурядицах.

ОБНОВЛЕНИЕ:

Как было отмечено, @Ancurio объекта поверхности в уже массив пикселей и массива данных, поэтому я изменение диаграммы и обеспечивают определение, что поверхность представляет собой матрицу пикселов.

[bitmap] ----┐ 
[int array] -┴-> [surface] --> [texture] --> [video memory] --> [screen] 

Таким образом, в основном поверхность является 1. непрерывной памятью с пиксельными данными, 2. информацией о пикселях. bitmap - это также пиксельный массив, который вы загружаете с диска или с изображения.Но SDL2 не может использовать его напрямую. Зачем?

Вопрос для первого шага конвейера заключается в том, как int и растровые пиксели преобразуются в поверхностные пиксели и как поверхность отличается от растрового изображения? Я использую Python, где нет очевидного прямого доступа к памяти, и мне нужно выяснить, какие у меня варианты.

+0

Шаг «текстура -> видеопамять» лишний, поскольку текстура, скорее всего, уже находится в VRAM. Кроме того, я не уверен в первых трех шагах? Поверхность представляет собой массив пикселей, представляющий собой массив данных. Шаг, предшествующий этому, будет только загружать/декомпрессировать изображение с диска. – Ancurio

+0

@ Анкурио, спасибо. Думая об этом, я немного расстроился в своей голове. Я добавил обновление к вопросу. –

ответ

2

Если вы делаете это в первый раз, возможно, вам следует больше сосредоточиться на большой картине (то есть графическом конвейере) и сосредоточиться на выполнении того, что вы хотите сделать (доступ к пикселям).

У меня была своя доля путаницы в этой теме, когда я изучал SDL2 после того, как был использован для старого SDL (my own question). Оказывается, решение находится в Migration Guide. Вам нужно использовать SDL_TEXTUREACCESS_STREAMING, а затем вы можете напрямую манипулировать пикселями.

В этот момент вам даже не нужно беспокоиться о поверхностях. Вам просто нужно обновить пиксели в текстуре и загрузить их в видеопамять (используя SDL_RenderPresent() и другие сопутствующие вызовы).

+0

Хорошо, когда вы знаете хотя бы что-то. Если вы начинаете с нуля, крайне важно сначала получить обзор. –

+0

Возможно, эта статья может помочь вам немного: http://www.programmersranch.com/2013/11/sdl2-displaying-image-in-window.html. Он занимается загрузкой изображений, а не доступом к пикселям, но это делает коснитесь большей картины. – Gigi

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