Implement perlin noise

This commit is contained in:
CJSatnarine
2024-07-09 16:18:02 -04:00
parent 4c58e4a084
commit 0374a95639
13 changed files with 358872 additions and 358757 deletions

View File

@@ -11,6 +11,7 @@ add_executable(Raytracer
hittableList.h
interval.h
material.h
perlin.h
ray.h
rayTracer.h
rtw_stb_image.h

View File

@@ -39,7 +39,7 @@
{
"directoryIndex" : 0,
"id" : "Raytracer::@6890427a1f51a3e7e1df",
"jsonFile" : "target-Raytracer-Debug-28c14a284b376e6f3c5e.json",
"jsonFile" : "target-Raytracer-Debug-f0c538276ccb345994b1.json",
"name" : "Raytracer",
"projectIndex" : 0
}

View File

@@ -26,7 +26,7 @@
"objects" :
[
{
"jsonFile" : "codemodel-v2-d4a7d48a6b29f61122a4.json",
"jsonFile" : "codemodel-v2-3e9cc36c8bdbe2ee1863.json",
"kind" : "codemodel",
"version" :
{
@@ -99,7 +99,7 @@
}
},
{
"jsonFile" : "codemodel-v2-d4a7d48a6b29f61122a4.json",
"jsonFile" : "codemodel-v2-3e9cc36c8bdbe2ee1863.json",
"kind" : "codemodel",
"version" :
{

View File

@@ -94,7 +94,8 @@
11,
12,
13,
14
14,
15
]
}
],
@@ -146,6 +147,11 @@
"path" : "material.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "perlin.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "ray.h",

View File

@@ -12,6 +12,7 @@ CMakeFiles/Raytracer.dir/main.cpp.o
/home/cjsatnarine/Code/Raytracer/hittableList.h
/home/cjsatnarine/Code/Raytracer/interval.h
/home/cjsatnarine/Code/Raytracer/material.h
/home/cjsatnarine/Code/Raytracer/perlin.h
/home/cjsatnarine/Code/Raytracer/ray.h
/home/cjsatnarine/Code/Raytracer/rayTracer.h
/home/cjsatnarine/Code/Raytracer/rtw_stb_image.h

View File

@@ -11,6 +11,7 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/home/cjsatnarine/Code/Raytracer/hittableList.h \
/home/cjsatnarine/Code/Raytracer/interval.h \
/home/cjsatnarine/Code/Raytracer/material.h \
/home/cjsatnarine/Code/Raytracer/perlin.h \
/home/cjsatnarine/Code/Raytracer/ray.h \
/home/cjsatnarine/Code/Raytracer/rayTracer.h \
/home/cjsatnarine/Code/Raytracer/rtw_stb_image.h \
@@ -273,12 +274,6 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/x86_64-linux-gnu/sys/single_threaded.h:
/usr/include/c++/13/pstl/execution_defs.h:
/usr/include/c++/13/bits/basic_ios.tcc:
/usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h:
/usr/include/c++/13/math.h:
/usr/include/c++/13/bits/ostream_insert.h:
@@ -417,8 +412,6 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/c++/13/cwctype:
/home/cjsatnarine/Code/Raytracer/camera.h:
/usr/include/x86_64-linux-gnu/bits/long-double.h:
/usr/include/c++/13/bits/algorithmfwd.h:
@@ -427,6 +420,8 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/c++/13/ios:
/home/cjsatnarine/Code/Raytracer/camera.h:
/usr/include/c++/13/bits/stl_raw_storage_iter.h:
/usr/lib/gcc/x86_64-linux-gnu/13/include/stddef.h:
@@ -439,6 +434,10 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/c++/13/algorithm:
/usr/include/x86_64-linux-gnu/sys/select.h:
/usr/include/c++/13/cwchar:
/home/cjsatnarine/Code/Raytracer/interval.h:
/usr/include/c++/13/bits/hash_bytes.h:
@@ -475,6 +474,16 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/home/cjsatnarine/Code/Raytracer/colour.h:
/usr/include/c++/13/bits/streambuf.tcc:
/usr/include/c++/13/bits/specfun.h:
/usr/include/c++/13/bits/basic_string.h:
/usr/include/c++/13/tr1/poly_laguerre.tcc:
/usr/include/x86_64-linux-gnu/bits/endianness.h:
/usr/include/c++/13/bits/align.h:
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h:
@@ -501,6 +510,12 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
/usr/include/c++/13/bits/basic_ios.tcc:
/usr/include/c++/13/pstl/execution_defs.h:
/usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h:
/usr/include/c++/13/bits/atomic_lockfree_defines.h:
/usr/include/x86_64-linux-gnu/asm/errno.h:
@@ -527,16 +542,6 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/x86_64-linux-gnu/bits/time64.h:
/usr/include/c++/13/bits/streambuf.tcc:
/usr/include/c++/13/bits/specfun.h:
/usr/include/c++/13/bits/basic_string.h:
/usr/include/c++/13/tr1/poly_laguerre.tcc:
/usr/include/x86_64-linux-gnu/bits/endianness.h:
/usr/include/alloca.h:
/usr/include/c++/13/bits/cpp_type_traits.h:
@@ -577,6 +582,10 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:
/usr/include/endian.h:
/usr/include/stdint.h:
/usr/include/c++/13/bits/uniform_int_dist.h:
/usr/include/c++/13/bits/locale_classes.tcc:
@@ -661,10 +670,6 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/sched.h:
/usr/include/endian.h:
/usr/include/stdint.h:
/usr/include/c++/13/bits/stl_iterator_base_types.h:
/usr/include/stdio.h:
@@ -711,12 +716,10 @@ CMakeFiles/Raytracer.dir/main.cpp.o: /home/cjsatnarine/Code/Raytracer/main.cpp \
/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h:
/usr/include/c++/13/cwchar:
/usr/include/x86_64-linux-gnu/sys/select.h:
/usr/include/x86_64-linux-gnu/bits/types/FILE.h:
/home/cjsatnarine/Code/Raytracer/perlin.h:
/usr/include/x86_64-linux-gnu/bits/select.h:
/usr/include/x86_64-linux-gnu/bits/time.h:

View File

@@ -210,6 +210,7 @@ CMakeFiles/Raytracer.dir/main.cpp.o: \
/home/cjsatnarine/Code/Raytracer/camera.h \
/home/cjsatnarine/Code/Raytracer/material.h \
/home/cjsatnarine/Code/Raytracer/texture.h \
/home/cjsatnarine/Code/Raytracer/perlin.h \
/home/cjsatnarine/Code/Raytracer/rtw_stb_image.h \
/home/cjsatnarine/Code/Raytracer/external/stb_image.h \
/usr/include/c++/13/stdlib.h /usr/include/string.h \

Binary file not shown.

717452
image.ppm

File diff suppressed because it is too large Load Diff

View File

@@ -143,8 +143,32 @@ void funny() {
cam.render(hittableList(object));
}
void perlinSpheres() {
hittableList world;
auto perlinTexture = make_shared<noiseTexture>();
world.add(make_shared<sphere>(point3(0,-1000,0), 1000, make_shared<lambertian>(perlinTexture)));
world.add(make_shared<sphere>(point3(0,2,0), 2, make_shared<lambertian>(perlinTexture)));
camera cam;
cam.aspectRatio = 16.0 / 9.0;
cam.imageWidth = 800;
cam.samplesPerPixel = 100;
cam.maxDepth = 50;
cam.vFieldOfView = 20;
cam.lookFrom = point3(13,2,3);
cam.lookAt = point3(0,0,0);
cam.vUp = vec3(0,1,0);
cam.defocusAngle = 0;
cam.render(world);
}
int main(void) {
int sceneToShow = 4;
int sceneToShow = 5;
switch (sceneToShow) {
case 1:
@@ -159,5 +183,8 @@ int main(void) {
case 4:
funny();
break;
case 5:
perlinSpheres();
break;
}
}

63
perlin.h Normal file
View File

@@ -0,0 +1,63 @@
#ifndef PERLIN_H
#define PERLIN_H
#include "rayTracer.h"
class perlin {
public:
perlin() {
randFloat = new double[pointCount];
for (int i = 0; i < pointCount; i++) {
randFloat[i] = randomDouble();
}
permX = perlinGeneratePerm();
permY = perlinGeneratePerm();
permZ = perlinGeneratePerm();
}
~perlin() {
delete[] randFloat;
delete[] permX;
delete[] permY;
delete[] permZ;
}
double noise(const point3& p) const {
auto i = int(4 * p.x()) & 255;
auto j = int(4 * p.y()) & 255;
auto k = int(4 * p.z()) & 255;
return randFloat[permX[i] ^ permY[j] ^ permZ[k]];
}
private:
static const int pointCount = 256;
double* randFloat;
int* permX;
int* permY;
int* permZ;
static int* perlinGeneratePerm(void) {
auto p = new int[pointCount];
for (int i = 0; i < pointCount; i++) {
p[i] = i;
}
permute(p, pointCount);
return p;
}
static void permute(int* p, int n) {
for (int i = n - 1; i > 0; i--) {
int target = randomInt(0, i);
int tmp = p[i];
p[i] = p[target];
p[target] = tmp;
}
}
};
#endif

View File

@@ -1,6 +1,7 @@
#ifndef TEXTURE_H
#define TEXTURE_H
#include "perlin.h"
#include "rayTracer.h"
#include "rtw_stb_image.h"
@@ -72,4 +73,16 @@ class imageTexture : public texture {
rtwImage image;
};
class noiseTexture : public texture {
public:
noiseTexture() {}
colour value(double u, double v, const point3& p) const override {
return colour(1,1,1) * noise.noise(p);
}
private:
perlin noise;
};
#endif