我有一个基本的光线跟踪器,我想实现景深.能否请您推荐我可以使用的资源,书籍和代码?
谢谢
我正在从头开始构建光线追踪器。我的问题是:当我更改相机坐标时,球体更改为椭圆形。我不明白为什么会这样。
以下是一些显示文物的图像:
Sphere: 1 1 -1 1.0 (Center, radius)
Camera: 0 0 5 0 0 0 0 1 0 45.0 1.0 (eyepos, lookat, up, foy, aspect)
Run Code Online (Sandbox Code Playgroud)

但是当我更改相机坐标时,球体看起来扭曲,如下所示:
Camera: -2 -2 2 0 0 0 0 1 0 45.0 1.0
Run Code Online (Sandbox Code Playgroud)

我不明白出了什么问题。如果有人可以提供帮助那就太好了!
我将 imagePlane 设置如下:
//Computing u,v,w axes coordinates of Camera as follows:
{
Vector a = Normalize(eye - lookat); //Camera_eye - Camera_lookAt
Vector b = up; //Camera Up Vector
m_w = a;
m_u = b.cross(m_w);
m_u.normalize();
m_v = m_w.cross(m_u);
}
Run Code Online (Sandbox Code Playgroud)
之后,我从相机位置(眼睛)计算每个像素的方向,如下所述: …
我正在尝试实现 Microfacet BRDF 着色模型(类似于 Cook-Torrance 模型),但我在本文中定义的贝克曼分布方面遇到了一些问题:https : //www.cs.cornell.edu/~srm/publications /EGSR07-btdf.pdf

其中 M 是微面法线,N 是宏观面法线,ab 是 [0, 1] 之间的“硬度”参数。
我的问题是这种分布通常会返回非常大的值,尤其是当 ab 非常小时。
例如,贝克曼分布用于计算根据以下方程生成微平面法线 M 的概率:

