シェーダーに関するこのチュートリアルをゲームで機能するように調整しようとしています。後で、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
を除いて、チュートリアルと基本的に同じです):ball
sprite
fragmentSource
-(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
。シェーダーは難しいと思います。どこが間違っているのか誰かに教えてもらえれば幸いです。