Почему при рисовании сферы в фрагментном шейдере она получается вытянутой

   #version 130

uniform vec2 WeiHei;

vec2 sphereIntersect(in vec3 ro, in vec3 rd, in vec3 ce, float ra) {
    vec3 co = ro - ce;
    float a = dot(rd, rd);
    float b = 2 * dot(rd, co);
    float c = dot(co, co) - ra * ra;
    float D = b * b - 4 * a * c;
    if (D < 0.0) return vec2(-1.0);
    D = sqrt(D);
    vec2 t = vec2((-b - D) / (2 * a), (-b + D) / (2 * a));
    return t;
}

vec3 castRay(vec3 ro, vec3 rd, vec2 coord_pix) {
    vec3 sphere_origin = vec3(40, 20, 20);
    //vec3 sphere_origin = vec3(0.0);
    vec2 t = sphereIntersect(ro, rd, sphere_origin, 10);
    if (t.x < 0.0) return vec3(0.0);
    else {
        vec3 coord_first_point = vec3(ro + t[0] * rd);
        vec3 coord_second_point = vec3(ro + t[1] * rd);
        
        vec3 light = normalize(vec3(-0.5, 0.75, -1.0));
        vec3 normal_line = coord_first_point - sphere_origin;
        float diffuse = max(0.0, dot(light, normal_line) / (length(light) * length(normal_line))) * 0.5;

        //vec3 reflected = rd - 2.0 * dot(normal_line, rd) * normal_line;
        //float specular = pow(max(0.0, dot(reflected, light)), 2.0);

        return vec3(diffuse);
    }
}

void main() {
    vec2 coord_pix = gl_FragCoord.xy / WeiHei;
    //coord_pix.x = coord_pix.x * WeiHei.x / WeiHei.y;
    vec3 rayOrigin = vec3(0.0, 0.0, -40.0);
    vec3 rayDirection = vec3(coord_pix.xy, 1.0);
    vec3 col = castRay(rayOrigin, rayDirection, coord_pix);
    gl_FragColor = vec4(col, 1.0);
}

проблема в том, что по какой-то причине сфера получается вытянутой и наклонённой. подскажите, пожалуйста, что делать в этом случае?

пишу через sfml на c++. вот код из cpp файла:

#include <iostream>
#include <SFML/Graphics.hpp>

namespace CONSTS {
    unsigned int WEIGHT_WINDOW = 1280;
    unsigned int HEIGHT_WINDOW = 720;
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(CONSTS::WEIGHT_WINDOW, 720), "RayTracing");
    window.setFramerateLimit(60);

    sf::VertexArray quad(sf::Quads, 4);
    quad[0].position = sf::Vector2f(0, 0);
    quad[1].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, 0);
    quad[2].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    quad[3].position = sf::Vector2f(0, CONSTS::HEIGHT_WINDOW);

    sf::Shader shader_fragment;
    shader_fragment.loadFromFile("shader.frag", sf::Shader::Fragment);

    shader_fragment.setUniform("WeiHei", sf::Vector2f((float)CONSTS::WEIGHT_WINDOW, (float)CONSTS::HEIGHT_WINDOW));

    while (window.isOpen()) {

        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) window.close();
        }

        window.draw(quad, &shader_fragment);
        window.display();
    }
}

прикрепляю изображение этой дыни: введите сюда описание изображения


Ответы (0 шт):