C++ 渲染图像向左拉伸 [关闭]

C++ Rendered Image is stretched to the left [closed]

提问人:Mostank PL 提问时间:11/13/2023 更新时间:11/13/2023 访问量:52

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

6天前关闭。

在尝试编写我的 3D 渲染器时,我遇到了一个奇怪的问题,我不知道如何解决,也不知道为什么会发生。

为了测试它,我在很远的地方渲染了一个球体,但由于某种原因,我得到的图像在右侧还可以,但当它到达左侧时,它会逐渐被拉伸。当我用相机接近球体时,它也会以奇怪的方式被拉伸。

相机右侧的球体

旋转后,当它在左侧时

接近它后的球体

下面是渲染的代码:

    void renderScene() {
            const int width = RenderBuffer.getWidth();
            const int height = RenderBuffer.getHeight();

            const Vector3 base = rotate(normalize(Vector3{1.f, 1.f, 1.f}), cameraRotation);

            const float stepFovH = horizFov / width;
            const float stepFovV = vertFov / height;

            for (int x = 0; x < width; x++)
                for (int y = 0; y < height; y++)
                {
                    const float fovx = x*stepFovH + stepFovH/2 - horizFov/2;
                    const float fovy = y*stepFovV + stepFovV/2 - vertFov/2;

                    const Vector3 dir = rotate(base, {fovy, fovx, 0.f});
                    auto result = raySphereIntersect(cameraPosition, dir, spherePosition, sphereRadius);

                    if(result)
                        RenderBuffer.setPixel(x, y, 100);
                    else
                        RenderBuffer.setPixel(x, y, 0);
                }
        }

    Vector3 cameraPosition = {0.f, 0.f, 0.f};

    float horizFov = deg2rad(90.f);
    float vertFov; // in constructor = (horizFov * renderBuffer.getHeight() / renderBuffer.getWidth()) * 1.5f

    Vector3 cameraRotation = {0.f, 0.f, 0.f};

    // sphere
    Vector3 spherePosition = {1000.f, 1000.f, 1000.f};
    float sphereRadius = 200.f;

    static constexpr bool raySphereIntersect(const Vector3& origin, const Vector3& direction /* normalized */, const Vector3& spherePos, const float sphereRadius)
        {
            float dist = distance(origin, spherePos);

            float dotp = dotproduct(direction, spherePos - origin);

            if (dist < sphereRadius) return true;
            if (dotp < 0) return false;

            Vector3 closestPoint = origin + (direction * dotp);

            return distance(closestPoint, spherePos) < sphereRadius;
        }

我已经检查了处理渲染的函数,但我看不到任何明显的问题。 我还检查了 raySphereIntersect 中有几个明显的情况,它对他们有用。

C++ 3D 渲染

评论

1赞 Jesper Juhl 11/13/2023
什么是调试器,它如何帮助我诊断问题?
2赞 Alan Birtles 11/13/2023
请展示一个最小的可重复示例

答: 暂无答案