标签: raytracing

raycasting:如何正确应用投影矩阵?

我目前正在研究GLSL中的一些光线投射,效果很好.无论如何我现在想从正交投影到透视投影,但我不知道如何正确地做到这一点.关于如何使用投影矩阵与光线投射有任何良好的联系吗?我甚至不确定我应该将矩阵应用到(以某种方式对射线方向?).现在我这样做(伪代码):

vec3 rayDir = (0.0, 0.0, -1.0); //down the negative -z axis in parallel;
Run Code Online (Sandbox Code Playgroud)

但是现在我想使用一个类似于gluPerspective函数的projMatrix,这样我就可以简单地定义宽高比,fov以及近和远平面.所以基本上,任何人都可以为我提供一大堆代码来设置类似的proj矩阵gluProjection吗?其次告诉我将它与rayDirection相乘是否正确?

opengl 3d raytracing glsl perspectivecamera

3
推荐指数
2
解决办法
3371
查看次数

如何保留类的实例列表?

我正在用C++编写一个光线跟踪器,需要能够检查场景中每个对象的交叉点(稍后会进行优化),为此,我需要保留一个运行的类实例列表.在创建新实例时更新的指针列表将无法工作,因为据我所知,在初始化后无法增加数组的大小.如果有的话,我真的很喜欢内置的(到C++)解决方案.

c++ pointers raytracing

3
推荐指数
1
解决办法
1963
查看次数

为什么这个GLSL着色器这么慢?

我试图在片段着色器中的网格上进行光线跟踪.我已经编写了下面的着色器来执行此操作(顶点着色器只绘制一个screenquad).

#version 150

uniform mat4 mInvProj, mInvRot;
uniform vec4 vCamPos;

varying vec4 vPosition;

int test(vec3 p)
{
    if (p.x > -4.0 && p.x < 4.0
     && p.y > -4.0 && p.y < 4.0
     && ((p.z < -4.0 && p.z > -8.0) || (p.z > 4.0 && p.z < 8.0)))
        return 1;
    return 0;
}

