Selaa lähdekoodia

güsel commit

manuel5975p 4 vuotta sitten
vanhempi
commit
6c95120753
5 muutettua tiedostoa jossa 82 lisäystä ja 13 poistoa
  1. 10 0
      CMakeLists.txt
  2. 28 8
      camera.cpp
  3. 5 3
      main.cpp
  4. 36 2
      material.hpp
  5. 3 0
      scene.hpp

+ 10 - 0
CMakeLists.txt

@@ -26,6 +26,14 @@ FetchContent_GetProperties(lodepng)
 if(NOT lodepng_POPULATED)
     FetchContent_Populate(lodepng)
 endif()
+FetchContent_Declare(
+    xoshiro
+    GIT_REPOSITORY https://github.com/manuel5975p/xoshiro-cpp.git
+)
+FetchContent_GetProperties(xoshiro)
+if(NOT xoshiro_POPULATED)
+    FetchContent_Populate(xoshiro)
+endif()
 
 add_executable(chnuscht 
     main.cpp
@@ -35,7 +43,9 @@ add_executable(chnuscht
 )
 target_include_directories(chnuscht PUBLIC "${objloader_SOURCE_DIR}/include")
 target_include_directories(chnuscht PUBLIC "${lodepng_SOURCE_DIR}")
+target_include_directories(chnuscht PUBLIC "${xoshiro_SOURCE_DIR}")
 option(EMBREE_TUTORIALS OFF FORCE)
+option(EMBREE_ISPC_SUPPORT OFF FORCE)
 FetchContent_Declare(
     embree
     GIT_REPOSITORY https://github.com/embree/embree/

+ 28 - 8
camera.cpp

@@ -8,6 +8,7 @@ struct hit{
     Vector3f indir;
     Vector3f outdir;
     const material& mat;
+    Vector2f uv;
 };
 std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sampler _rng)const{
     using namespace Eigen;
@@ -55,13 +56,13 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                     if(rayhit.hit.geomID != RTC_INVALID_GEOMETRY_ID){
                         if(sc.emitters.contains(rayhit.hit.geomID)){
 
-                            Eigen::Vector3d transport(sc.added_objects[sc.geom_id_to_object_index_map.find(rayhit.hit.geomID)->second]->mat.tex->eval(0,0).cast<double>());
+                            Eigen::Vector3d transport(sc.added_objects[sc.geom_id_to_object_index_map.find(rayhit.hit.geomID)->second]->mat.tex->eval(Vector2f(0,0)).cast<double>());
                             for(auto it = hits.rbegin();it != hits.rend();it++){
                                 transport.array() *= (it->mat.m_bsdf->eval(
                                     -it->outdir,
                                     -it->indir,
                                     it->normal
-                                ).array().cast<double>()) * it->mat.tex->eval(0,0).array().cast<double>();
+                                ).array().cast<double>()) * it->mat.tex->eval(it->uv).array().cast<double>();
                                 for(const auto& pl : sc.pointlight){
                                     struct RTCIntersectContext sh_context;
                                     rtcInitIntersectContext(&sh_context);
@@ -83,7 +84,7 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                                     raycasts++;
                                     rtcOccluded1(sc.m_scene, &sh_context, &rsh_ray);
                                     if(rsh_ray.tfar > 0){
-                                        transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(0,0).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
+                                        transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(it->uv).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
                                     }
                                 }
                             }
@@ -99,12 +100,31 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                         if(newdir.dot(hitnormal) <= 0){
                             newdir *= -1.0f;
                         }
+                        Vector2f uvcoordinate(0,0);
+                        {
+                            if(auto v = dynamic_cast<mesh_object*>(sc.added_objects[sc.geom_id_to_object_index_map.find(rayhit.hit.geomID)->second].get())){
+                                std::array<size_t, 3> triangle_indices;
+                                triangle_indices[0] = sc.added_meshes[v->mesh_index].Indices[rayhit.hit.primID * 3 + 0];
+                                triangle_indices[1] = sc.added_meshes[v->mesh_index].Indices[rayhit.hit.primID * 3 + 1];
+                                triangle_indices[2] = sc.added_meshes[v->mesh_index].Indices[rayhit.hit.primID * 3 + 2];
+                                const objl::Vertex& v0 = sc.added_meshes[v->mesh_index].Vertices[triangle_indices[0]];
+                                const objl::Vertex& v1 = sc.added_meshes[v->mesh_index].Vertices[triangle_indices[1]];
+                                const objl::Vertex& v2 = sc.added_meshes[v->mesh_index].Vertices[triangle_indices[2]];
+                                float hu = rayhit.hit.u;
+                                float hv = rayhit.hit.v;
+                                uvcoordinate = 
+                                hu  * Eigen::Map<const Eigen::Vector2f>(reinterpret_cast<const float*>(&v1.TextureCoordinate)) + 
+                                hv  * Eigen::Map<const Eigen::Vector2f>(reinterpret_cast<const float*>(&v2.TextureCoordinate)) + 
+                     (1 - hu  - hv) * Eigen::Map<const Eigen::Vector2f>(reinterpret_cast<const float*>(&v0.TextureCoordinate));
+                            }
+                        }
                         hits.push_back(hit{
                             Vector3f(rayhit.ray.org_x, rayhit.ray.org_y, rayhit.ray.org_z),
                             hitnormal,
                             Vector3f(rayhit.ray.dir_x, rayhit.ray.dir_y, rayhit.ray.dir_z),
                             newdir,
-                            (sc.added_objects[sc.geom_id_to_object_index_map.find(rayhit.hit.geomID)->second]->mat)
+                            (sc.added_objects[sc.geom_id_to_object_index_map.find(rayhit.hit.geomID)->second]->mat),
+                            uvcoordinate
                         });
                         transport *= newdir.dot(hitnormal);
                         rayhit.ray.dir_x = newdir.x();
@@ -118,7 +138,7 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                                 -it->outdir,
                                 -it->indir,
                                 it->normal
-                            ).array().cast<double>() * it->mat.tex->eval(0,0).array().cast<double>();
+                            ).array().cast<double>() * it->mat.tex->eval(it->uv).array().cast<double>();
                             for(const auto& pl : sc.pointlight){
                                 struct RTCIntersectContext sh_context;
                                 rtcInitIntersectContext(&sh_context);
@@ -140,7 +160,7 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                                 raycasts++;
                                 rtcOccluded1(sc.m_scene, &sh_context, &rsh_ray);
                                 if(rsh_ray.tfar > 0){
-                                    transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(0,0).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
+                                    transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(it->uv).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
                                 }
                             }
                         }
