2011-08-17 4 views
1

UIView를 반복적으로 OpenGL 텍스처로 렌더링합니다. 장치에서 문제가 없습니다. 예상대로 텍스처가 업데이트됩니다. 시뮬레이터에서 텍스쳐는 처음에는 정확합니다 (정확한 알파와 컬러). 그러나 텍스쳐에 대한 후속 업데이트는 기존 텍스쳐를 대체하는 대신 기존 텍스쳐와 결합하여 (마치 기존 텍스쳐에 붙여 넣은 것처럼) 점진적으로 엉망진창을 만듭니다.대체 대신 OpenGL ES 텍스처 결합 (시뮬레이터가 아닌 장치에서 작동)

일부 (아마도) 관련 상황 : 나는 OpenGL을 ES 1.1

  • 내가 2007 MBP에 OSX 10.6.8에 엑스 코드 4.0.2 (4A2002a 빌드)를 실행하고있어 사용하고

    • (라데온 X1600 비디오)
    • 이 프로젝트는 아이폰 OS SDK 4.3을 사용하고 배포 대상은 다음

    (같은 코드는 초기에 대한 렌더링 및 후속 업데이트 책임이있는 텍스처보기를 렌더링하는 코드입니다 iOS 4.0 버전)입니다 .

    // render UIView to pixel buffer 
    GLubyte *pixelBuffer = (GLubyte *)malloc(4 * width * height); 
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pixelBuffer, width, height, 8, 4 * width, colourSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colourSpace); 
    [view.layer renderInContext:context]; 
    
    // replace OpenGL texture with pixelBuffer data 
    glBindTexture(GL_TEXTURE_2D, textureId); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer); 
    

    처음에는 시뮬레이터와 장치의 차이에 대해 걱정하지 않았지만 시뮬레이터를 사용하여 교육용 비디오를 만들어야합니다.

    나 자신 비슷한 문제를 건너 왔어요

  • 답변

    1

    (흥미롭게도 덮어 쓰기 시뮬레이터 장치가 아이폰 (망막)로 설정된 경우보다 아이폰으로 설정되어 추가 RGB 노이즈가 있습니다). 왜 시뮬레이터와 디바이스 사이에 구현에 차이가 있는지 모르지만, 내가 찾은 바는 픽셀 버퍼가 사용되기 전에 픽셀 버퍼가 제로화되었는지 확인하는 것이었다. 로드하는 텍스처에 완전히 투명한 픽셀이있는 경우 시뮬레이터에서 해당 픽셀의 값을 설정하지 않아도됩니다.

    그래서 메모리를 0으로 초기화해야하는 malloc 대신 calloc을 사용해보십시오. 즉, 뭔가 같은 ...

    GLubyte *pixelBuffer = (GLubyte *)calloc(4 * width * height, sizeof(GLubyte)); 
    

    ... 또는 memset 함수 ...

    GLubyte *pixelBuffer = (GLubyte *)malloc(4 * width * height); 
    memset(pixelBuffer, 0, 4 * width * height); 
    
    +0

    덕분에, 나는 조건부 컴파일 지시문 (참조에 memset 함수를 포장 결국 (HTTP [SO 865377 답변] : //stackoverflow.com/questions/864920/conditional-compile-when-running-in-simulator-as-opposed-to-on-a-device/865377#865377)). 이제는 대접을받습니다. 시간 제한 리프트가 만료되는 즉시 그 현상금을 할당 해 드리겠습니다. –

    관련 문제