Changes

Jump to: navigation, search

Ghost Cells

7,968 bytes added, 22:08, 16 February 2019
Robert
==== Tony ====
Subject: Jacobi's method for Poisson's equation
==== Robert Subject: Multi Sampling Anti ========== Source Files ====== {| class="wikitable mw-collapsible mw-collapsed"! main.cpp|-|<source>#include <cstdint>#include <iostream>#include <algorithm> #define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#define STB_IMAGE_WRITE_IMPLEMENTATION#include "stb_image_write.h" #include "vec3.h" struct Point { int x; int y;};uint8_t* msaa(const uint8_t* input, uint8_t* output, int width, int height, int channels, int samples) {  // directions is (samples * 2 + 1) ^ 2 int totalPoints = (samples * 2 + 1) * (samples * 2 + 1); Point* directions = new Point[totalPoints]; size_t idx = 0; for (int i = -samples; i <= samples; i++) { for (int j = -samples; j <= samples; j++) { directions[idx].x = i; directions[idx].y = j; idx++; } }  int x, y, cx, cy; Vec3<int> average; for (size_t i = 0; i < width*height; i++) { x = i % width * channels; y = i / width * channels; for (size_t j = 0; j < totalPoints; j++) { cx = x + directions[j].x * channels; cy = y + directions[j].y * channels; cx = std::clamp(cx, 0, width* channels); cy = std::clamp(cy, 0, height* channels); average.add(input[width * cy + cx], input[width * cy + cx + 1], input[width * cy + cx + 2]); } average.set(average.getX() / totalPoints, average.getY() / totalPoints, average.getZ() / totalPoints); output[(width * y + x)] = average.getX(); output[(width * y + x) + 1] = average.getY(); output[(width * y + x) + 2] = average.getZ(); average.set(0, 0, 0); } delete[] directions; return output;} int main(int argc, char* argv[]) { if (argc != 5) { std::cerr << argv[0] << ": invalid number of arguments\n"; std::cerr << "Usage: " << argv[0] << " input output sample_size passes \n"; system("pause"); return 1; } int width, height, channels; uint8_t* rgb_read = stbi_load(argv[1], &width, &height, &channels, STBI_rgb); if (channels != 3) { std::cout << "Incorrect channels" << std::endl; system("pause"); return 2; } int samples =std::atoi(argv[3]); int passes =std::atoi(argv[4]); uint8_t* rgb_write = new uint8_t[width*height*channels];  rgb_write = msaa(rgb_read, rgb_write, width, height, channels, samples); for (int i =1; i < passes; i++) { rgb_write =msaa(rgb_write, rgb_write, width, height, channels, samples); } stbi_write_png(argv[2], width, height, channels, rgb_write, width*channels); stbi_image_free(rgb_read);Subject delete[] rgb_write; std::cout << "AA Done using " << samples << " sample size" << " over " << passes << " passes" << std::endl; system("pause"); return 0;}</source>|}{| class="wikitable mw-collapsible mw-collapsed"! vec3.h|-|<source>#ifndef VEC3_H#define VEC3_H#include <iostream>template <class T>class Vec3 {private: T x; T y; T z;public: Vec3() { x = 0; y = 0; z = 0; }; Vec3(T x_, T y_, T z_) { x = x_; y = y_; z = z_; } void set(const T &x_, const T &y_, const T &z_) { x = x_; y = y_; z = z_; } void add(const T &x_, const T &y_, const T &z_) { x += x_; y += y_; z += z_; } T getX() const { return x; } T getY() const { return y; } T getZ() const { return z; }  void setX(const T &x_) { x = x_; } void setY(const T &y_) { y = y_; } void setZ(const T &z_) { z = z_; }  static T dot(const Vec3& vec1, const Vec3& vec2) { return vec1.x * vec2.x + vec1.y * vec2.y + vec1.z * vec2.z; } T dot(const Vec3 &vec) const { return x * vec.x + y * vec.y + z * vec.z; } void display(std::ostream& os) { os << "x: " << x << ", y: " << y << ", z: " << z << "\n"; } }; #endif // !VEC3_H </source>|}[https://github.com/nothings/stb/blob/master/stb_image.h stb_image_write.h][https://github.com/nothings/stb/blob/master/stb_image.h stb_image.h] ====== Introduction ======For my selection I chose to do Anti Aliasing since I see it a lot in video games but I never really knew how it worked. There are other anti aliasing methods like FXAA which is fast approximate anti aliasing but it seemed a lot more complicated than MSAA. The way I approached this problem is by getting the color of the pixels around a pixel. In you can specify the distance it will search in the application flags. In my implementation you specify an input file, output file, the radius of pixels to sample and how many passes to take on the image. In my tests the command line options I used was an image I made in paint with 4 sample size and 4 passes. {| class="wikitable mw-collapsible mw-collapsed"! Before|-|[[File:MSAABefore.png]]|}{| class="wikitable mw-collapsible mw-collapsed"! After|-|[[File:MSAAAfter.png]].|}====== Profiling ======{| class="wikitable mw-collapsible mw-collapsed"! Profiling |-|<source>Flat profileEach sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 85.72 0.18 0.18 msaa(unsigned char const*, unsigned char*, int, int, int, int) 14.29 0.21 0.03 1 30.00 30.00 stbi_zlib_compress 0.00 0.21 0.00 127820 0.00 0.00 stbiw__zlib_flushf(unsigned char*, unsigned int*, int*) 0.00 0.21 0.00 96904 0.00 0.00 stbiw__zhash(unsigned char*) 0.00 0.21 0.00 5189 0.00 0.00 stbi__fill_bits(stbi__zbuf*) 0.00 0.21 0.00 2100 0.00 0.00 stbiw__encode_png_line(unsigned char*, int, int, int, int, int, int, signed char*) 0.00 0.21 0.00 2014 0.00 0.00 stbiw__sbgrowf(void**, int, int) [clone .constprop.58] 0.00 0.21 0.00 38 0.00 0.00 stbi__get16be(stbi__context*) 0.00 0.21 0.00 19 0.00 0.00 stbi__get32be(stbi__context*) 0.00 0.21 0.00 3 0.00 0.00 stbi__skip(stbi__context*, int) 0.00 0.21 0.00 3 0.00 0.00 stbiw__wpcrc(unsigned char**, int) 0.00 0.21 0.00 3 0.00 0.00 stbi__stdio_read(void*, char*, int) 0.00 0.21 0.00 3 0.00 0.00 stbi__zbuild_huffman(stbi__zhuffman*, unsigned char const*, int) 0.00 0.21 0.00 2 0.00 0.00 stbi__mad3sizes_valid(int, int, int, int) 0.00 0.21 0.00 1 0.00 0.00 _GLOBAL__sub_I_stbi_failure_reason 0.00 0.21 0.00 1 0.00 0.00 stbi__getn(stbi__context*, unsigned char*, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__readval(stbi__context*, int, unsigned char*) 0.00 0.21 0.00 1 0.00 0.00 stbi__load_main(stbi__context*, int*, int*, int*, int, stbi__result_info*, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__parse_zlib(stbi__zbuf*, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__malloc_mad3(int, int, int, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__parse_png_file(stbi__png*, int, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__start_callbacks(stbi__context*, stbi_io_callbacks*, void*) 0.00 0.21 0.00 1 0.00 0.00 stbi__decode_jpeg_header(stbi__jpeg*, int) 0.00 0.21 0.00 1 0.00 0.00 stbi__compute_huffman_codes(stbi__zbuf*) 0.00 0.21 0.00 1 0.00 0.00 stbi__load_and_postprocess_8bit(stbi__context*, int*, int*, int*, int) 0.00 0.21 0.00 1 0.00 0.00 stbi_load_from_file 0.00 0.21 0.00 1 0.00 30.00 stbi_write_png_to_mem 0.00 0.21 0.00 1 0.00 0.00 stbi_zlib_decode_malloc_guesssize_headerflag</source>|} ====== Profiling ======Since the <code>msaa</code> function I wrote is a hotspot of the program I would suggest offloading part of it to a GPU, more specifically the part that finds the average of colors of the nearby pixels. That part also does not depend on previous iterations to finish so it is a prime candidate for parallelization. 
==== Inna ====
44
edits

Navigation menu