Проблема в том, что вы используете масштабированные координаты ультрафиолетового излучения для бокс-теста:
float size=.5*scale;
float box=box(uv,vec2(.5*size));
Вы должны учитывать этот масштаб, когда вы просматриваете текстуру. Кроме того, вы ошибочно добавляете 0,5 к UV-координатам:
float u=r*cos(phi)+.5;
float v=r*sin(phi)+.5;
Установите UV-координаты в диапазоне [-1,0, 1,0]:
vec2 uv = vec2(r*cos(phi), r*sin(phi));
Перевести, поверните и масштабируйте его (например, const float scale = 8.0;
):
// translate
vec2 translate = vec2(sin(azimuthRad), cos(azimuthRad));
uv += translate * altitudeNormalization;
// rotate
uv = rotate(PI-azimuthRad)*uv;
// scale
uv = uv * scale;
Преобразуйте координату uv
из диапазона [-1.0, 1.0] в [0.0, 1.0] и выполните правильный боксный тест:
uv = uv * 0.5 + 0.5;
vec2 boxtest = step(0.0, uv) * step(uv, vec2(1.0));
if (boxtest.x * boxtest.y > 0.0)
color += texture2D(u_texture_0, uv);
Фрагмент шейдера основного:
void main(){
vec2 st = gl_FragCoord.xy/u_resolution;
vec4 color = texture2D(u_texture_1,st); // set background grid
float aperture=180.;
float apertureHalf=.5*aperture*(PI/180.);
float maxFactor=sin(apertureHalf);
// to unit sphere -> -1 - 1
vec2 vPos = st * 2.0 - 1.0;
float l=length(vPos);
if(l<=1.){
float x = maxFactor*vPos.x;
float y = maxFactor*vPos.y;
float n = length(vec2(x,y));
float z = sqrt(1.-n*n);
float r = atan(n,z)/PI;
float phi = atan(y,x);
float u = r*cos(phi);
float v = r*sin(phi);
vec2 uv = vec2(r*cos(phi), r*sin(phi));
// translate
vec2 translate = vec2(sin(azimuthRad), cos(azimuthRad));
uv += translate * altitudeNormalization;
// rotate
uv = rotate(PI-azimuthRad)*uv;
// scale
uv = uv * scale;
uv = uv * 0.5 + 0.5;
vec2 boxtest = step(0.0, uv) * step(uv, vec2(1.0));
if (boxtest.x * boxtest.y > 0.0)
color += texture2D(u_texture_0, uv);
}
gl_FragColor = color;
}