首页 > 解决方案 > Cocos2d-x 着色器场景过渡效果在 iOS 上无法正常工作

问题描述

我正在开发我的第一款游戏,我终于处于开发的最后阶段,但我的一个着色器遇到了一个小问题。我根本不擅长使用着色器,所以我解决与它们相关的问题的能力仍然非常有限。

无论如何,这是一种试图模仿卡通片或马里奥游戏中经常出现的场景过渡的效果。屏幕充满黑色,里面有一个透明的整体,它变得越来越小,直到整个屏幕变黑(或相反)。

在 Windows 上,它按预期工作,但是当我尝试在我的手机(iPhone6s)上运行它时,一旦圆圈接触到屏幕边缘,效果就会被切断(参见图片以供参考)。

在此处输入图像描述

你认为可能是什么问题?如果无法使用着色器解决,您是否知道任何可以在视觉上相同的解决方法?

哦,差点忘了,这是着色器:

#ifdef GL_ES
   precision mediump float;
#endif

const float scale = 1.0;

uniform float uAlpha;
uniform int isActive;
uniform float centerPtX;
uniform float centerPtY;
uniform float uCircleRadius;
uniform vec2 uResolution;

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

vec2 getCoordinates()
{
    return vec2(
        v_texCoord.x * uResolution.x, 
        v_texCoord.y * uResolution.y
    );
}

float getDist(vec2 pt1, vec2 pt2)
{
    float dx = pt1.x - pt2.x;
    float dy = pt1.y - pt2.y;

    return sqrt((dx*dx) + (dy*dy));
}

void main()
{       
    if (isActive == 0) // don't draw anything
    {
        gl_FragColor = v_fragmentColor;
        return;
    }

    vec3 finalCol = vec3(0.0);
    vec3 circleCol = vec3(1.0);
    vec2 centerPt = vec2(centerPtX, centerPtY);
    float dis = length(getCoordinates() - centerPt);

    // outline
    //circleCol += 1.0 * smoothstep(uCircleRadius * 0.95, uCircleRadius, dis);

    // render
    finalCol = circleCol.zyx * (1.0 - smoothstep(uCircleRadius * 0.99, uCircleRadius, dis));
    gl_FragColor = vec4(finalCol.rgb, uAlpha);
}

标签: c++iosglslcocos2d-xglsles

解决方案


推荐阅读