Выцветший круг OpenGL 2D растягивается / сжимается в зависимости от разрешения - PullRequest
1 голос
/ 28 мая 2020

Я бы хотел, чтобы мое приглушенное освещение (на основе расстояния от точки) было идеальным кругом независимо от разрешения. В настоящее время свет представляет собой только круг, если высота и ширина окна равны.

Вот как это выглядит сейчас:

My фрагментный шейдер выглядит так:

precision mediump float;
#endif

#define MAX_LIGHTS  10

// varying input variables from our vertex shader
varying vec4 v_color;
varying vec2 v_texCoords;

// a special uniform for textures
uniform sampler2D u_texture;
uniform vec2 u_resolution;
uniform float u_time;

uniform vec2 lightsPos[MAX_LIGHTS];
uniform vec3 lightsColor[MAX_LIGHTS];
uniform float lightsSize[MAX_LIGHTS];

uniform vec2 cam;

uniform vec2 randPos;

uniform bool dark;

void main()
{
    vec4 lights = vec4(0.0,0.0,0.0,1.0);
    float ratio = u_resolution.x/u_resolution.y;
    vec2 st = gl_FragCoord.xy/u_resolution;
    vec2 loc = vec2(.5 + randPos.x, 0.5 + randPos.y);

    for(int i = 0; i < MAX_LIGHTS; i++)
    {
        if(lightsSize[i] != 0.0)
        {
            // trying to reshape the light
            // vec2 st2 = st;
            // st2.x *= ratio;

            float size = 2.0/lightsSize[i];
            float dist = max(0.0, distance(lightsPos[i], st)); // st here was replaced with st2 when experimenting

            lights = lights + vec4(max(0.0, lightsColor[i].x - size * dist), max(0.0, lightsColor[i].y - size * dist), max(0.0, lightsColor[i].z - size * dist), 0.0);
        }
    }

    if(dark)
    {
        lights.r = max(lights.r, 0.075);
        lights.g = max(lights.g, 0.075);
        lights.b = max(lights.b, 0.075);
    }
    else
    {
        lights.r += 1.0;
        lights.g += 1.0;
        lights.b += 1.0;
    }

    gl_FragColor = texture2D(u_texture, v_texCoords) * lights;
}

Я попытался изменить форму света, умножив значение x пикселя на ratio ширины экрана на высоту экрана, но это привело к тому, что источники света стали не к месту. Я не мог придумать ничего, что могло бы вернуть их на место, сохраняя при этом форму.

РЕДАКТИРОВАТЬ: смещение определяется положением моей камеры в моей сцене libgdx.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

вам нужно изменить масштаб разницы между положением источника света и положением фрагмента

vec2 dr = st-lightsPos[i];
dr.x*=ratio;
float dist = length(dr);
0 голосов
/ 28 мая 2020

Попробуйте нормализовать st вот так

vec2 st = (gl_FragCoord.xy - .5*u_resolution.xy) / min(u_resolution.x, u_resolution.y);

, чтобы координаты ваших фрагментов находились в диапазоне [-1; 1] для y и [-ratio/2; ratio/2], где ratio = u_resolution.x/u_resolution.y

Вы также можно сделать [0; 1] для y и [0; ratio] для x, выполнив

vec2 st = gl_FragCoord.xy / min(u_resolution.x, u_resolution.y);

Но первое во многих случаях удобнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...