Подтвердить что ты не робот

GLKTexture неправильно отображается, поскольку iOS6

У меня странное поведение с Xcode 4.5 и iOS 6 SDK при использовании текстур на моих 3D-объектах. Проблема также появляется в моем приложении Mac при создании против OS X 10.8 SDK.

Я использую OpenGL ES 2.0 в iOS и устаревшем профиле OpenGL (< 3.0) на OS X 10.8.

Текстуры больше не помещаются в правильные координаты, и у меня много артефактов. VAO правильно загружены, и они хорошо выглядят без текстурирования. При использовании XCode 4.4.1 и iOS 5.1 SDK все в порядке.

VAO - это точно то же самое (проверено с помощью захвата кадра OpenGL ES), а также форматы текстур привязаны правильно.


Xcode 4.4 Обзор VAO

Xcode 4.4

Xcode 4.5 Обзор VAO

Xcode 4.5

XCode 4.4.1 (iOS 5.1 SDK)

iOS Simulator 5.1 SDK

XCode 4.5 (iOS 6 SDK)

iOS Simulator 6.0 SDK


Фрагмент кода/шейдера

Соответствующие части для загрузки и обработки текстуры. Мне пришлось раздеть шейдеры к миниуму.

Vertex shader

precision highp float;
attribute vec2 a_vTextureCoordinate;
uniform mat4 u_mModelViewMatrix;
uniform mat4 u_mModelViewMatrixInverse;
uniform mat4 u_mProjectionMatrix;
uniform mat4 u_mNormalMatrix;
void main()
{
....

    // Transform output position 
    gl_Position = u_mProjectionMatrix * u_mModelViewMatrix * a_vPosition;
    // Pass through texture coordinate v_texcoord = a_vTextureCoordinate.xy;
    v_vPosition = vec3(u_mModelViewMatrix * a_vPosition);
    v_vTextureCoordinate = a_vTextureCoordinate.xy;
    ....
}

Фрагментный шейдер

precision highp float;
// location 1
uniform sampler2D u_diffuseTexture;
varying vec2 v_vTextureCoordinate;
varying vec3 v_vPosition;
....
void main() {
    ....
    vec4 base = texture2D(u_diffuseTexture, v_vTextureCoordinate);
    gl_FragColor = base;
    ....
}

Загрузка текстуры

    NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft: @(YES), [NSNumber numberWithBool:YES] : GLKTextureLoaderGenerateMipmaps};
    NSError *error;
    path = [path stringByReplacingOccurrencesOfString:@"/" withString:@""];
    path = [[NSBundle mainBundle] pathForResource:[path stringByDeletingPathExtension] ofType:[path pathExtension]];
    GLKTextureInfo *texture = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];

Render loop (только отправка равномерной активной текстуры)

....
    [self setShaderTexture:[[materials objectForKey:@"diffuse"] objectForKey:@"glktexture"]
                    forKey:@"u_diffuseTexture"
             withUniform1i:0
            andTextureUnit:GL_TEXTURE0+0];
....

#pragma mark - Texture communication

-(void)setShaderTexture:(GLKTextureInfo*)texture forKey:(NSString*)key withUniform1i:(int32_t)uniform andTextureUnit:(int32_t)unit {
    glActiveTexture(unit);
    glBindTexture(texture.target, texture.name);
    [self.shaderManager sendUniform1Int:key parameter:uniform];
}

У кого-нибудь была близкая проблема с моей iOS 6?

4b9b3361

Ответ 1

Вы должны сообщить об ошибке bugreport.apple.com, как уже упоминалось. В стороне, если вы предполагаете, что GLKTextureLoader, возможно, проблема (кажется хорошей теорией), то вы можете сузить вещи одним из двух способов с моей головы...

1) Я бы продемонстрировал текстуру, показанную на тривиальном квадранте, и посмотрел, являются ли результаты рендеринга ожидаемыми, т.е. отображает ли он вертикальное отражение от того, что вы ожидаете? Исходная текстура частично искажена каким-то образом, чего вы не ожидали?

2) Вы можете попробовать преобразовать свое изображение в другой размер/цветную глубину/тип изображения и посмотреть, существует ли проблема. Я думаю, и это кажется маловероятным, но, возможно, это не сообщается, потому что вы сталкиваетесь с необычным случаем края из-за чего-то с форматом изображения. Знание этого было бы огромной помощью для тех, кто пытается исправить это в яблоке.

Вероятно, не так много, но без доступа ко всем источнику и активам довольно сложно понять, что предложить. FWIW, у меня есть несколько примеров, которые похожи на то, что вы делаете, и ничего не заметили в GLKit v. 10.8.