void main(void) {
    vec4 cOut = vec4(0, 0, 0, 0);

    vec4 vWorldSpace = mInvRot * mInvProj * vPosition;
    vec3 vRayOrg = vCamPos.xyz;
    vec3 vRayDir = normalize(vWorldSpace.xyz); …
Run Code Online (Sandbox Code Playgroud)

performance shader raytracing glsl

3
推荐指数
1
解决办法
6375
查看次数

Haskell中的光线追踪

我以前在C++ 中使用(非常基本的)光线跟踪软件.现在想从头开始创建一个高级系统(CSG,光能传递等).

我发现在Haskell中实现它很有意思,因为我也在学习函数式编程.

性能是光线跟踪算法中非常重要的事实.Haskell程序通常比C++程序慢.多少?这取决于具体情况.

考虑到这种情况(即可能是非常复杂的RT),在Haskell中工作是否可行?

performance haskell raytracing

3
推荐指数
1
解决办法
2073
查看次数

光线追踪阴影

所以,我在网上阅读了关于光线跟踪的内容,并在业余时间开始从零开始编写一个Raytracer.我正在使用C++,我已经学习了大约一个月了.我已经阅读了网上光线跟踪理论,到目前为止它的工作非常好.它只是一个基本的光线跟踪器,既不使用模型也不使用纹理.

起初它制作了一台雷卡斯特,并对结果非常满意. 在此输入图像描述

那么我尝试了多个对象,它也有效.我刚刚在这个实现中使用了漫反射阴影,并将光的颜色添加到了没有着色的点处的对象颜色. 在此输入图像描述 不幸的是,此代码不适用于多个光源.然后我开始重写我的代码,以便它支持多个灯光.我也读过Phong照明并开始工作: 在此输入图像描述 它甚至适用于多个灯: 在此输入图像描述

到目前为止,我很高兴,但现在我有点卡住了.我已经尝试修复这个问题很长一段时间了,但我什么也没想到.当我添加第二个球体甚至是第三个球体时,只有最后一个球体被照亮.最后,我的意思是我的数组中存储所有对象的对象.请参阅下面的代码. 在此输入图像描述

显然,紫色球体应具有类似的照明,因为它们的中心位于同一平面内.令我惊讶的是,球体只有环境照明 - >阴影,但情况并非如此.

所以现在我的跟踪功能:

Colour raytrace(const Ray &r, const int &depth)
{
    //first find the nearest intersection of a ray with an object
    //go through all objects an find the one with the lowest parameter

    double t, t_min = INFINITY;
    int index_nearObj = -1;//-1 to know if obj found
    for(int i = 0; i < objSize; i++)
    {
        //skip light src
        if(!dynamic_cast<Light *>(objects[i]))
        {
            t = objects[i]->findParam(r);
            if(t > 0 && t < t_min) …
Run Code Online (Sandbox Code Playgroud)

c++ raytracing shadow phong

3
推荐指数
1
解决办法
7832
查看次数

通过顶点颜色为三角形着色的算法

我正在研究使用基于顶点的三角形的玩具光线追踪器,类似于 OpenGL。每个顶点都有自己的颜色,三角形在每个点的着色应基于顶点颜色的加权平均值,由该点与每个顶点的接近程度加权。

我无法弄清楚如何计算每种颜色的重量在上的三角形来模拟通过OpenGL做的颜色不均一个给定的点,如通过许多例子在这里。我有几个想法,但我不知道哪一个是正确的(V是一个顶点,U并且W是其他两个顶点,P是该点的颜色,C是三角形的重心,并且|PQ|是距离形状点P至点Q):

  1. 权重等于 `1-(|VP|/|VC|),但这会在质心处留下黑色(所有颜色的权重均为 0),这是不正确的。
  2. 权重等于1-(|VP|/max(|VU|,|VW|)),因此 V 在两个顶点的较近处具有非零权重,我认为这是不正确的。
  3. 权重等于1-(|VP|/min(|VU|,|VW|)),因此 V 在两个顶点中较近的顶点权重为零,而在两个顶点中较远的顶点权重为负(将饱和为 0)。我不确定这是否正确。
  4. 线段L从延伸V穿过P所述三角形的相对侧(UW):重量之比|VP||L|。因此,V沿相反侧的权重始终为 0。

最后一个似乎最有可能,但我在实施它时遇到了麻烦,所以我不确定它是否正确。

opengl raytracing

3
推荐指数
1
解决办法
1867
查看次数

为什么我的 Monte Carlo Raytracing 如此嘈杂?

我已经使用 Monte Carlo 方法实现了全局照明,使用 Scratch a pixel 教程作为指导。我的最终图像渲染非常嘈杂!下面的例子是 64 个样本,我以前使用过高达 512 的样本,但它仍然非常嘈杂。

任何想法可能是什么问题?

64 个样本,1 个反弹

编辑:这是具有 128 个样本和 16x 超级采样的输出,产生 2048 个样本。噪音还是很大的!

在此处输入图片说明

raytracing intersection render noise light

3
推荐指数
1
解决办法
2562
查看次数

如何使用stbi_write_png将图像像素数据写入png文件

因此,我周末一直在关注光线追踪,最初将所有像素数据写入 ppm 文件,只是尝试写入不同的图像文件格式。我能够在互联网上的一些帮助下写入 bmp 文件,目前我正在尝试将像素数据写入 png。我一直在尝试使用 stbi_write_png 函数,但创建的结果图像与所需的完全不同

我在下面详细介绍了 bmp 部分和 png 以及生成的图像以及这两种实现的代码。

这是bmp写入的代码

#include<iostream>
#include<stdint.h>
#include<fstream>
#include<random>
#include "hitableList.h"
#include "sphere.h"
#include "camera.h"
#include "material.h"
#include <float.h> //for float_MAX
#include "main.h" //contains our typedef declarations, #defines and struct declarations.
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;
typedef int64_t s64;
typedef float f32;

#define STBI_MSC_SECURE_CRT
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"


#define CHANNEL_NUM 3

internal u32 GetTotalPixelSize(image_32 Image)//take …
Run Code Online (Sandbox Code Playgroud)

c c++ raytracing

3
推荐指数
1
解决办法
1万
查看次数

如何在 Rust 的线程之间共享不可变数据?

我正在使用 Rust 开发光线追踪器作为学习该语言的一种方式,并且单线程版本工作得很好。我想通过多线程来加速它,并且在 C/C++ 中对光线跟踪器进行多线程处理相对容易,因为大多数共享数据是只读的(唯一的问题发生在写入像素数据时)。但我在 Rust 及其所有权规则方面遇到了更多麻烦。

我对世界上可能受到打击的不同类型的事物(球体、网格体)有一个特征Hittable: Send + Sync,我将实现留空,Send因为Sync我实际上不需要它们中的任何一个。然后我有一个类型为世界对象的向量Vec<Box<dyn Hittable>>。对于实际的多线程,我正在尝试这样的事情:

    let pixels_mutex: Arc<Mutex<Vec<Vec<(f64, f64, f64, u32)>>>> = Arc::new(Mutex::new(pixels));
    let vec_arc: Arc<Vec<Box<dyn Hittable>>> = Arc::new(vec);

    let mut thread_vec: Vec<thread::JoinHandle<()>> = Vec::new();

    for _ in 0..NUM_THREADS {
        let camera_clone = camera.clone();
        thread_vec.push(thread::spawn(move || {
            for r in 0..RAYS_PER_THREAD {
                if r % THREAD_UPDATE == 0 {
                    println!("Thread drawing ray {} of {} ({:.2}%)", r, RAYS_PER_THREAD, (r as f64 * 100.) / (RAYS_PER_THREAD …
Run Code Online (Sandbox Code Playgroud)

multithreading raytracing rust

3
推荐指数
1
解决办法
6813
查看次数

3D和光线追踪的最佳选择

我想玩一些图形的东西.简单的动画和事物.我也喜欢光线追踪.我需要帮助找到一个可以帮助我做这些事情的图书馆.我有一些要求:

  • 必须能够做光线追踪
  • 必须是高级语言(python,.NET等).请不要C/C++
  • 必须有良好的文档,最好有示例.

有谁知道我可以用来愚弄的好图书馆?

3d graphics raytracing

2
推荐指数
2
解决办法
2329
查看次数