From 0404615190ba6b4ac6d938fef7619548b230abec Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Thu, 17 Feb 2022 10:56:10 +0100 Subject: [PATCH] Bilinear blend working! --- assets/bricksx64.png | Bin 0 -> 7691 bytes main.cpp | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 assets/bricksx64.png diff --git a/assets/bricksx64.png b/assets/bricksx64.png new file mode 100644 index 0000000000000000000000000000000000000000..71d18c92884f806b8a95885103cb7b37f350780f GIT binary patch literal 7691 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 FV1m_$&Mp7| literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 3f4d805..b794c86 100644 --- a/main.cpp +++ b/main.cpp @@ -94,8 +94,6 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, float area = EdgeFunction(p0, p1, p2); for (int y = min_y; y < max_y; y++) { for (int x = min_x; x < max_x; x++) { - int xi = (int)(x + 0.5f); - int yi = (int)(y + 0.5f); float edge1 = EdgeFunction(p0, p1, { (float)x,(float)y }); float edge2 = EdgeFunction(p1, p2, { (float)x,(float)y }); float edge3 = EdgeFunction(p2, p0, { (float)x,(float)y }); @@ -104,8 +102,6 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, float w1 = edge2 / area; float w2 = edge3 / area; float w3 = edge1 / area; - float x_diff = xi - x; - float y_diff = yi - y; #if 1 float u = tex0.x * (w1 / p0.w) + tex1.x * (w2 / p1.w) + tex2.x * (w3 / p2.w); float v = tex0.y * (w1 / p0.w) + tex1.y * (w2 / p1.w) + tex2.y * (w3 / p2.w); @@ -117,21 +113,25 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, float u = tex0.x * w1 + tex1.x * w2 + tex2.x * w3; float v = tex0.y * w1 + tex1.y * w2 + tex2.y * w3; #endif + u = u * (src->x - 2); + v = v * (src->y - 2); + int ui = (int)(u); + int vi = (int)(v); + float udiff = u - (float)ui; + float vdiff = v - (float)vi; - int ui = (int)(u * (src->x - 2) + 0.5f); - int vi = (int)(v * (src->y - 2) + 0.5f); uint32_t *pixel = src->pixels + (ui + (src->y - 1 - vi) * src->x); Vec4 pixelx1y1 = V4ABGR(*pixel); Vec4 pixelx2y1 = V4ABGR(*(pixel + 1)); Vec4 pixelx1y2 = V4ABGR(*(pixel - src->x)); Vec4 pixelx2y2 = V4ABGR(*(pixel + 1 - src->x)); - Vec4 blendx1 = Lerp(pixelx1y1, pixelx2y1, x_diff); - Vec4 blendx2 = Lerp(pixelx1y2, pixelx2y2, x_diff); - Vec4 result_color = Lerp(blendx1, blendx2, y_diff); - uint32_t color32 = ColorToU32ARGB(pixelx1y1); + Vec4 blendx1 = Lerp(pixelx1y1, pixelx2y1, udiff); + Vec4 blendx2 = Lerp(pixelx1y2, pixelx2y2, udiff); + Vec4 result_color = Lerp(blendx1, blendx2, vdiff); + uint32_t color32 = ColorToU32ARGB(result_color); - dst->pixels[xi + (dst->y - 1 - yi) * dst->x] = color32; + dst->pixels[x + (dst->y - 1 - y) * dst->x] = color32; } } } @@ -163,7 +163,7 @@ int main() { float rotation = 0; Vec3 camera_pos = {0,0,-5}; int x,y,n; - unsigned char *data = stbi_load("assets/cat.png", &x, &y, &n, 4); + unsigned char *data = stbi_load("assets/bricksx64.png", &x, &y, &n, 4); Image img = {(uint32_t *)data, x, y}; Mat4 perspective = Mat4Perspective(60.f, screen.x, screen.y, 0.1f, 100.f); while (OS_GameLoop()) {