2015-06-16 3 views
17

Я проверил Xcode 7 с, но мой cocos2d 2.1 игры аварии на тренажере или на устройствах:Coco2d 2,1 и Xcode 7 IOS 9 аварии ccShader

ccShader_PositionColorLenghtTexture_frag.h

2015-06-15 22:36:13.319 NanoWar[18789:456971] cocos2d: ERROR: 0:12: '' : syntax error: #extension must always be before any non-preprocessor tokens 

и

cocos2d: ERROR: 0:26: Invalid call of undeclared identifier 'fwidth' 

Этот класс разбил игру

#extension GL_OES_standard_derivatives : enable                    

#ifdef GL_ES                             
varying mediump vec4 v_color;                        
varying mediump vec2 v_texcoord;                        
#else                              
varying vec4 v_color;                          
varying vec2 v_texcoord;                          
#endif                              

void main()                             
{                               
#ifdef GL_OES_standard_derivatives                       
#if defined GL_OES_standard_derivatives                      
    gl_FragColor = v_color*smoothstep(0.0, length(fwidth(v_texcoord)), 1.0 - length(v_texcoord));       
#else                              
    gl_FragColor = v_color*step(0.0, 1.0 - length(v_texcoord));                
#endif                              
#endif                              
} 
+0

Обсуждение здесь (см ответ Рае): HTTP: //forum.cocos2d-objc .org/t/xcode-7-ios9-beta/17346/6 –

ответ

44

Я «rae» на forum.cocos2d-objc.org, и я мог бы также поставить здесь свой ответ, так как все дороги ведут к StackOverflow. :-)

Если вы используете более раннюю версию Cocos 2D, это может помочь. Я редактировал CCGLProgram.m изменить начало - (BOOL) compileShader: метод Thusly:

#define EXTENSION_STRING "#extension GL_OES_standard_derivatives : enable" 
static NSString * g_extensionStr = @EXTENSION_STRING; 

- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type byteArray:(const GLchar *)source 
{ 
    GLint status; 

    if (!source) 
     return NO; 

    // BEGIN workaround for Xcode 7 bug 
    BOOL hasExtension = NO; 
    NSString *sourceStr = [NSString stringWithUTF8String:source]; 
    if([sourceStr rangeOfString:g_extensionStr].location != NSNotFound) { 
     hasExtension = YES; 
     NSArray *strs = [sourceStr componentsSeparatedByString:g_extensionStr]; 
     assert(strs.count == 2); 
     sourceStr = [strs componentsJoinedByString:@"\n"]; 
     source = (GLchar *)[sourceStr UTF8String]; 
    } 

    const GLchar *sources[] = { 
     (hasExtension ? EXTENSION_STRING "\n" : ""), 
    #ifdef __CC_PLATFORM_IOS 
     (type == GL_VERTEX_SHADER ? "precision highp float;\n" : "precision mediump float;\n"), 
    #endif 
     "uniform mat4 CC_PMatrix;\n" 
     "uniform mat4 CC_MVMatrix;\n" 
     "uniform mat4 CC_MVPMatrix;\n" 
     "uniform vec4 CC_Time;\n" 
     "uniform vec4 CC_SinTime;\n" 
     "uniform vec4 CC_CosTime;\n" 
     "uniform vec4 CC_Random01;\n" 
     "//CC INCLUDES END\n\n", 
     source, 
    }; 
    // END workaround for Xcode 7 bug 

Это хак, но он работает до Xcode 7 беты 2. Надеюсь, что это полезно для кого-то прибегая к помощи это.

Reid

+0

Любая информация о том, как это работает с выпущенным iOS 9? – Jonny

+0

Я по-прежнему использую его с Xcode 7 и iOS 9. –

+4

в случае, если вы также поддерживаете версию iOS до iOS 8.0, а не просто замените [sourceStr containsString: g_extensionStr] на [sourceStr rangeOfString: g_extensionStr] .location!= NSNotFound с - (BOOL) containsString: (NSString *) str NS_AVAILABLE (10_10, 8_0); –

7

Используя принятый ответ выше, но для новых версий cocos2d:

В CCShader.m заменить строки

static GLint 
CompileShaderSources(GLenum type, NSArray *sources) 
{ 

с

#define EXTENSION_STRING "#extension GL_OES_standard_derivatives : enable" 
static NSString * g_extensionStr = @EXTENSION_STRING; 

static NSArray * PrependExtensionIfNeeded(NSArray *sources) 
{ 
    NSMutableArray *mutableSources = [NSMutableArray array]; 

    BOOL hasExtension = NO; 

    for (NSString *source in sources) 
    { 
     NSString *newSource = [source copy]; 
     if([source rangeOfString:g_extensionStr].location != NSNotFound) 
     { 
      hasExtension = YES; 
      NSArray *strs = [source componentsSeparatedByString:g_extensionStr]; 
      newSource = [strs componentsJoinedByString:@"\n"]; 
     } 

     [mutableSources addObject:newSource]; 
    } 

    if (hasExtension) 
    { 
     NSMutableString *firstSource = [NSMutableString stringWithString:[mutableSources firstObject]]; 
     [firstSource insertString:[NSString stringWithFormat:@"%@\n", g_extensionStr] atIndex:0]; 
     [mutableSources replaceObjectAtIndex:0 withObject:firstSource]; 
    } 

    return mutableSources; 
} 

static GLint 
CompileShaderSources(GLenum type, NSArray *sources) 
{ 
    sources = PrependExtensionIfNeeded(sources); 
3

ПРИМЕЧАНИЕ: Хотелось написать это как комментарий, но не имеет достаточной репутации, чтобы написать комментарий, следовательно написав это как ответ:

Исправление, описанное Reid, устраняет проблему. Однако он выходит из строя по КСНО 7 устройств, поскольку она использует containsString метод, который доступен только в прошивке 8 и выше

Простого изменение к следующей строке исправляет проблему:

if([sourceStr containsString:g_extensionStr]) { 

должны быть изменен на:

NSRange range = [sourceStr rangeOfString:g_extensionStr]; 
if(range.length > 0) { 
16

Принятый ответ не работал для меня, но это было сделано.

Перейти в файл с именем CCGLProgram.m

Замените весь метод, названный - (BOOL)compileShader:(CLuint *)shader type(GLenum)typebyteArray:(const GLchar *)source

с этим методом

#define _IPHONE9_0 [[[UIDevice currentDevice] systemVersion] floatValue] == 9.000 

#define EXTENSION_STRING "#extension GL_OES_standard_derivatives : enable" 
static NSString * g_extensionStr = @EXTENSION_STRING; 


- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type byteArray:(const GLchar *)source 
{ 
GLint status; 
if (!source) 
    return NO; 


#ifdef _IPHONE9_0 

NSLog(@"USING IOS9 shaders"); 
// BEGIN workaround for Xcode 7 ios9---- 
BOOL hasExtension = NO; 
NSString *sourceStr = [NSString stringWithUTF8String:source]; 
if([sourceStr containsString:g_extensionStr]) { 
    hasExtension = YES; 
    NSArray *strs = [sourceStr componentsSeparatedByString:g_extensionStr]; 
    assert(strs.count == 2); 
    sourceStr = [strs componentsJoinedByString:@"\n"]; 
    source = (GLchar *)[sourceStr UTF8String]; 
} 

const GLchar *sources[] = { 
    (hasExtension ? EXTENSION_STRING "\n" : ""), 
#ifdef __CC_PLATFORM_IOS 
    (type == GL_VERTEX_SHADER ? "precision highp float;\n" : "precision mediump float;\n"), 
#endif 
    "uniform mat4 CC_PMatrix;\n" 
    "uniform mat4 CC_MVMatrix;\n" 
    "uniform mat4 CC_MVPMatrix;\n" 
    "uniform vec4 CC_Time;\n" 
    "uniform vec4 CC_SinTime;\n" 
    "uniform vec4 CC_CosTime;\n" 
    "uniform vec4 CC_Random01;\n" 
    "//CC INCLUDES END\n\n", 
    source, 
}; 
#else 

NSLog(@"USING IOS8 shaders"); 

const GLchar *sources[] = { 
#ifdef __CC_PLATFORM_IOS 
    (type == GL_VERTEX_SHADER ? "precision highp float;\n" : "precision mediump float;\n"), 
#endif 
    "uniform mat4 CC_PMatrix;\n" 
    "uniform mat4 CC_MVMatrix;\n" 
    "uniform mat4 CC_MVPMatrix;\n" 
    "uniform vec4 CC_Time;\n" 
    "uniform vec4 CC_SinTime;\n" 
    "uniform vec4 CC_CosTime;\n" 
    "uniform vec4 CC_Random01;\n" 
    "//CC INCLUDES END\n\n", 
    source, 
}; 

#endif 


*shader = glCreateShader(type); 
glShaderSource(*shader, sizeof(sources)/sizeof(*sources), sources, NULL); 
glCompileShader(*shader); 

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); 

if(! status) { 
    GLsizei length; 
    glGetShaderiv(*shader, GL_SHADER_SOURCE_LENGTH, &length); 
    GLchar src[length]; 

    glGetShaderSource(*shader, length, NULL, src); 
    CCLOG(@"cocos2d: ERROR: Failed to compile shader:\n%s", src); 

    if(type == GL_VERTEX_SHADER) 
     CCLOG(@"cocos2d: %@", [self vertexShaderLog]); 
    else 
     CCLOG(@"cocos2d: %@", [self fragmentShaderLog]); 

    abort(); 
} 
return (status == GL_TRUE); 
} 
+0

Я использую cocos2d-iphone 2.1. Я думаю, что для вас это отличается, если вы используете последнюю версию cocos2d. –

+0

Большое спасибо: P – zszen

+0

Используется для версии Cocos2d версии 2.1, и это сработало как шарм: D! Благодаря! – Potajedehabichuelas

Смежные вопросы