标签: raytracing

纹理球体没有强烈扭曲

我在几场比赛中看到了纹理良好的球,行星和其他球形物体,上次在不明飞行物:后果.如果你只是将纹理溅入纬度/经度作为你和w -coordinates你会得到很多丑陋的纹理扭曲到两极.

我认为自己是一种实现具有最小失真的球形地图的方法.通过三角形而不是正方形映射.但我不知道任何算法.如何为这样的球体生成顶点和纹理坐标?

此外,我没有看到从简单的扁平方形图生成完整球形贴图的方法.绘制这样的地图有没有直观的方法没有真正的麻烦?

但是,有没有其他算法来渲染没有或具有最小失真的球体?

光线跟踪和光栅化算法都很有趣.

graphics textures raytracing

6
推荐指数
1
解决办法
3635
查看次数

OpenGL渲染与自己的Phong照明实现

我已经使用以(0,0,0)为中心并直接观察球体原始的相机实现了Phong照明方案.以下是场景文件的相关内容,用于使用OpenGL查看场景以及使用我自己的实现渲染场景:

ambient 0 1 0

dir_light  1 1 1       -3 -4 -5

# A red sphere with 0.5 green ambiance, centered at (0,0,0) with radius 1
material  0 0.5 0  1 0 0    1 0 0   0 0 0  0 0 0  10 1 0
sphere   0    0 0 0    1   
Run Code Online (Sandbox Code Playgroud)

这里

由OpenGL生成的结果图像.

这里

我的渲染应用程序生成的图像.

如您所见,两者之间存在各种差异:

  1. 我的图像上的镜面高光小于OpenGL中的镜面高光.
  2. 漫反射表面似乎没有以正确的方式漫射,导致黄色区域在我的图像中不必要地变大,而在OpenGL中,有一个很好的深绿色区域更接近球体的底部
  3. OpenGL生成的颜色比我图像中的颜色深得多.

这些是我看到的最突出的三个差异.以下是我对Phong照明的实现:

R3Rgb Phong(R3Scene *scene, R3Ray *ray, R3Intersection *intersection)
{
  R3Rgb radiance;
  if(intersection->hit == 0)
  {
    radiance = scene->background;
    return radiance;
  }

  R3Vector normal …
Run Code Online (Sandbox Code Playgroud)

c++ opengl reflection raytracing

6
推荐指数
1
解决办法
2666
查看次数

光线跟踪中阴影的正确模型

我想知道计算几种不同光源和环境光产生的阴影的最准确方法.环境光是存在于整个"世界"中的光,具有相同的强度而没有特定的方向,并且漫射光是由点光源的直接照明而发生的照明.

鉴于Ka是表面环境反射率的系数,Ia是环境光的强度,Kd是表面漫反射率,Ip1是第一(相应)点光源的强度,N是表面法线,L1是光(相应的第一个来源)方向.

根据我的参考资料,现场颜色的强度应为:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2)) 其中' .'是点积.

但根据我的理解,真实的光强度应该在光源之间进行某种平均,而不仅仅是将它们加起来,这样如果只有两个光源,则公式应如下所示:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/2

如果有3个光源,但是第三个被阻挡并且不直接照亮表面,那么:

I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/3 (如果有一个所有3个灯都有贡献的地方,它会变得更亮.

我的假设是对的吗?

graphics shader raytracing

6
推荐指数
1
解决办法
1343
查看次数

光线追踪 - 折射bug

我正在写一个光线追踪器.到目前为止,我有漫反射,Blinn照明和反射.我的折射出了点问题,我不知道是什么.我希望有人可以帮助我. 在此输入图像描述

我有一个大的红色漫射+ Blinn球体和一个折射指数n = 1.5的小折射球体.

小的只是搞砸了.

相关代码:

ReflectiveSurface::ReflectiveSurface(const Color& _n, const Color& _k) : 
F0(Color(((_n - 1)*(_n - 1) + _k * _k) / ((_n + 1)*(_n + 1) + _k * _k))) {}

Color ReflectiveSurface::F(const Point& N, const Point& V) const {
    float cosa = fabs(N * V);
    return F0 + (F0 * (-1) + 1) * pow(1 - cosa, 5);
}

Color ReflectiveSurface::getColor(const Incidence& incidence, const Scene& scene, int traceDepth) const {
    Point reflectedDir = reflect(incidence.normal, incidence.direction);
    Ray …
Run Code Online (Sandbox Code Playgroud)

c++ graphics raytracing

6
推荐指数
1
解决办法
1464
查看次数

2D Raytracer 算法

我想做一个用于演示目的的编程RayTracerJava同时给出关于光线追踪的一般介绍(还提到 3D,这个 2D 模型应该只是为了更容易理解,并训练我的一般 Java 知识)。

我的问题是,我不知道从哪里开始这整件事。

我会尝试的第一件事是使用向量从给定的坐标(例如鼠标光标的位置)跟踪屏幕上的每个像素。然后我会计算向量是否与多边形相交,然后我会在那里停止向量并只将它绘制到这个特定点。

也许我什至可以通过计算法线来绘制一些阴影,并以较低的强度在另一个方向反射向量。

那么绘制一个向量A = {everypixelonthescreen}到一个特定的Point P并计算交集是个好主意吗?

完成的版本应该看起来像这样:

在此处输入图片说明

java algorithm raytracing vector

6
推荐指数
1
解决办法
9945
查看次数

如何计算圆柱体表面的法线?

我正在研究光线追踪器,并开始向场景中添加圆柱体。我遇到的问题是找到光线击中点的表面法向量。我需要这个才能进行漫射照明。此时我所拥有的是相机光线撞击圆柱体的 3d 点,以及由中心轴上的点定义的实际圆柱体,向量代表轴的方向和半径。所以总结一下我的问题,如何找到具有圆柱体撞击点、半径、其轴上的点和轴的方向向量的点的法线向量?

math raytracing lighting vector-graphics

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

没有递归光线追踪就不可能反射和折射?

我正在使用 GLSL 计算着色器编写基于 GPU 的实时光线跟踪渲染器。到目前为止,它运行得非常好,但是当涉及同时具有反射和折射时,我偶然发现了一个看似无法解决的问题。

我的逻辑告诉我,为了在物体(例如玻璃)上进行反射和折射,光线必须一分为二,一条光线从表面反射,另一条光线通过表面折射。这些光线的最终颜色将根据某个函数进行组合,并最终用作光线源自的像素的颜色。我的问题是我不能在着色器代码中分割光线,因为我必须使用递归来做到这一点。根据我的理解,着色器中的函数不能递归,因为由于与旧 GPU 硬件的兼容性问题,所有 GLSL 函数都类似于 C++ 中的内联函数。

是否可以在着色器代码中模拟或伪造递归,或者我什至可以在不使用递归的情况下同时实现反射和折射?我看不出没有递归它是如何发生的,但我可能是错的。

c++ opengl recursion raytracing glsl

6
推荐指数
1
解决办法
4694
查看次数

Möller-Trumbore射线交叉最快吗?

对于光线跟踪器项目,我一直在研究处理找到光线和三角形之间交叉的算法(由三个顶点定义).到目前为止我发现的是Möller-Trumbore(MT)算法被普遍使用.

所以我的问题是1)是否有MT的替代方案或算法被认为是计算交叉点的最快方法?2)如果是,MT被证明是最优的还是有人可以想象发明更快的算法?

