2013-03-13 25 views
7

我使用this link中的代碼來映​​射人臉紋理。此代碼使用GLKIT來呈現圖像。代碼可以在模擬器中正常工作,但如果我在設備中運行,則代碼不起作用。下面是它在設備中運行的圖像的屏幕截圖,而不是在我的ipad中。GLKit中的紋理映射不適用於設備

碼I用於加載紋理:模擬器的

- (void)loadTexture:(UIImage *)textureImage 
{ 
    glGenTextures(1, &_texture); 
    glBindTexture(GL_TEXTURE_2D, _texture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    CGImageRef cgImage = textureImage.CGImage; 
    float imageWidth = CGImageGetWidth(cgImage); 
    float imageHeight = CGImageGetHeight(cgImage); 
    CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage)); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, 
    GL_UNSIGNED_BYTE, CFDataGetBytePtr(data)); 
} 

圖片:

Output in simulator

在裝置中的相同的代碼給出以下輸出:

Output in Device

有什麼我失蹤了?

+0

可以有人請回答我的問題!! – 2vision2 2013-03-20 03:58:51

+1

檢查:http://stackoverflow.com/a/7952288/2128327 – 2013-03-26 17:10:09

回答

2

我終於屈服了,並切換到GLKTextureLoader正如亞當提到,這是非常堅固

下面是這可能會爲你工作的落實:。

- (void)loadTexture:(NSString *)fileName 
{ 
    NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], 
          GLKTextureLoaderOriginBottomLeft, 
          nil]; 

    NSError* error; 
    NSString* path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil]; 
    GLKTextureInfo* texture = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error]; 
    if(texture == nil) 
    { 
     NSLog(@"Error loading file: %@", [error localizedDescription]); 
    } 

    glBindTexture(GL_TEXTURE_2D, texture.name); 
} 

我會改變它在GitHub上的mtl2opengl項目很快...

+0

感謝您對Ricardo的回答,我會盡力回覆您很快,非常感謝。\ – 2vision2 2013-04-17 03:14:13

3
  1. 使用Apple的內置1行方法加載 - 不要編寫自己的(破壞的)實現!

    https://developer.apple.com/library/mac/#documentation/GLkit/Reference/GLKTextureLoader_ClassRef/Reference/Reference.html#//apple_ref/occ/clm/GLKTextureLoader/textureWithContentsOfFile:options:error


  1. 或者,如果你必須自己做,你有兩個可疑的部分:

    2.1。擺脫這一行:

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    2.2。這條線使用超出範圍的數字,這不是很好:

    glGenTextures(1,& _texture);


  1. 如果由於某種原因,你不能使用蘋果的代碼(例如你要加載在內存中的圖像原始數據),這裏的工作代碼複製/粘貼:

    NSData* imageData = ... // fill this yourself 
    CGSize* imageSize = ... // fill this yourself 
    
    GLuint integerForOpenGLToFill; 
    glGenTextures(1, &integerForOpenGLToFill); 
    
    glBindTexture(GL_TEXTURE_2D, integerForOpenGLToFill); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    
    unsigned char* pixelData = (unsigned char*) malloc([imageData length] * sizeof(unsigned char)); 
    [imageData getBytes:pixelData]; 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize.width, imageSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData); 
    
+0

你確定你的修復@Adam?我寫了原始紋理加載代碼和用另一個應用程序中的建議代替它,但結果更糟糕。我不是OpenGL的專家,所以我的實現可能仍然是錯誤的,但是這個代碼也沒有工作。儘管如此,還是請求超出範圍的數字。 – 2013-04-02 15:20:40

+0

這裏是我的結果使用兩種方法[不同的應用程序,iPhone模擬器W /視網膜顯示]的[截圖](http://i.imgur.com/pSVWEGr.png)。 – 2013-04-02 15:36:05

+0

@RicardoRendonCepeda哪位?我的主要建議是使用Apple的代碼,因爲它的工作原理!總是! – Adam 2013-04-03 15:51:49

2

查看屏幕截圖......我想知道問題是否是從iPhone到iPad?

即視網膜到非視網膜?

在我看來,像你的圖片加載可能是忽略視網膜比例尺,使紋理貼圖在iPad上「2倍太大」。

使用Apple的方法(我的其他答案)應該自動修復,但如果不能:您可以嘗試製作兩個圖像副本,一個爲當前尺寸(名爲「[email protected]」),另一個爲半尺寸(在photoshop/preview.app/etc中調整大小)(名爲「image」。PNG「)

+0

感謝您的回覆。問題出在模擬器和設備之間。我的模擬器它的工作原理和它在設備中沒有:( – 2vision2 2013-04-02 12:28:05

+0

如果您使用RETINA simualator與非RETINA模擬器會發生什麼?(使用硬件菜單進行切換) – Adam 2013-04-02 13:59:28