草庐IT

raytracing

全部标签

c++ - 光线追踪 : Only use single ray instead of both reflection & refraction rays

我目前正在尝试理解由KevinBeason(smallpt:http://www.kevinbeason.com/smallpt/)开发的光线追踪器,如果我正确理解代码,他会随机选择反射或折射光线(如果表面既反射又折射).第71-73行:returnobj.e+f.mult(depth>2?(erand48(Xi)谁能解释一下只转换一条射线而不是转换两条射线的缺点?我从未听说过这种技术,我很好奇它的权衡是什么,因为它会大大降低复杂性。 最佳答案 这是一个蒙特卡洛光线追踪器。它的优点是您不会产生呈指数增长的光线数量-这可能会出现在一些

c++ - 有效地计算体素数据的梯度

对于固定大小的体素数据,计算梯度的最有效方法是什么,例如下面的源代码。请注意,我需要空间中任何一点的梯度。梯度将用于估计行进立方体实现中的法线。#importstructVoxelData{VoxelData(float*data,unsignedintxDim,unsignedintyDim,unsignedintzDim):data(data),xDim(xDim),yDim(yDim),zDim(zDim){}std::arrayget_gradient(floatx,floaty,floatz){std::arrayres;//computegradientefficientl

c++ - 反射镜角度的解析法

我在3D空间中有一个固定光线Lr和一个可以围绕固定点Mrot旋转的镜子M,这一点不在镜子的同一平面上,换句话说,镜子平面与以Mrot为中心且半径固定d的球体相切。使用该配置,我想找到一个方程式,该方程式接收点P作为参数,并根据镜子在3D空间中的旋转得出结果。我们可以认为镜像平面没有边界(无限平面)并且它的旋转没有限制。此外,镜子仅在其旋转点的另一侧反射。图中是输入点P1和P2不同的两种情况,分别有解角alpha1和alpha2。图片为2D,简化绘图,真实案例为3D。此刻我在随机旋转计算与镜面的交点,然后计算光线反射,看看离我想到达的点(P)有多远。最后迭代一些条件改变旋转直到它匹配。显

c++ - 如何在光线追踪器中移动相机?

我目前正在研究光线追踪技术,我认为我做得很好;但是,我还没有覆盖相机。到目前为止,我使用了一个位于(-width/2,height/2,200)和(width/2,-height/2)之间的平面片段作为View平面,200)[200只是固定的z个数,可以改变]。除此之外,我主要在e(0,0,1000)上使用相机,并且使用透视投影。我从点e发送光线到像素,并在计算像素颜色后将其打印到图像的相应像素。这是我创建的图像。希望您可以通过查看图像猜出眼睛和View平面的位置。我的问题从这里开始。是时候四处移动我的相机了,但我不知道如何将2DView平面坐标映射到规范坐标。是否有一个转换矩阵?我认

c++ - blender :不可能的立方体

关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。Improvethisquestion我正在从事一个图形项目,试图在3D中创建一个不可能的立方体。一个不可能的立方体看起来像这样:这背后的技巧是两条被“切割”的边缘和一张从特定角度拍摄的照片,给人一种不可能的错觉。好吧,我正在尝试制作这个,但不是静态图像,我希望能够对其进行动画处理(旋转)以保持不可能的属性。我已经成功地在blender中制作了一个立方体,您可以在下面的屏幕截图中看到:我想听听您对如何达到预期效果的建议。一个想法是

c++ - 光线追踪 - 折射错误

我正在写一个光线追踪器。到目前为止,我有漫射、Blinn照明和反射。我的折射出了点问题,我不知道是什么。我希望有人能帮助我。我有一个大的红色漫反射球+Blinn球体和一个折射率n=1.5的小折射球体。小的真的搞砸了。相关代码:ReflectiveSurface::ReflectiveSurface(constColor&_n,constColor&_k):F0(Color(((_n-1)*(_n-1)+_k*_k)/((_n+1)*(_n+1)+_k*_k))){}ColorReflectiveSurface::F(constPoint&N,constPoint&V)const{flo

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

我已经使用以(0,0,0)为中心并直接注视球体基元的相机实现了Phong照明方案。以下是使用OpenGL查看场景以及使用自己实现渲染场景的场景文件的相关内容:ambient010dir_light111-3-4-5#Aredspherewith0.5greenambiance,centeredat(0,0,0)withradius1material00.501001000000001010sphere00001OpenGL生成的结果图像。我的渲染应用程序生成的图像。如您所见,两者之间存在各种差异:我的图像上的镜面高光比OpenGL中的小。漫反射表面似乎没有以正确的方式漫射,导致我的图像

c++ - Raytracer 折射错误

我正在用C++编写光线追踪器,但我遇到了一些折射问题。我正在渲染一个球体和一个地平面,球体应该会折射。然而,它看起来更像是一个球体中的一个球体:“外部”球体看起来被正确着色,但没有折射,而“内部”球体看起来像是被自身遮蔽了。这是它的外观链接:http://imgur.com/QVGkeBT.这是相关代码。//insidemainraytracefunctionif(refraction>0.0f){//thesurfaceisrefractive//calculaterefractionvectorRayrefract(intersection,objList[bestObj]->re

android - android中的球形过滤器

我必须在android中的图像上应用球形滤镜,我附上了输入图像和预期的输出图像。输出图像将从输入图像的平方中心区域进行处理,并将其映射到球体。知道如何在Android中执行此操作。我是必须使用openGL来完成这项任务,还是仅使用2D变换就可以完成任务。 最佳答案 我刚刚在iOS上使用OpenGLES2.0实现了这个工作:虽然这是在iOS上,但我使用的fragment着色器可以直接带到Android上。球面折射部分是使用以下fragment着色器完成的:varyinghighpvec2textureCoordinate;unifor

c++ - 给定相机和 View 平面的 2D 点的 3D 坐标

我希望通过观察平面从相机生成光线。为了做到这一点,我需要我的相机位置(“眼睛”),向上,向右和朝向vector(朝向是相机在相机正在看的物体方向上的vector)和P,视平面上的点。一旦我有了这些,生成的光线就是:ray=camera_eye+t*(P-camera_eye);其中t是沿射线的距离(现在假设t=1)。我的问题是,如果点P位于观察平面上的(i,j)位置,我如何获得它的3D坐标?假设给定视平面的左上角和右下角。注意:从它不会在所有方向上无限延伸的意义上来说,观察平面实际上并不是一个平面。相反,人们可以将此平面视为宽x高图像。在x方向上,范围是0-->宽度,在y方向上,范围是