commit
4e7a085ed9
@ -0,0 +1,7 @@
|
|||||||
|
.vscode
|
||||||
|
build/
|
||||||
|
light.ppm
|
||||||
|
bonus.ppm
|
||||||
|
normal.ppm
|
||||||
|
red.ppm
|
||||||
|
.DS_Store
|
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
|
project(ray)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "-g -Wall")
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
add_executable(ray60 primaryRays60.cpp)
|
||||||
|
add_executable(test001 main.cpp)
|
||||||
|
add_executable(skybox skybox.cpp)
|
||||||
|
add_executable(diffuse primaryRaysDiffuse.cpp)
|
||||||
|
add_executable(light primaryRaysLightSource.cpp)
|
||||||
|
add_executable(bonus bonus.cpp)
|
@ -0,0 +1,121 @@
|
|||||||
|
Creative Commons Legal Code
|
||||||
|
|
||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||||
|
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||||
|
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||||
|
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||||
|
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||||
|
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||||
|
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||||
|
HEREUNDER.
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||||
|
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for
|
||||||
|
the purpose of contributing to a commons of creative, cultural and
|
||||||
|
scientific works ("Commons") that the public can reliably and without fear
|
||||||
|
of later claims of infringement build upon, modify, incorporate in other
|
||||||
|
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||||
|
and for any purposes, including without limitation commercial purposes.
|
||||||
|
These owners may contribute to the Commons to promote the ideal of a free
|
||||||
|
culture and the further production of creative, cultural and scientific
|
||||||
|
works, or to gain reputation or greater distribution for their Work in
|
||||||
|
part through the use and efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any
|
||||||
|
expectation of additional consideration or compensation, the person
|
||||||
|
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||||
|
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||||
|
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||||
|
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||||
|
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not
|
||||||
|
limited to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display,
|
||||||
|
communicate, and translate a Work;
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or
|
||||||
|
likeness depicted in a Work;
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||||
|
in a Work;
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation
|
||||||
|
thereof, including any amended or successor version of such
|
||||||
|
directive); and
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the
|
||||||
|
world based on applicable law or treaty, and any national
|
||||||
|
implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||||
|
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||||
|
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||||
|
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||||
|
of action, whether now known or unknown (including existing as well as
|
||||||
|
future claims and causes of action), in the Work (i) in all territories
|
||||||
|
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||||
|
treaty (including future time extensions), (iii) in any current or future
|
||||||
|
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||||
|
including without limitation commercial, advertising or promotional
|
||||||
|
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||||
|
member of the public at large and to the detriment of Affirmer's heirs and
|
||||||
|
successors, fully intending that such Waiver shall not be subject to
|
||||||
|
revocation, rescission, cancellation, termination, or any other legal or
|
||||||
|
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||||
|
as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||||
|
be judged legally invalid or ineffective under applicable law, then the
|
||||||
|
Waiver shall be preserved to the maximum extent permitted taking into
|
||||||
|
account Affirmer's express Statement of Purpose. In addition, to the
|
||||||
|
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||||
|
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||||
|
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||||
|
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||||
|
maximum duration provided by applicable law or treaty (including future
|
||||||
|
time extensions), (iii) in any current or future medium and for any number
|
||||||
|
of copies, and (iv) for any purpose whatsoever, including without
|
||||||
|
limitation commercial, advertising or promotional purposes (the
|
||||||
|
"License"). The License shall be deemed effective as of the date CC0 was
|
||||||
|
applied by Affirmer to the Work. Should any part of the License for any
|
||||||
|
reason be judged legally invalid or ineffective under applicable law, such
|
||||||
|
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||||
|
of the License, and in such case Affirmer hereby affirms that he or she
|
||||||
|
will not (i) exercise any of his or her remaining Copyright and Related
|
||||||
|
Rights in the Work or (ii) assert any associated claims and causes of
|
||||||
|
action with respect to the Work, in either case contrary to Affirmer's
|
||||||
|
express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or
|
||||||
|
warranties of any kind concerning the Work, express, implied,
|
||||||
|
statutory or otherwise, including without limitation warranties of
|
||||||
|
title, merchantability, fitness for a particular purpose, non
|
||||||
|
infringement, or the absence of latent or other defects, accuracy, or
|
||||||
|
the present or absence of errors, whether or not discoverable, all to
|
||||||
|
the greatest extent permissible under applicable law.
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without
|
||||||
|
limitation any person's Copyright and Related Rights in the Work.
|
||||||
|
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||||
|
consents, permissions or other rights required for any use of the
|
||||||
|
Work.
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to
|
||||||
|
this CC0 or use of the Work.
|
@ -0,0 +1,77 @@
|
|||||||
|
#include <cmath>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "ray.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//skybox
|
||||||
|
|
||||||
|
float hit_sphere(const vec3& center, float radius, const ray& r) {
|
||||||
|
float a, b, c, t;
|
||||||
|
a = dot(r.D, r.D);
|
||||||
|
b = 2 * (dot(r.D, (r.O - center)));
|
||||||
|
c = dot(r.O - center, r.O - center) - radius * radius;
|
||||||
|
t = (((-b) - sqrt((b * b) - (4 * a * c))) / (2 * a));
|
||||||
|
//cout << a << " " << b << " " << c;
|
||||||
|
return t >= 0 ? t : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 color(ray& r) {
|
||||||
|
vec3 center(0, 0, -1);
|
||||||
|
float t = hit_sphere(center, 0.5, r);
|
||||||
|
if (t > 0.0) {
|
||||||
|
vec3 N = unit_vector(r.point_at_parameter(t) - center);
|
||||||
|
vec3 L = unit_vector(vec3(1, 1, 0) - r.point_at_parameter(t));
|
||||||
|
vec3 I = vec3(1, 1, 1); //intensity of lightsource
|
||||||
|
return (dot(N, L) > 0 ? dot(N, L) : 0) * I;
|
||||||
|
}
|
||||||
|
vec3 unit_direction = unit_vector(r.direction());
|
||||||
|
t = 0.5 * (unit_direction.y() + 1.0);
|
||||||
|
return (1.0 - t) * vec3(1, 1, 1) + t * vec3(0.5, 0.7, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
int anti_aliasing_scale = 5;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
vec3 lower_left_corner(-2, -1, -1);
|
||||||
|
vec3 origin(0, 0, 0);
|
||||||
|
vec3 horizontal(4, 0, 0);
|
||||||
|
vec3 vertical(0, 2, 0);
|
||||||
|
file << "P3\n"
|
||||||
|
<< width << " " << height << "\n255\n";
|
||||||
|
vec3** colors = new vec3*[height * anti_aliasing_scale];
|
||||||
|
for (int i = 0; i < height * anti_aliasing_scale; i++) {
|
||||||
|
colors[i] = new vec3[width * anti_aliasing_scale];
|
||||||
|
}
|
||||||
|
for (int j = (height * anti_aliasing_scale) - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < (width * anti_aliasing_scale); i++) {
|
||||||
|
float u = float(i) / float(width * anti_aliasing_scale);
|
||||||
|
float v = float(j) / float(height * anti_aliasing_scale);
|
||||||
|
ray r = ray(origin, lower_left_corner + u * horizontal + v * vertical);
|
||||||
|
vec3 color2 = color(r);
|
||||||
|
colors[j][i] = color2 * 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
vec3 color3 = vec3(0, 0, 0);
|
||||||
|
for (int a = 0; a < anti_aliasing_scale; a++) {
|
||||||
|
for (int b = 0; b < anti_aliasing_scale; b++) {
|
||||||
|
color3 = vec3(color3.r() + colors[j * anti_aliasing_scale + a][i * anti_aliasing_scale + b].r(), color3.g() + colors[j * anti_aliasing_scale + a][i * anti_aliasing_scale + b].g(), color3.b() + colors[j * anti_aliasing_scale + a][i * anti_aliasing_scale + b].b());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
color3 = vec3(color3.r() / (anti_aliasing_scale * anti_aliasing_scale), color3.g() / (anti_aliasing_scale * anti_aliasing_scale), color3.b() / (anti_aliasing_scale * anti_aliasing_scale));
|
||||||
|
file << int(color3.r()) << " " << int(color3.g()) << " " << int(color3.b()) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<CodeBlocks_project_file>
|
||||||
|
<FileVersion major="1" minor="6" />
|
||||||
|
<Project>
|
||||||
|
<Option title="cghw1" />
|
||||||
|
<Option pch_mode="2" />
|
||||||
|
<Option compiler="gcc" />
|
||||||
|
<Build>
|
||||||
|
<Target title="Debug">
|
||||||
|
<Option output="bin/Debug/cghw1" prefix_auto="1" extension_auto="1" />
|
||||||
|
<Option object_output="obj/Debug/" />
|
||||||
|
<Option type="1" />
|
||||||
|
<Option compiler="gcc" />
|
||||||
|
<Compiler>
|
||||||
|
<Add option="-g" />
|
||||||
|
</Compiler>
|
||||||
|
</Target>
|
||||||
|
<Target title="Release">
|
||||||
|
<Option output="bin/Release/cghw1" prefix_auto="1" extension_auto="1" />
|
||||||
|
<Option object_output="obj/Release/" />
|
||||||
|
<Option type="1" />
|
||||||
|
<Option compiler="gcc" />
|
||||||
|
<Compiler>
|
||||||
|
<Add option="-O2" />
|
||||||
|
</Compiler>
|
||||||
|
<Linker>
|
||||||
|
<Add option="-s" />
|
||||||
|
</Linker>
|
||||||
|
</Target>
|
||||||
|
</Build>
|
||||||
|
<Compiler>
|
||||||
|
<Add option="-Wall" />
|
||||||
|
<Add option="-fexceptions" />
|
||||||
|
</Compiler>
|
||||||
|
<Unit filename="main.cpp" />
|
||||||
|
<Extensions>
|
||||||
|
<code_completion />
|
||||||
|
<envvars />
|
||||||
|
<debugger />
|
||||||
|
<lib_finder disable_auto="1" />
|
||||||
|
</Extensions>
|
||||||
|
</Project>
|
||||||
|
</CodeBlocks_project_file>
|
@ -0,0 +1,27 @@
|
|||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
//#include "vec3.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
file << "P3\n"
|
||||||
|
<< width << " " << height << "\n255\n";
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
float r = float(i) / float(width);
|
||||||
|
float g = float(j) / float(height);
|
||||||
|
float b = 0.2;
|
||||||
|
|
||||||
|
file << int(r * 255) << " " << int(g * 255) << " " << int(b * 255) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "ray.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//skybox
|
||||||
|
|
||||||
|
bool hit_sphere(const vec3& center, float radius, const ray& r) {
|
||||||
|
float a, b, c;
|
||||||
|
a = dot(r.D, r.D);
|
||||||
|
b = 2 * (dot(r.D, (r.O - center)));
|
||||||
|
c = dot(r.O - center, r.O - center) - radius * radius;
|
||||||
|
return ((b * b) - (4 * a * c) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 color(ray& r) {
|
||||||
|
if (hit_sphere(vec3(0, 0, -1), 0.5, r)) {
|
||||||
|
return vec3(1, 0, 0);
|
||||||
|
}
|
||||||
|
vec3 unit_direction = unit_vector(r.direction());
|
||||||
|
float t = 0.5 * (unit_direction.y() + 1.0);
|
||||||
|
|
||||||
|
return vec3(1, 1, 1) * float(1.0 - t) + float(t) * vec3(0.5, 0.7, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
vec3 lower_left_corner(-2, -1, -1);
|
||||||
|
vec3 origin(0, 0, 0);
|
||||||
|
vec3 horizontal(4, 0, 0);
|
||||||
|
vec3 vertical(0, 2, 0);
|
||||||
|
file << "P3\n"
|
||||||
|
<< width << " " << height << "\n255\n";
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
float u = float(i) / float(width);
|
||||||
|
float v = float(j) / float(height);
|
||||||
|
ray r = ray(origin, lower_left_corner + u * horizontal + v * vertical);
|
||||||
|
vec3 color2 = color(r);
|
||||||
|
file << int(color2.r() * 255) << " " << int(color2.g() * 255) << " " << int(color2.b() * 255) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cmath>
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "ray.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//skybox
|
||||||
|
|
||||||
|
float hit_sphere(const vec3 ¢er, float radius, const ray& r) {
|
||||||
|
float a, b, c;
|
||||||
|
a = dot(r.D, r.D);
|
||||||
|
b = 2 * (dot(r.D, (r.O - center)));
|
||||||
|
c = dot(r.O - center, r.O - center) - radius * radius;
|
||||||
|
return (((-b) + sqrt((b * b) - (4 * a * c))) / (2 * a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vec3 color(ray& r){
|
||||||
|
vec3 center = vec3(0, 0, -1);
|
||||||
|
float t = hit_sphere(center, 0.5, r);
|
||||||
|
if (t > 0.0) {
|
||||||
|
vec3 N = unit_vector(r.point_at_parameter(t) - center);
|
||||||
|
return 0.5 * vec3(N.x()+1, N.y()+1, N.z()+1);
|
||||||
|
}
|
||||||
|
vec3 unit_direction = unit_vector(r.direction());
|
||||||
|
t = 0.5 * (unit_direction.y() + 1.0);
|
||||||
|
return (1.0-t)* vec3(1, 1, 1) + t* vec3(0.5, 0.7, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
vec3 lower_left_corner(-2, -1, -1);
|
||||||
|
vec3 origin(0, 0, 0);
|
||||||
|
vec3 horizontal(4, 0, 0);
|
||||||
|
vec3 vertical(0, 2, 0);
|
||||||
|
file << "P3\n" << width << " " << height << "\n255\n";
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
float u = float(i) / float(width);
|
||||||
|
float v = float(j) / float(height);
|
||||||
|
ray r = ray(origin, lower_left_corner + u*horizontal + v*vertical);
|
||||||
|
vec3 color2 = color(r);
|
||||||
|
file << int(color2.r() * 255) << " " << int(color2.g() * 255) << " " << int(color2.b() * 255) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
#include <cmath>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "ray.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//skybox
|
||||||
|
|
||||||
|
float hit_sphere(const vec3& center, float radius, const ray& r) {
|
||||||
|
float a, b, c, t;
|
||||||
|
a = dot(r.D, r.D);
|
||||||
|
b = 2 * (dot(r.D, (r.O - center)));
|
||||||
|
c = dot(r.O - center, r.O - center) - radius * radius;
|
||||||
|
t = (((-b) - sqrt((b * b) - (4 * a * c))) / (2 * a));
|
||||||
|
//cout << a << " " << b << " " << c;
|
||||||
|
return t >= 0 ? t : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 color(ray& r) {
|
||||||
|
vec3 center(0, 0, -1);
|
||||||
|
float t = hit_sphere(center, 0.5, r);
|
||||||
|
if (t > 0.0) {
|
||||||
|
vec3 N = unit_vector(r.point_at_parameter(t) - center);
|
||||||
|
vec3 L = unit_vector(vec3(1, 1, 0) - r.point_at_parameter(t));
|
||||||
|
vec3 I = vec3(1, 1, 1); //intensity of lightsource
|
||||||
|
cout << t << " " << I * dot(N, L) << endl;
|
||||||
|
return (dot(N, L) > 0 ? dot(N, L) : 0) * I;
|
||||||
|
}
|
||||||
|
vec3 unit_direction = unit_vector(r.direction());
|
||||||
|
t = 0.5 * (unit_direction.y() + 1.0);
|
||||||
|
return (1.0 - t) * vec3(1, 1, 1) + t * vec3(0.5, 0.7, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
vec3 lower_left_corner(-2, -1, -1);
|
||||||
|
vec3 origin(0, 0, 0);
|
||||||
|
vec3 horizontal(4, 0, 0);
|
||||||
|
vec3 vertical(0, 2, 0);
|
||||||
|
file << "P3\n"
|
||||||
|
<< width << " " << height << "\n255\n";
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
float u = float(i) / float(width);
|
||||||
|
float v = float(j) / float(height);
|
||||||
|
ray r = ray(origin, lower_left_corner + u * horizontal + v * vertical);
|
||||||
|
vec3 color2 = color(r);
|
||||||
|
file << int(color2.r() * 255) << " " << int(color2.g() * 255) << " " << int(color2.b() * 255) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef RAYH
|
||||||
|
#define RAYH
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
class ray
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ray() {}
|
||||||
|
ray(const vec3& a, const vec3& b) { O = a; D = b; }
|
||||||
|
vec3 origin() const { return O; }
|
||||||
|
vec3 direction() const { return D; }
|
||||||
|
vec3 point_at_parameter(float t) const {
|
||||||
|
return vec3(D * t + O);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 O;
|
||||||
|
vec3 D;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,54 @@
|
|||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "ray.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
//skybox
|
||||||
|
|
||||||
|
bool hit_sphere(const vec3& center, float radius, const ray& r) {
|
||||||
|
float a, b, c;
|
||||||
|
a = dot(r.D, r.D);
|
||||||
|
b = 2 * (dot(r.D, (r.O - center)));
|
||||||
|
c = dot(r.O - center, r.O - center) - radius * radius;
|
||||||
|
return ((b * b) - (4 * a * c) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 color(ray& r) {
|
||||||
|
/*
|
||||||
|
if (hit_sphere(vec3(0, 0, -1), 0.5, r)) {
|
||||||
|
return vec3(1, 0, 0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
vec3 unit_direction = unit_vector(r.direction());
|
||||||
|
float t = 0.5 * (unit_direction.y() + 1.0);
|
||||||
|
|
||||||
|
return vec3(1, 1, 1) * float(1.0 - t) + float(t) * vec3(0.5, 0.7, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int width = 200;
|
||||||
|
int height = 100;
|
||||||
|
|
||||||
|
fstream file;
|
||||||
|
file.open("ray.ppm", ios::out);
|
||||||
|
|
||||||
|
vec3 lower_left_corner(-2, -1, -1);
|
||||||
|
vec3 origin(0, 0, 0);
|
||||||
|
vec3 horizontal(4, 0, 0);
|
||||||
|
vec3 vertical(0, 2, 0);
|
||||||
|
file << "P3\n"
|
||||||
|
<< width << " " << height << "\n255\n";
|
||||||
|
for (int j = height - 1; j >= 0; j--) {
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
float u = float(i) / float(width);
|
||||||
|
float v = float(j) / float(height);
|
||||||
|
ray r = ray(origin, lower_left_corner + u * horizontal + v * vertical);
|
||||||
|
vec3 color2 = color(r);
|
||||||
|
file << int(color2.r() * 255) << " " << int(color2.g() * 255) << " " << int(color2.b() * 255) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,113 @@
|
|||||||
|
//=================================================================================================
|
||||||
|
// Written in 2016 by Peter Shirley <ptrshrl@gmail.com>
|
||||||
|
//
|
||||||
|
// To the extent possible under law, the author(s) have dedicated all copyright and related and
|
||||||
|
// neighboring rights to this software to the public domain worldwide. This software is distributed
|
||||||
|
// without any warranty.
|
||||||
|
//
|
||||||
|
// You should have received a copy (see file COPYING.txt) of the CC0 Public Domain Dedication along
|
||||||
|
// with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||||
|
//==================================================================================================
|
||||||
|
|
||||||
|
#ifndef VEC3H
|
||||||
|
#define VEC3H
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class vec3 {
|
||||||
|
public:
|
||||||
|
vec3() {}
|
||||||
|
vec3(float e0, float e1, float e2) {
|
||||||
|
e[0] = e0;
|
||||||
|
e[1] = e1;
|
||||||
|
e[2] = e2;
|
||||||
|
}
|
||||||
|
float x() const { return e[0]; }
|
||||||
|
float y() const { return e[1]; }
|
||||||
|
float z() const { return e[2]; }
|
||||||
|
float r() const { return e[0]; }
|
||||||
|
float g() const { return e[1]; }
|
||||||
|
float b() const { return e[2]; }
|
||||||
|
|
||||||
|
inline vec3& operator+=(const vec3& v2) const {
|
||||||
|
vec3* temp = new vec3(this->x() + v2.x(), this->y() + v2.y(), this->z() + v2.z());
|
||||||
|
return *temp;
|
||||||
|
};
|
||||||
|
inline vec3& operator-=(const vec3& v2) const {
|
||||||
|
vec3* temp = new vec3(this->x() - v2.x(), this->y() - v2.y(), this->z() - v2.z());
|
||||||
|
return *temp;
|
||||||
|
};
|
||||||
|
inline vec3& operator*=(const vec3& v2) {
|
||||||
|
vec3* temp = new vec3(this->x() * v2.x(), this->y() * v2.y(), this->z() * v2.z());
|
||||||
|
return *temp;
|
||||||
|
};
|
||||||
|
inline vec3& operator/=(const vec3& v2) {
|
||||||
|
vec3* temp = new vec3(this->x() / v2.x(), this->y() / v2.y(), this->z() / v2.z());
|
||||||
|
return *temp;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline vec3 operator*=(const float t) const {
|
||||||
|
return vec3(this->x() * t, this->y() * t, this->z() * t);
|
||||||
|
};
|
||||||
|
inline vec3& operator/=(const float t) {
|
||||||
|
vec3* temp = new vec3(this->x() / t, this->y() / t, this->z() / t);
|
||||||
|
return *temp;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline float length() const { return sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]); }
|
||||||
|
inline float squared_length() const { return e[0] * e[0] + e[1] * e[1] + e[2] * e[2]; }
|
||||||
|
inline void make_unit_vector();
|
||||||
|
|
||||||
|
float e[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
inline vec3 operator+(vec3 v1, vec3 v2) {
|
||||||
|
return vec3(v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z());
|
||||||
|
}
|
||||||
|
inline vec3 operator-(vec3 v1, vec3 v2) {
|
||||||
|
return vec3(v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z());
|
||||||
|
}
|
||||||
|
inline vec3 operator*(vec3 v1, vec3 v2) {
|
||||||
|
return vec3(v1.x() * v2.x(), v1.y() * v2.y(), v1.z() * v2.z());
|
||||||
|
}
|
||||||
|
inline vec3 operator/(vec3 v1, vec3 v2) {
|
||||||
|
return vec3(v1.x() / v2.x(), v1.y() / v2.y(), v1.z() / v2.z());
|
||||||
|
}
|
||||||
|
inline vec3 operator*(vec3 v1, float t) {
|
||||||
|
return vec3(v1.x() * t, v1.y() * t, v1.z() * t);
|
||||||
|
}
|
||||||
|
inline vec3 operator*(float t, vec3 v1) {
|
||||||
|
return vec3(v1.x() * t, v1.y() * t, v1.z() * t);
|
||||||
|
}
|
||||||
|
inline vec3 operator/(vec3 v1, float t) {
|
||||||
|
return vec3(v1.x() / t, v1.y() / t, v1.z() / t);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::ostream& operator<<(std::ostream& os, const vec3& t) {
|
||||||
|
os << "(" << t.x() << ", " << t.y() << ", " << t.z() << ")";
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void vec3::make_unit_vector() {
|
||||||
|
float length = sqrt(this->x() * this->x() + this->y() * this->y() + this->z() * this->z());
|
||||||
|
this->e[0] = this->x() / length;
|
||||||
|
this->e[1] = this->y() / length;
|
||||||
|
this->e[2] = this->z() / length;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float dot(const vec3& v1, const vec3& v2) {
|
||||||
|
return (v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3 cross(const vec3& v1, const vec3& v2) {
|
||||||
|
return vec3((v1.x() * v2.y() - v1.y() * v2.x()), (v1.y() * v2.z() - v1.z() * v2.y()), (v1.z() * v2.x() - v1.x() * v2.z()));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline vec3 unit_vector(vec3 v) {
|
||||||
|
float length = v.length();
|
||||||
|
return vec3(v.x() / length, v.y() / length, v.z() / length);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in new issue