草庐IT

c++ - GLSL 中光线行进曲面的实现

我一直在阅读很多关于GLSL着色器中光线行进的文章(例如这篇文章:http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm),其中提出了一些我想问的问题。在我的应用程序中,我正在渲染一个带有几个网格的场景,我想尝试使用阴影。虽然我似乎有点理解raymarching如何工作的概念,但我不太了解如何在GLSL中正确实现它。我知道如何计算光线和平面的交点,但如何通过GLSL着色器处理它?根据此处的此线程:(https://gamedev.stackexchange.com/questions/67719/how-do-ray

c++ - 光线追踪不正确的软阴影采样

你好,我正在研究光线追踪算法,但我被蒙特卡洛算法困住了。在没有区域光的情况下渲染时,我的渲染输出是正确的,但是当我将区域光实现添加到源代码以生成软阴影时,我遇到了问题。这是前后输出图像。当我向下移动蓝色球体时,问题仍在继续(请注意,当球体沿白色虚线移动时,伪影仍在继续)。请注意,此球体和区域光具有相同的z偏移量。当我将蓝色球体带到屏幕前时,工件消失了。我认为问题是由均匀采样锥或采样球函数引起的但不确定。这里是函数:templateCVector3UConeSample(Tu1,Tu2,Tcosthetamax,constCVector3&x,constCVector3&y,constC

c++ - 奇怪的光线追踪伪影

我正在尝试使用Qt创建光线追踪器,但我遇到了一些非常奇怪的伪影。在我实现着色之前,我的场景中只有4个球体、3个三角形和2个有界平面。它们都按预期和预期的颜色显示,但是,对于我的飞机,我会看到与背景颜色相同的点。这些点在我的视角位置会保持静止,所以如果我移动相机,这些点也会移动。然而,它们只影响平面和三角形,永远不会出现在球体上。一个我实现的阴影问题变得更糟。这些点现在也出现在光源中的球体上,因此任何部分都会受到漫反射的影响。另外,我的一个纯蓝色平面(RGB0,0,255)直接变黑了。因为我有两架飞机,所以我调换了它们的颜色,蓝色的又变黑了,所以这是颜色问题,而不是飞机问题。如果有人对问

c++ - 使用 OpenCV 进行激光线检测

我正在开展一个项目,我需要在其中检测图像中的红色激光线。这是我想到的策略。分离图像中的R、G、Bchannel。以高强度值对图像进行阈值处理。使用生成的3个二进制图像,执行元素明智的操作r&&!g&&!b。(&&是逻辑与,!是逻辑非)。生成的矩阵是二值图像,其中1位于激光出现的区域。这适用于Matlab上的一些测试图像。但我的问题是,这需要在C/C++中使用OpenCV来实现。我已经尝试过大多数库函数,但似乎没有直观/简单的方法来处理二进制图像并对它们执行逻辑操作。有人可以向我指出您认为我可能会觉得有用的OpenCV函数/方法吗?我认为cvThresholdImage可用于阈值处理,但

c++ - 如果没有递归光线跟踪,反射和折射是不可能的吗?

我正在使用GLSL计算着色器编写基于GPU的实时光线跟踪渲染器。到目前为止,它确实工作得很好,但是当涉及同时具有反射和折射时,我偶然发现了一个看似无法解决的问题。我的逻辑告诉我,为了在一个物体(如玻璃)上产生反射和折射,射线必须分成两束,一束射线从表面反射,另一束射线穿过该表面。这些光线的最终颜色然后将基于某些功能进行组合,并最终用作光线所源自的像素的颜色。我的问题是我无法在着色器代码中拆分光线,因为我必须使用递归来做到这一点。根据我的理解,着色器中的函数不能递归,因为由于与旧GPU硬件的兼容性问题,所有GLSL函数都类似于C++中的内联函数。是否可以在着色器代码中模拟或伪造递归,或者

c++ - 在 GLSL 中优化光线追踪着色器

我编写了一个基于体素化的光线追踪器,它按预期工作但速度很慢。目前raytracer代码如下:#version430//normalizedpositonfrom(-1,-1)to(1,1)invec2f_coord;outvec4fragment_color;structVoxel{vec4position;vec4normal;vec4color;};structNode{//childrenofthecurrentnodeintchildren[8];};layout(std430,binding=0)buffervoxel_buffer{//lastlayerofthetree,

c++ - 以亚像素精度检测激光线的中心

我正在使用C++和OpenCV开发一个简单的“激光线”扫描仪。到目前为止我可以检测到激光线的中心,精度为1个像素,因此我有一个可能的“子像素”函数/算法的起点。(激光线大约15-20像素宽)现在我有兴趣将其改进为亚像素精度。我知道OpenCV有一些亚像素检测功能,但据我所知这些仅用于检测角落。如果有人有任何建议,我很想听听。一些信息;系统:QTFramework、C++、OpenCV库相机;单色(没有颜色),配备红色滤镜图像分辨率;2560x1920注意:激光线只会分析1张图像。 最佳答案 有两种基本方法我用过,效果不错:简单:在一

c++ - 计算机图形行业的人们使用什么进行光线追踪?

关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion去年我参加了计算机图形学类(class)(研究生水平)。我们花了整个学期构建光线追踪器并向其添加功能。我们用C++从头开始构建,大概是为了更好地理解底层数据结构和算法。这是我的问题:如果我要在计算机图形行业找到一份工作,如果我开始从头开始构建一切像这样的光线追踪,人们会认为我疯了吗?是否有类似于OpenGL的支持光线追踪的图形库和框架?OpenGL本身是否支持光线追踪?我的类(class)教授

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++ - 反射镜角度的解析法

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