提问人:Mostank PL 提问时间:11/13/2023 更新时间:11/13/2023 访问量:52
C++ 渲染图像向左拉伸 [关闭]
C++ Rendered Image is stretched to the left [closed]
问:
在尝试编写我的 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 中有几个明显的情况,它对他们有用。
答: 暂无答案
评论