0

シェーダーに関するこのチュートリアルをゲームで機能するように調整しようとしています。後で、glslをいじって、必要な効果を得るつもりです。

Box2Dを使用してCocos2d2.xプロジェクトを作成しました。Box2Dテンプレートは私にPhysicsSpriteクラスを与えてくれるので、私はを使用しませんCCSprite。これが私のinitメソッドです:

-(id) init
{
    if( (self=[super init])) {

        s = [[CCDirector sharedDirector] winSize];

        // enable events

        self.isTouchEnabled = YES;
        self.isAccelerometerEnabled = YES;

        // init physics
        [self initPhysics];

        //Init shader effects.
        [self initShaderEffects];

        ball = [PhysicsSprite spriteWithFile:@"Ball.png"];
        ball.position = ccp(s.width/2, s.height/2);
        b_body = [self createCirBody:10 andSpr:ball];
        [ball setPhysicsBody:b_body];
        [self addChild:ball];

        b_body->SetLinearVelocity(b2Vec2(1.5f,0));

        [self scheduleUpdate];
    }
    return self;
}

私がコードをテストした行を除外すると、[self initShaderEffects];これまでのところ機能し、動くボールが得られます。これが私のものです(これは、代わりに使用し、非推奨ではないメソッドを使用するように初期化を変更したことinitShaderEffectsを除いて、チュートリアルと基本的に同じです):ballspritefragmentSource

-(void)initShaderEffects {
    const GLchar *fragmentSource = (GLchar*)[[NSString stringWithContentsOfFile:@"MyCustomShader.fsh" encoding:NSUTF8StringEncoding error:nil] UTF8String];
    ball.shaderProgram = [[CCGLProgram alloc] initWithVertexShaderByteArray:ccPositionTextureA8Color_vert fragmentShaderByteArray:fragmentSource];
    [ball.shaderProgram addAttribute:kCCAttributeNamePosition index:kCCVertexAttrib_Position];
    [ball.shaderProgram addAttribute:kCCAttributeNameTexCoord index:kCCVertexAttrib_TexCoords];
    [ball.shaderProgram link];
    [ball.shaderProgram updateUniforms];

    colorRampUniformLocation = glGetUniformLocation(ball.shaderProgram->program_, "u_colorRampTexture"); //EXC_BAD_ACCESS
    glUniform1i(colorRampUniformLocation, 1);

    colorRampTexture = [[CCTextureCache sharedTextureCache] addImage:@"x2.png"];
    [colorRampTexture setAliasTexParameters];

    [ball.shaderProgram use];
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, [colorRampTexture name]);
    glActiveTexture(GL_TEXTURE0);

}

そして最後に、チュートリアルから直接コピーしたシェーダー「MyCustomShader.fsh」を示します。

#ifdef GL_ES
precision mediump float;
#endif

// 1
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform sampler2D u_colorRampTexture;

void main()
{ // 2
    vec3 normalColor = texture2D(u_texture, v_texCoord).rgb;

    // 3
    float rampedR = texture2D(u_colorRampTexture, vec2(normalColor.r, 0)).r;
    float rampedG = texture2D(u_colorRampTexture, vec2(normalColor.g, 0)).g;
    float rampedB = texture2D(u_colorRampTexture, vec2(normalColor.b, 0)).b;

    // 4
    gl_FragColor = vec4(rampedR, rampedG, rampedB, 1);
}

EXC_BAD_ACCESSこのコードは、メソッドでコメントした行にEXC_BAD_ACCESSを与えますinitShaderEffects。シェーダーは難しいと思います。どこが間違っているのか誰かに教えてもらえれば幸いです。

4

1 に答える 1

1

「Projecttarget」=>「Buildphases」の「CopyBoundleResources」セクションに「MyCustomShader.fsh」が追加されていることを確認してください。デバッガーでfragmentSourceとball.shaderProgramの値を確認するのに役立たない場合。

コードに別の問題が見つかりました。「ボール」を作成する前に実行されるinitShaderEffectsです。「[selfinitShaderEffects];」で行を移動する必要があります。行「[selfaddChild:ball];」の後。

于 2012-10-29T07:01:27.613 に答える