Почему при рисовании сферы в фрагментном шейдере она получается вытянутой
#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();
}
}
прикрепляю изображение этой дыни: