Browse Source

added affine texture interpolation fix to kernel

iver 7 months ago
parent
commit
c21206d8ac
1 changed files with 7 additions and 6 deletions
  1. 7 6
      src/RasterIver/kernels/master_kernel.h

+ 7 - 6
src/RasterIver/kernels/master_kernel.h

@@ -215,7 +215,8 @@ __kernel void raster_kernel(__global float* objects, __global float* verticies,
                 w1 = ((y2 - y0) * (id_x - x0) + (x0 - x2) * (id_y - y0)) / denominator; \
                 w2 = 1.0 - w0 - w1; \
                 \
-                float z = w0 * z0 + w1 * z1 + w2 * z2; \
+                float w_over_z = (w0 / z0 + w1 / z1 + w2 / z2); \
+                float z = 1.0 / w_over_z; \
                 \
                 if (z < z_pixel){ \
                     z_pixel = z; \
@@ -257,8 +258,8 @@ __kernel void raster_kernel(__global float* objects, __global float* verticies,
                     \
                     switch (show_buffer){\
                         case 0:{\
-                            double ux = w0 * u_x0 + w1 * u_x1 + w2 * u_x2;\
-                            double uy = w0 * u_y0 + w1 * u_y1 + w2 * u_y2;\
+                            double ux = (w0 * (u_x0 / z0) + w1 * (u_x1 / z1) + w2 * (u_x2 / z2)) / w_over_z;\
+                            double uy = (w0 * (u_y0 / z0) + w1 * (u_y1 / z1) + w2 * (u_y2 / z2)) / w_over_z;\
                             \
                             int texture_width = texture_info[texture_index * 3];\
                             int texture_height = texture_info[texture_index * 3 + 1];\
@@ -288,9 +289,9 @@ __kernel void raster_kernel(__global float* objects, __global float* verticies,
                             \
                             break;}\
                         case 2:{\
-                            float nx = w0 * n_x0 + w1 * n_x1 + w2 * n_x2;\
-                            float ny = w0 * n_y0 + w1 * n_y1 + w2 * n_y2;\
-                            float nz = w0 * n_z0 + w1 * n_z1 + w2 * n_z2;\
+                            float nx = (w0 * (n_x0 / z0) + w1 * (n_x1 / z1) + w2 * (n_x2 / z2)) / w_over_z;\
+                            float ny = (w0 * (n_y0 / z0) + w1 * (n_y1 / z1) + w2 * (n_y2 / z2)) / w_over_z;\
+                            float nz = (w0 * (n_z0 / z0) + w1 * (n_z1 / z1) + w2 * (n_z2 / z2)) / w_over_z;\
                             \
                             nx = clamp((nx * 0.5f + 0.5f) * 255.0f, 0.0f, 255.0f);\
                             ny = clamp((ny * 0.5f + 0.5f) * 255.0f, 0.0f, 255.0f);\