2010-04-26 139 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

可能應該說,我知道上述情況,即使它的工作效率非常低下,而且它的一些甚至不應該在渲染循環中。這只是爲了簡單起見,讓它工作。 – 2010-04-26 13:45:53

回答

3

問題是widthheight不是兩個冪。有兩種解決方案:

  • 使用紋理矩形擴展。將紋理目標設置爲GL_TEXTURE_RECTANGLE_ARB而不是GL_TEXTURE_2D。在使用之前,您必須啓用此擴展。請注意,矩形紋理不支持mipmap。
  • 使用紋理尺寸的兩個冪。
+0

'GL_TEXTURE_RECTANGLE_ARB'似乎不包含在iOS 6.0中。 – Justin 2012-12-05 02:25:45

+0

@Justin:這個問題已經兩歲了。 http://stackoverflow.com/questions/11069441/non-power-of-two-textures-in-ios – 2012-12-05 05:12:28