@@ -155,7 +175,7 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                         -it->outdir,
                         -it->indir,
                         it->normal
-                    ).array().cast<double>()) * it->mat.tex->eval(0,0).array().cast<double>();
+                    ).array().cast<double>()) * it->mat.tex->eval(it->uv).array().cast<double>();
                     for(const auto& pl : sc.pointlight){
                         struct RTCIntersectContext sh_context;
                         rtcInitIntersectContext(&sh_context);
@@ -177,7 +197,7 @@ std::vector<Eigen::Vector3f> camera::get_image(const scene& sc, size_t n, sample
                         raycasts++;
                         rtcOccluded1(sc.m_scene, &sh_context, &rsh_ray);
                         if(rsh_ray.tfar > 0){
-                            transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(0,0).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
+                            transport.array() += pl.color.cast<double>().array() * it->mat.m_bsdf->eval(-sh_ray.normalized(), it->indir, it->normal).cast<double>().array() * it->mat.tex->eval(it->uv).array().cast<double>() * (1.0 / double(sh_ray_length * sh_ray_length));
                         }
                     }
                 }

+ 5 - 3
main.cpp

@@ -47,7 +47,7 @@ int main(){
                    0,0,0,1;
             scene.add_object(ajax_mesh, trf, false);
             scene.added_objects.back()->mat.tex = std::make_unique<uni_texture>(Color(o1(gangles), o1(gangles), o1(gangles)));
-            scene.added_objects.back()->mat.m_bsdf = std::make_unique<microfacet_bsdf>(0.8);
+            //scene.added_objects.back()->mat.m_bsdf = std::make_unique<microfacet_bsdf>(0.8);
         }
     }
     
