1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include "../3rdParty/svpng/svpng.inc" #include "Ray.h" #include <cstdio>
const int WIDTH = 640; const int HEIGHT = 480;
using byte = unsigned char;
void paint(byte *d, int x, int y, Color3f color, float alpha) { d += 4 * (y * WIDTH + x); d[0] = (int)255 * color.r; d[1] = (int)255 * color.g; d[2] = (int)255 * color.b; d[3] = (int)255 * alpha; }
Color3f mix(const Color3f &a, const Color3f &b, float t) { return a * (1.0f - t) + b * t; }
Color3f paint(const Ray &r) { Vector3f dir = r.getDir(); float t = 0.5f * (dir.y + 1.0f); return mix({1.0f, 1.0f, 1.0f}, {0.5f, 0.7f, 1.0f}, t); }
int main() { FILE *f = fopen("ch3.png", "wb"); byte d[4 * WIDTH * HEIGHT]; Point3f lowerLeftCorner(-2.0f, -1.0f, -1.0f); Vector3f horizonal(4.0f, 0.0f, 0.0f); Vector3f vertical(0.0f, 2.0f, 0.0f); Point3f origin(0.0f, 0.0f, 0.0f);
for (int y = HEIGHT - 1; y >= 0; y--) { for (int x = 0; x < WIDTH; x++) { float u = (float)x / WIDTH; float v = (float)y / HEIGHT; Ray r(origin, lowerLeftCorner + u * horizonal + v * vertical); paint(d, x, y, paint(r), 1.0f); } } svpng(f, WIDTH, HEIGHT, d, 1); fclose(f); }
|