编辑:我现在看到我的问题与Ray-triangle交叉非常相似

algorithm raytracing intersection linear-algebra

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

OpenCL 光线追踪器在 CPU 上工作正常,但在 GPU 上(总是)不工作

[请看下面的编辑,问题的解决方案可能就在那里]

我正在尝试通过研究一个小型光线追踪器来学习 OpenCL(请参阅下面的代码,来自此链接)。

我没有“真正的”GPU,我目前使用的是带有 Intel(R) Iris(TM) Graphics 6100 显卡的 macosx 笔记本电脑。

该代码在 CPU 上运行良好,但在 GPU 上的行为很奇怪。它的工作(或不工作)取决于每个像素的样本数(在场景中传播光线后穿过像素以获得其颜色的光线数量)。如果我取少量样本 (64),我可以获得 1280x720 的图片,但如果我取 128 个样本,我只能获得较小的图片。据我了解,样本数量不应该改变任何东西(当然图片质量除外)。是否有一些与 OpenCL/GPU 完全相关的东西让我怀念?

此外,似乎是从崩溃的GPU内存中提取结果:

queue.enqueueReadBuffer(cl_output, CL_TRUE, 0, image_width * image_height * sizeof(cl_float4), cpu_output);
Run Code Online (Sandbox Code Playgroud)

在这个阶段我得到一个“中止陷阱:6”。

我错过了一些东西。


[编辑]经过一番研究,我发现了一个有趣的线索:图形卡可能会自愿中止任务,因为它需要太多时间。这种行为本来是为了避免“冻结”屏幕。这个话题就讲那个。

你怎么看?

我找不到关闭这种行为的方法。你知道怎么做吗?


以下是文件:

主.cpp:

// OpenCL based simple sphere path tracer by Sam Lapere, 2016
// based on smallpt by Kevin Beason 
// http://raytracey.blogspot.com 

#include <iostream>
#include <fstream>
#include <vector>
#include <CL\cl.hpp>

using namespace std;
using namespace cl;

const …
Run Code Online (Sandbox Code Playgroud)

c++ raytracing opencl

6
推荐指数
1
解决办法
512
查看次数

这个在GPU上运行的光线追踪功能,GPU安全吗?

我试图在片段着色器中编写一个简单的光线追踪器。我有这个函数应该创建一个漫射球体,如下所示:

在此处输入图片说明

这是功能:

vec3 GetRayColor(Ray ray)
{
Ray new_ray = ray;
vec3 FinalColor = vec3(1.0f);

bool IntersectionFound = false;
int hit_times = 0;

for (int i = 0; i < RAY_BOUNCE_LIMIT; i++)
{
    RayHitRecord ClosestSphere = IntersectSceneSpheres(new_ray, 0.001f, MAX_RAY_HIT_DISTANCE);

    if (ClosestSphere.Hit == true)
    {
        // Get the final ray direction

        vec3 R;
        R.x = nextFloat(RNG_SEED, -1.0f, 1.0f); 
        R.y = nextFloat(RNG_SEED, -1.0f, 1.0f);
        R.z = nextFloat(RNG_SEED, -1.0f, 1.0f);

        vec3 S = normalize(ClosestSphere.Normal) + normalize(R);
        S = normalize(S);

        new_ray.Origin = ClosestSphere.Point;
        new_ray.Direction = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl raytracing glsl

6
推荐指数
1
解决办法
162
查看次数