私はこのraywenderlichチュートリアルをいじってみようとしています。CSEGrassの例(ページのボタン)に興味があります。
青い背景の後にシーンに追加されるアルファチャネルを使用して、小さな画像でシェーダーを実行しようとしました。これがコードです(チュートリアルとほぼ同じです。以下を参照してください)。赤い画像が黒い境界線なしで表示されることを期待していました。
これが画像です:
結果は次のとおりです。
私はこれについてまったく経験がありませんが、書かれているシェーダーは透明なピクセルを認識せず、それらを黒で描画していると思います。コード(セクション5)では、通常の色で描画されているように見えますが、実際には透明である必要があります。透明なピクセルは黒に対応するrgb値を持っているように見えます。
vec3 normalColor = texture2D(u_texture, fract(vec2(v_texCoord.x + offset, v_texCoord.y))).rgb;
私は少し迷っています。ここにコードを投稿します:
CCSprite *background = [CCSprite spriteWithFile:@"icewallpaper.png"];
background.anchorPoint = CGPointMake(0.5f, 0.5f);
background.position = CGPointMake( 160.0f, 240.0f);
[self addChild:background];
// 1
sprite = [CCSprite spriteWithFile:@"grass.png"];
sprite.anchorPoint =CGPointMake(0.5f, 0.5f);
sprite.position = CGPointMake( 160.0f, 240.0f);
[self addChild:sprite z:0 tag:69];
CCSprite *altra = [CCSprite spriteWithFile:@"Icon-Small.png"];
altra.anchorPoint = CGPointMake(0.5, 0.5f);
altra.position = CGPointMake(20.0f, 300.0f);
[self addChild:altra z:0 tag:99];
// 2
const GLchar * fragmentSource = (GLchar*) [[NSString stringWithContentsOfFile:[CCFileUtils fullPathFromRelativePath:@"CSEGrass.fsh"] encoding:NSUTF8StringEncoding error:nil] UTF8String];
sprite.shaderProgram = [[CCGLProgram alloc] initWithVertexShaderByteArray:ccPositionTextureA8Color_vert
fragmentShaderByteArray:fragmentSource];
[sprite.shaderProgram addAttribute:kCCAttributeNamePosition index:kCCVertexAttrib_Position];
[sprite.shaderProgram addAttribute:kCCAttributeNameTexCoord index:kCCVertexAttrib_TexCoords];
[sprite.shaderProgram link];
[sprite.shaderProgram updateUniforms];
// 3
timeUniformLocation = glGetUniformLocation(sprite.shaderProgram->program_, "u_time");
// 4
[self scheduleUpdate];
// 5
[sprite.shaderProgram use];
そしてここにシェーダーファイルCSEGrass.fshがあります:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform float u_time;
// 1
const float speed = 4.0;
const float bendFactor = 0.5;
void main()
{
// 2
float height = 0.0 + v_texCoord.y;
// 3
float offset = pow(height, 2.5);
// 4 multiply by sin since it gives us nice bending
offset *= (sin(u_time * speed) * bendFactor);
// 5
vec3 normalColor = texture2D(u_texture, fract(vec2(v_texCoord.x + offset, v_texCoord.y))).rgb;
gl_FragColor = vec4(normalColor, 1);
}