概率必须在范围 [0,1] 之间,那么如果贝克曼分布给我的值大小为 1000000000+,那么如何使用上面的函数获得该范围内的值?
那么有没有合适的方法来限制分布?还是我误解了它或概率函数?如果值超过 1,我曾尝试简单地将其钳位为 1,但这并没有真正给我想要的结果。
我正在用 java 编写光线追踪器,并尝试实现折射,但我对在该主题上找到的信息感到困惑。如果我有入射光线的 3D 矢量、以 3D 矢量形式给出的表面法线以及两种介质的折射率,我需要应用哪些操作才能获得透射光线的矢量?
我目前正在研究路径追踪器,我正在寻找优化我的光线三角形交叉点的方法。我目前使用以下 Moller-Trumbore 算法的 sse4 实现:
bool Ray::intersectTriangle(const Triangle tri, float& result) const
{
__m128 q = _mm_cross_ps(m_directionM128, tri.e2);
float a = _mm_dp_ps(tri.e1, q, dotProductMask).m128_f32[0];
if (a > negativeEpsilon && a < positiveEpsilon)
return false;
float f = 1.0f / a;
__m128 s = _mm_sub_ps(m_originM128, tri.v0);
float u = f * _mm_dp_ps(s, q, dotProductMask).m128_f32[0];
if (u < 0.0f)
return false;
__m128 r = _mm_cross_ps(s, tri.e1);
float v = f * _mm_dp_ps(m_directionM128, r, dotProductMask).m128_f32[0];
if (v < 0.0f || (u + v …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的光线跟踪器作为一个爱好项目,它现在都工作正常,除了我无法使软阴影工作.我对软阴影的想法是,光源被认为具有位置和半径.为了对这个光进行阴影测试,我得到主光线撞击场景中物体的点,并向光源投射n个光线,每个新光线对每个轴都有一个随机分量,随机分量变化介于-radius和radius之间.
如果这样的光线撞击场景中的物体,我会增加一个接收器(如果一条光线击中多个物体,它仍然只增加一个).如果它在没有碰撞的情况下进入光源,我将主光线交叉点到光源中心的距离加到变量上.
当拍摄n个样本时,我计算出碰撞的光线的比率,并将光的颜色乘以该比率(因此,颜色为1000,1000,1000的光将变为500,500,500,比率为0.5,其中一半光线碰撞了).然后我通过将先前的距离变量除以非碰撞射线的数量来计算到光源的平均距离.我返回该变量,函数退出.
问题是:它不起作用.至少不是这样.它的外观可以在这里看到.你可以看到它有点像软阴影,如果你真的很难眯眼.
我不明白,我在这里制造某种根本性的缺陷,还是它有点小?我很确定问题出在这种方法中,因为当我计算这种方法直接产生的部分点亮像素的数量时,只有大约250,当应该有更多.当你仔细观察图片时,你会看到有一些部分亮起的像素,暗示其余的代码处理部分亮起的像素就好了.
这是软阴影类的实际灯光:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyFirstRayTracer
{
public class AreaLight : ILight
{
private const int _radius = 5;
private const int _samples = 16;
public Color Color { get; set; }
public Vector Location { get; set; }
#region ILight Members
public float GetLightingInformation(Vector point, ISceneObject[] scene, out Color color)
{
int intersectCount = 0;
float distance = -1;
for(int i = 0; i < _samples; i++) …Run Code Online (Sandbox Code Playgroud) 我有一个简单的光线跟踪器,只能回到第一个交叉点.使用两个不同的光源,场景看起来很好,但是当两个灯都在场景中时,有一个黑暗的阴影,即使在另一个光源的照明区域的中间,一端的照明区域也是如此(特别是在绿球).从"两个光源点亮的区域"到"仅由一个光源点亮的区域"的过渡似乎比"仅由一个光源点亮的区域"稍微暗一些.

我添加灯光效果的代码是:
// trace lights
for ( int l=0; l<primitives.count; l++) {
Primitive* p = [primitives objectAtIndex:l];
if (p.light)
{
Sphere * lightSource = (Sphere *)p;
// calculate diffuse shading
Vector3 *light = [[Vector3 alloc] init];
light.x = lightSource.centre.x - intersectionPoint.x;
light.y = lightSource.centre.y - intersectionPoint.y;
light.z = lightSource.centre.z - intersectionPoint.z;
[light normalize];
Vector3 * normal = [[primitiveThatWasHit getNormalAt:intersectionPoint] retain];
if (primitiveThatWasHit.material.diffuse > 0)
{
float illumination = DOT(normal, light);
if (illumination > 0)
{
float diff = illumination * …Run Code Online (Sandbox Code Playgroud) 我是新手使用PBRT(基于物理的光线跟踪)..如何查看.pbrt文件的图像.
我在命令提示符下完成了以下步骤:
set PBRT_SEARCHPATH=C:\pbrt-1.03-lc\bin
cd C:\pbrt-1.03-lc\scenes\Conference
..\..\bin\pbrt.exe conference.pbrt
Run Code Online (Sandbox Code Playgroud) 所以在我的光线追踪器中,我正在建造我已经得到了折射以适应球体以及腐蚀效果,但玻璃球看起来并不是特别好.我相信折射数学是正确的,因为光看起来是弯曲的,以你想象的方式反转,但它看起来不像玻璃,它看起来像纸或什么的.
我已经读到全部内部反射是导致玻璃看起来像是什么的原因所在,但是当我测试看我的折射光线是否超过临界角时,它们都没有,所以我的玻璃球没有全内反射.我不确定这是否正常或者我做错了什么.我已经在下面发布了我的折射码,所以如果有人有任何建议,我很乐意听到它们.
/*
* Parameter 'dir' lets you know whether the ray is starting
* from outside the sphere going in (0) or from in the sphere
* going back out (1).
*/
void Ray::Refract(Intersection *hit, int dir)
{
float n1, n2;
if(dir == 0){ n1 = 1.0; n2 = hit->mat->GetRefract(); }
if(dir == 1){ n1 = hit->mat->GetRefract(); n2 = 1.0; }
STVector3 N = hit->normal/hit->normal.Length();
if(dir == 1) N = -N;
STVector3 V = D/D.Length();
double c1 = -STVector3::Dot(N, …Run Code Online (Sandbox Code Playgroud) 所以我正在努力建造一个牵引器.我按照本教程:https://www.youtube.com/watch?v = SMOJGxyd9BE&list = PLHm_I0tE5kKPPWXkTTtOn8fkcwEGZNETh&index = 9
所以一切都很好,除了遇到一个问题.我试图让球体在球体下反射,但是当我这样做时,我得到了这种奇怪的效果

如果你注意到地面上的反射有这些黑点.我一直试图找出最新情况,但奇怪的是因为整个飞机具有相同的法线,所以反射应该是正确的.有没有人有这方面的经验?我检查了它与阴影无关.
raytracing ×10
graphics ×3
c++ ×2
3d ×1
aero-glass ×1
algorithm ×1
c# ×1
clamp ×1
game-physics ×1
java ×1
objective-c ×1
pbrt ×1
probability ×1
rendering ×1
shader ×1
shadow ×1
transparency ×1
vector ×1