Я пытаюсь реализовать базовый c программный рендерер.
Похоже, мои интерполированные текстурные координаты некорректны
, но я выполнил все математические операции чтобы исправить перспективу
Я пишу код, следующий за этой статьей https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/perspective-correct-interpolation-vertex-attributes
исходный код https://github.com/RKGekk/PerspectiveCorrectTexturing
float v0z = 1.0f / v0.z;
float v1z = 1.0f / v1.z;
float v2z = 1.0f / v2.z;
float yTemp = v0.y;
if (v0.x >= 0 && v0.x < pixelWidth && v1.x >= 0 && v1.x < pixelWidth && v2.x >= 0 && v2.x < pixelWidth) {
for (loop_y = iy1; loop_y <= iy3; loop_y++) {
int ixStart = (int)xStart;
int ixEnd = (int)xEnd;
float xTemp = xStart;
for (int x = ixStart; x < ixEnd; x++) {
Vec2f p = new Vec2f(xTemp, loop_y);
Vec3f w = poly.nlambdas(p);
float z = 1.0f / (w.x * v0z + w.y * v1z + w.z * v2z);
Vec3f color = new Vec3f(
(poly.c0.r * v0z * w.x + poly.c1.r * v1z * w.y + poly.c2.r * v2z * w.z) * z,
(poly.c0.g * v0z * w.x + poly.c1.g * v1z * w.y + poly.c2.g * v2z * w.z) * z,
(poly.c0.b * v0z * w.x + poly.c1.b * v1z * w.y + poly.c2.b * v2z * w.z) * z
);
Vec2f UV = new Vec2f(
(poly.t0.x * v0z * w.x + poly.t1.x * v1z * w.y + poly.t2.x * v2z * w.z) * z,
(poly.t0.y * v0z * w.x + poly.t1.y * v1z * w.y + poly.t2.y * v2z * w.z) * z
);
bool alphaColor = false;
if (poly.rasterType == RPolygon.RasterType.Textured) {
Vec4f texColor = poly.texture.sampleTextureA(UV);
if (texColor.a == 1.0f) {
color.r = texColor.r;
color.g = texColor.g;
color.b = texColor.b;
}
else {
alphaColor = true;
}
}
if (!alphaColor) {
printPixelZ(
x,
loop_y,
z,
color
);
}
xTemp += 1.0f;
}
xStart += dx_left;
xEnd += dx_right;
yTemp += 1.0f;
}
}