У меня есть "растровое изображение" в памяти, которое представляет собой всего лишь malloced массив Byte *
, который содержит пиксельные данные в простом формате RGB (поэтому размер массива байтов равен 3 * числу пикселей).
Мое приложение - это просто контроллер вида с экземпляром GLKView
. Я внедрил его делегат следующим образом:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
и, как и ожидалось, это устанавливает цвет фона GLKView.
Теперь я хотел бы добавить код к этой реализации glkView:drawInRect:
, чтобы моя "растровая карта" была отображена в этот GLKView. Но я не могу найти способ сделать это просто; Я немного ошеломлен всеми тем, что может сделать OpenGL, все из которых намного сложнее, чем то, что я пытаюсь сделать здесь.
glReadPixels
кажется вроде бы тем, что я здесь, поскольку он, кажется, предоставляет указатель на данные буфера.
Изменить:, очевидно, это может быть достигнуто только с использованием текстур. Я попытался реализовать это с помощью этого образца кода (обратите внимание, что мой "битмап" здесь составляет 4 байта на образец, соответствующий параметрам формата):
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// raw data
int width = 30;
int height = 30;
int pixelCount = width * height;
int byteSize = pixelCount * 4;
GLubyte *textureData = (GLubyte *)malloc(byteSize);
for (int i = 0; i < byteSize; i++) {
textureData[i] = 255; // white
}
glEnable(GL_TEXTURE_2D);
GLuint textureID;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, textureData);
free(textureData);
}
... , но он не работает. Вызов glClear()
работает так, как ожидалось, и устанавливает весь красный фон; но если я правильно понимаю образцы текстур, то следующий код должен рисовать белый квадрат 30x30 в углу, но все, что я получаю, это сплошной красный фон.
Может ли кто-нибудь определить, что я делаю неправильно здесь?