2010-04-26 2 views
2

Я выполнение следующего, что я вывел из нескольких различных обучающих программ (Только один проход рендеринга, код инициализации не отображается, но работает отлично нетекстурированные примитивы):OpenGL ES; рендеринг текстуры, созданная из CGBitmapContext

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(0, xSize, 0, ySize, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
glEnable(GL_TEXTURE_2D); 
glBlendFunc(GL_ONE, GL_SRC_COLOR); 

GLuint texture[1]; 
glGenTextures(1, &texture[0]); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

int width = 50; 
int height = 50; 
void* textureData = malloc(width * height * 4); 
CGColorSpaceRef cSp = CGColorSpaceCreateDeviceRGB(); 
CGContextRef ct = CGBitmapContextCreate(textureData, width, height, 8, width*4, cSp, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGContextSetRGBFillColor(ct, 0, 1, 0, 1); 
CGContextFillRect(ct, CGRectMake(0, 0, 50, 50)); 
CGContextRelease(ct); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

float verts[] = { 
0.0f, 0.0f, 0.0f, 
50.0f, 0.0f, 0.0f, 
0.0f, 50.0f, 0.0f, 
50.0f, 50.0f, 0.0f 
}; 

float texCords[] = { 
0.0f, 0.0f, 
1.0f, 0.0f, 
0.0f, 1.0f, 
1.0f, 1.0f 
}; 

glVertexPointer(3, GL_FLOAT, 0, verts); 
glTexCoordPointer(2, GL_FLOAT, 0, texCords); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glDisable(GL_TEXTURE_2D); 

Результат это белый квадрат. Не зеленый, как предполагалось. Может ли кто-нибудь обнаружить ошибку (ошибки) в моем коде, что приводит к ее «отказу от рендеринга?

Я надеюсь получить эту работу, а затем переместить ее в текстовый рендеринг.

+0

Должен, наверное, сказать, что я знаю выше, даже если он работает, это ужасно неэффективно и что некоторые из них не должны быть даже в цикле рендеринга. Это просто для простоты и работы. –

ответ

3

Проблема в том, что width и height не являются полномочиями двух. Существует два решения:

  • Используйте расширение прямоугольника текстуры. Задайте цель текстуры GL_TEXTURE_RECTANGLE_ARB вместо GL_TEXTURE_2D. Вам нужно будет включить это расширение перед его использованием. Обратите внимание, что текстуры прямоугольника не поддерживают mipmaps.
  • Используйте силу двух для размеров текстуры.
+0

'GL_TEXTURE_RECTANGLE_ARB' не входит в состав iOS 6.0. – Justin

+0

@ Justin: Этот вопрос - два года. http://stackoverflow.com/questions/11069441/non-power-of-two-textures-in-ios –