2012-08-14 1 views
0

this raywenderlich tutorial.으로 놀고 싶습니다. CSEGrass 예제 (페이지 버튼)에 관심이 있습니다.Cocos2d : 이미지의 투명하지 않은 픽셀 만 그리기 위해 조각 쉐이더를 가져올 수 없습니다.

파란색 배경 후에 장면에 추가되는 알파 채널을 사용하여 작은 이미지에서 쉐이더를 실행하려고했습니다. 다음은 코드입니다 (튜토리얼과 거의 동일합니다, 아래 참조). 검은 색 경계선없이 빨간색 이미지가 표시 될 것으로 예상했습니다.

Image

결과는 이것이다 : 여기

은 이미지입니다 image bending

image bending 2

나는이에 전혀 경험이없는,하지만 나는 쉐이더 기록으로 추측입니다 투명 픽셀을 인식하지 못하며 검은 색으로 그립니다. 코드 (섹션 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); 
} 

답변

1
vec3 normalColor = texture2D(u_texture, fract(vec2(v_texCoord.x + offset, v_texCoord.y))).rgb; 
gl_FragColor = vec4(normalColor, 1); 

당신은 텍스처의 색상의 RGB 값을 복용의 알파 값을 사용하는 따라서, (0, 0, 0, 0)은 (0, 0, 0, 1), 검정색이된다. 해결책 : 텍스처의 알파 값을 사용하십시오.

gl_FragColor = texture2D(u_texture, fract(vec2(v_texCoord.x + offset, v_texCoord.y))).rgba; 
+0

이것은 완벽하게 작동했습니다. – mm24