2015-06-16 32 views
17

Testowałem 7 z Xcode, ale moja Cocos2d zderzeniowych 2.1 gry na symulatorze lub na urządzeniach:Coco2d 2,1 i 7 Xcode iOS 9 krach 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 

i

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

Ta klasa powoduje awarię gry

#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

Dyskusja (patrz odpowiedź Rae): http: //forum.cocos2d-objc .org/t/xcode-7-ios9-beta/17346/6 –

Odpowiedz

44

Jestem "rae" na forum.cocos2d-objc.org i równie dobrze mogę umieścić moją odpowiedź tutaj, ponieważ wszystkie drogi prowadzą do StackOverflow. :-)

Jeśli korzystasz ze starszej wersji Cocos 2D, może to pomóc. I edytowane CCGLProgram.m zmienić początek - (BOOL) compileShader: metoda wygląda następująco:

#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 

Jest to hack, ale działa przez okres do Xcode 7 Beta 2. nadzieję, że to jest pomocne dla kogoś googlowania to.

Reid

+0

Jakieś informacje o tym, jak to działa z wydaniem iOS 9? – Jonny

+0

Nadal używam go z Xcode 7 i iOS 9. –

+4

w przypadku, gdy wspierasz także iOS wersję wcześniejszą niż iOS 8.0, zamiast tylko upewnij się, że zamień [sourceStr containsString: g_extensionStr] na [sourceStr rangeOfString: g_extensionStr] .location!= NSNotFound od - (BOOL) containsString: (NSString *) str NS_AVAILABLE (10_10, 8_0); –

7

zastosowaniem przyjętej odpowiedź powyżej, ale są nowsze wersje Cocos2d:

W CCShader.m zastąpić linie

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

z

#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

UWAGA: Chciałem napisać to jako komentarz, ale nie mam dość reputacji, aby napisać komentarz, stąd pisząc to jako odpowiedź:

Poprawka opisana przez Reid rozwiązuje problem. Jednak wywala to na iOS 7 urządzeń, ponieważ używa containsString metodę, która jest dostępna tylko w iOS 8 i powyżej

Prosta zmiana w następnej linii rozwiązuje problem:

if([sourceStr containsString:g_extensionStr]) { 

musi być zmieniony na:

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

Przyjęta odpowiedź nie zadziałała, ale tak się stało.

Przejdź do pliku o nazwie CCGLProgram.m

Wymienić całą metodę o nazwie - (BOOL)compileShader:(CLuint *)shader type(GLenum)typebyteArray:(const GLchar *)source

z tej metody tutaj

#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

Używam cocos2d-iphone 2.1 Myślę, że jest inaczej, jeśli używasz najnowszej wersji cocos2d. –

+0

dziękuję bardzo: P – zszen

+0

Używane do wersji 2.1 Cocos2d i działało jak urok: D! Dzięki! – Potajedehabichuelas

Powiązane problemy