@@ -56,10 +56,12 @@ int main(){
            0,0,40,0,
            0,0,0,1;
     scene.add_object(quad_mesh, trf, false);
+    scene.added_objects.back()->mat.tex = std::make_unique<quad_checkerboard_texture>(Color(1,0,0), Color(0,1,0), Color(0,0,1), Color(0,0,0));
 
     //scene.add_sphere(Vector3f(-1.5,0,0),0.5, true);
-    scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,0), Eigen::Vector3f(1,1,0)});
-    scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,2), Eigen::Vector3f(0,1,1)});
+    scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,0), Eigen::Vector3f(1,0,0)});
+    scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,1), Eigen::Vector3f(0,1,0)});
+    scene.pointlight.push_back(pointlight{Eigen::Vector3f(2,0,2), Eigen::Vector3f(0,0,1)});
     scene.build();
     camera cam(Vector3f(0, 0.6 * 5, 2.4 * 5),Vector3f(0,0,0), Vector3f(0,1,0));
     sampler simp;

+ 36 - 2
material.hpp

@@ -5,17 +5,51 @@
 #include "warping.hpp"
 using Color = Eigen::Vector3f;
 struct texture{
-    virtual Eigen::Vector3f eval(float u, float v)const{
+    virtual Eigen::Vector3f eval(const Eigen::Vector2f& uv)const{
         return Eigen::Vector3f(1,1,1);
     }
 };
 struct uni_texture : texture{
     Color c;
     uni_texture(const Color& _c) : c(_c){}
-    virtual Eigen::Vector3f eval(float u, float v)const override{
+    virtual Eigen::Vector3f eval(const Eigen::Vector2f& uv)const override{
         return c;
     }
 };
+struct checkerboard_texture : texture{
+    Color c1;
+    Color c2;
+    checkerboard_texture(const Color& _c1, const Color& _c2) : c1(_c1), c2(_c2){}
+    virtual Eigen::Vector3f eval(const Eigen::Vector2f& uv)const override{
+        int i = uv(0) * 100.f;
+        int j = uv(1) * 100.f;
+        return ((i ^ j) & 1) ? c1 : c2;
+    }
+};
+
+struct quad_checkerboard_texture : texture{
+    Color c1;
+    Color c2;
+    Color c3;
+    Color c4;
+    quad_checkerboard_texture(const Color& _c1, const Color& _c2, const Color& _c3, const Color& _c4) : c1(_c1), c2(_c2), c3(_c3), c4(_c4){}
+    virtual Eigen::Vector3f eval(const Eigen::Vector2f& uv)const override{
+        int i = uv(0) * 100.f;
+        int j = uv(1) * 100.f;
+        int id = ((i ^ j) & 3);
+        switch(id){
+            case 0:
+            return c1;
+            case 1:
+            return c2;
+            case 2:
+            return c3;
+            case 3:
+            default:
+            return c4;
+        }
+    }
+};
 struct bsdf{
     virtual Color eval(const Eigen::Vector3f& in, const Eigen::Vector3f& out, const Eigen::Vector3f& normal)const{
         throw 5;

+ 3 - 0
scene.hpp

@@ -12,13 +12,16 @@
 struct scene_object {
     material mat;
     scene_object(material&& _mat) : mat(std::move(_mat)){}
+    virtual void kueder(){}
 };
 struct mesh_object : scene_object{
     size_t mesh_index;
     mesh_object(size_t mi, material&& _mat) : mesh_index(mi), scene_object(std::move(_mat)){}
+    virtual void kueder(){}
 };
 struct sphere_object : scene_object{
     sphere_object(material&& _mat) : scene_object(std::move(_mat)){}
+    virtual void kueder(){}
 };
 struct pointlight{
     Eigen::Vector3f pos;