我目前正在研究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相乘是否正确?
我正在用C++编写一个光线跟踪器,需要能够检查场景中每个对象的交叉点(稍后会进行优化),为此,我需要保留一个运行的类实例列表.在创建新实例时更新的指针列表将无法工作,因为据我所知,在初始化后无法增加数组的大小.如果有的话,我真的很喜欢内置的(到C++)解决方案.
我试图在片段着色器中的网格上进行光线跟踪.我已经编写了下面的着色器来执行此操作(顶点着色器只绘制一个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) 我以前在C++ 中使用(非常基本的)光线跟踪软件.现在想从头开始创建一个高级系统(CSG,光能传递等).
我发现在Haskell中实现它很有意思,因为我也在学习函数式编程.
性能是光线跟踪算法中非常重要的事实.Haskell程序通常比C++程序慢.多少?这取决于具体情况.
考虑到这种情况(即可能是非常复杂的RT),在Haskell中工作是否可行?
所以,我在网上阅读了关于光线跟踪的内容,并在业余时间开始从零开始编写一个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) 我正在研究使用基于顶点的三角形的玩具光线追踪器,类似于 OpenGL。每个顶点都有自己的颜色,三角形在每个点的着色应基于顶点颜色的加权平均值,由该点与每个顶点的接近程度加权。
我无法弄清楚如何计算每种颜色的重量在上的三角形来模拟通过OpenGL做的颜色不均一个给定的点,如通过许多例子在这里。我有几个想法,但我不知道哪一个是正确的(V是一个顶点,U并且W是其他两个顶点,P是该点的颜色,C是三角形的重心,并且|PQ|是距离形状点P至点Q):
1-(|VP|/max(|VU|,|VW|)),因此 V 在两个顶点的较近处具有非零权重,我认为这是不正确的。1-(|VP|/min(|VU|,|VW|)),因此 V 在两个顶点中较近的顶点权重为零,而在两个顶点中较远的顶点权重为负(将饱和为 0)。我不确定这是否正确。L从延伸V穿过P所述三角形的相对侧(UW):重量之比|VP|来|L|。因此,V沿相反侧的权重始终为 0。最后一个似乎最有可能,但我在实施它时遇到了麻烦,所以我不确定它是否正确。
我已经使用 Monte Carlo 方法实现了全局照明,使用 Scratch a pixel 教程作为指导。我的最终图像渲染非常嘈杂!下面的例子是 64 个样本,我以前使用过高达 512 的样本,但它仍然非常嘈杂。
任何想法可能是什么问题?
编辑:这是具有 128 个样本和 16x 超级采样的输出,产生 2048 个样本。噪音还是很大的!
因此,我周末一直在关注光线追踪,最初将所有像素数据写入 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) 我正在使用 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) 我想玩一些图形的东西.简单的动画和事物.我也喜欢光线追踪.我需要帮助找到一个可以帮助我做这些事情的图书馆.我有一些要求:
有谁知道我可以用来愚弄的好图书馆?