Я работаю над своей самой первой игрой и, наконец, я нахожусь в конце разработки, но я столкнулся с небольшой проблемой с одним из моих шейдеров. Я не очень хорош в работе с шейдерами, поэтому моя способность решать связанные с ними проблемы все еще очень ограничена.
В любом случае, это эффект, который пытается имитировать переход сцены, часто встречающийся в мультфильмах, а иногда и в марио-играх. Экран заполнен черным с прозрачным целым в нем, которое становится все меньше и меньше, пока весь экран не станет черным (или наоборот).
В 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);
}
Задача ещё не решена.
Других решений пока нет …