Как использовать glGenTextures - PullRequest
4 голосов
/ 19 июля 2011

В C я бы сделал следующее:

GLuint a;
glGenTextures(1, &a);

Тип glGenTextures в Хаскеле:

GLsizei -> Ptr GLuint -> IO ()

Как я могу получить значение типа Ptr GLuint?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Прежде всего, я хотел бы отметить, что привязки Haskell OpenGL имеют высокоуровневое воплощение , что не требует от пользователя ручного управления памятью .

Как правило, для любого типа Storable a можно получить блок памяти, достаточный для хранения n элементов указанного типа с mallocArray.Результат mallocArray имеет тип Ptr a;как и в C, вы должны использовать free, чтобы впоследствии освободить выделенное пространство памяти.Вы также можете использовать allocaArray для временного выделения памяти (эквивалент выделения стека в C).Вот как библиотека OpenGL использует allocaArray в сочетании с glGenTextures:

   genObjectNames n =
      allocaArray n $ \buf -> do
        glGenTextures (fromIntegral n) buf
        fmap (map TextureObject) $ peekArray n buf

Более подробную информацию по этим темам можно найти в Haskell Wiki .

2 голосов
/ 20 июля 2011

Я думаю, что точный перенос:

GLuint a;
glGenTextures(1, &a);

Is:

import Foreign.Marshal.Utils( with )

with a $ \dir_a -> glGenTextures 1 dir_a

Если вам нужно передать массив, вы можете использовать withArray, чтобы получить список, изарезервируйте и инициализируйте буфер с этим списком.Также allocaArray может создать для вас буфер без его инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...