问题标签 [embree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 光线追踪网格上的伪影黑线(使用 Embree)
我正在开发基于 Embree 的光线追踪器(目前处于开发初期)。如果您不熟悉 Embree,您可以在他们的网页上阅读更多内容。
问题:目前,如果您启动渲染器以每像素和每次迭代使用 1 条光线(从现在开始称为 1 条光线模式),它的渲染器就好了。如果你设置它在一个数据包中跟踪 4 条光线raypacket4
(
问题截图 截图相机参数为(均在光线包模式下):
- 位置 0, 1, 0, 旋转 20, 0, 0
- 位置 0, 38, 0 旋转 90, 0, 0
- 位置 9.5, 5, 0 旋转 90, 0, 0
- 位置 9.5, 38, 0 旋转 90, 0, 0
调查表明,这些线只出现在 pakcet 模式下,并且距离网格有一段距离。我在几个不同的相机位置发布了问题的屏幕(渲染图像)。这里是项目的源代码(在 GitHub 上)Source Code
我敢打赌,问题出在数据包生成(位于camera.cpp/GetRayPacket4
)或渲染中(renderer.h/RenderBuffer4, Raytrace4
)。模式之间的切换是在 main.cpp 中通过替换RenderToBuffer4
和RenderToBuffer
来RTC_INTERSECT4
完成的RTC_INTERSECT1
。
非常感谢任何帮助或想法。
编辑:
对于缺少配置文件或场景文件,我深表歉意,它目前处于非常早期的开发阶段(花了 2 天),目前所有内容都经过硬编码以进行测试。
编辑2:
我发现在 GetRayPacket4 中移除光线方向计算中的 + i 可以解决问题,但是 4 条打包光线是相同的。为什么要解决它?
math - 当相机远离圆环时,射线和圆环方程相交的数值错误
我试图在不对环面进行三角剖分的情况下,仅通过与射线和环面解析方程相交来对环面进行射线追踪。我使用以下代码做到了这一点:
求解SolveP4
函数方程的代码取自求解三次和二次函数。
问题是当我们仔细观察环面时,它的效果非常好,如下所示:
但是当我缩小相机时,相机正看着远离它的圆环,它突然变得如此嘈杂,并且它的形状没有很好地识别。我尝试使用每个像素超过 1 个样本,但我仍然遇到同样的问题。如下:
看来我面临一个数值问题,但我不知道如何解决它。任何人都可以帮助我吗?
另外,值得一提的是,我正在使用英特尔的 Embree Lib 对圆环进行光线追踪。
更新(单色):
linker - 同时使用 OpenCL 和 embree
我想将英特尔库 embree 与 OpenCL 结合使用,但它对我不起作用。为了向您展示问题,我创建了一个小代码来获取所有 OpenCL 设备:
如果我编译这段代码:
我得到以下输出:
如果我编译相同的代码:
我无法再找到我的 CPU 作为可用的 OpenCL 设备,因为我得到以下输出:
谁能帮我把我的 CPU 重新作为 OpenCL 设备?
c++ - 我应该通过 API 还是通过项目的源代码本身来使用 Intel Embree?
我正在考虑在我的渲染器中使用 Intel Embree,目前正在使用 Embree 教程。
那么,问题是,是否可以通过 API 有效地使用 Intel Embree?
我的意思是,我可以看到这些函数 <embree2/rtcore.h>, <embree2/rtcore_ray.h>, e.t.c
使用了一些内部数据结构,例如RTCRay
. 显然,由于我不能重载任何运算符,我总是必须将我的数据结构转换为 Embree 数据结构,反之亦然。这甚至不仅仅是一个类型转换,它是一个新对象的构造。
例如,在调用之前,rtcIntersect(RTCScene scene, RTCRay ray);
我从我的类对象构造RTCRay
射线Ray
,然后当函数返回一些数据时,我将一些值复制回来。
这看起来不是使用 Intel Embree 的好方法。
windows - 无法将 Embree 添加到我的项目中,出现 LNK1104 错误
我正在尝试将 Embree 添加到已经工作的解决方案中,在此资源之后,我已将以下内容添加到我的CMakeLists.txt
文件中:
我还embree_DIR
使用我的 Embree 安装文件夹(“C:\Program Files\Intel\Embree3 x64”)创建了一个 Windows 环境变量。
CMake 可以很好地配置解决方案,但是当我构建时,我得到一个fatal error LNK1104: impossible to open 'embree3.lib'
.
只是让你知道,我实际上有一个C:\Program Files\Intel\Embree3 x64\lib\embree3.lib
文件。
任何人都知道为什么会发生这种情况?
windows - `pyembree` 的 CMake 构建帮助
我正在寻找pyembree
使用 CMake for Windows 从源代码构建的帮助。GitHub 上列出了有关此问题历史的更多详细信息。刚刚删除了对 conda-forge 的 Windows 支持pyembree
,因此非常感谢您提供任何帮助!
安装说明
系统
测试:
操作系统: Windows 10 x64 专业版,内部版本 1909 Python: 3.8.10
脚步
- 安装Microsoft Visual C++ 14.X 和 Windows 10 SDK。这些是构建
cython
代码所必需的。
(注意: Microsoft Visual Studio 的版本与 Microsoft Visual C++ 的版本不同。Visual Studio 2015、2017 和 2019 都有 MSVCv14X 构建工具。在撰写本文时,安装 Visual Studio 2019 构建工具
MSVCv142 - VS 2019 C++ x64/x86 build tools
和Windows 10 SDK (10.0.18362.0)
组件就足够了(
Desktop development with C++
如果安装 Visual Studio 2019,请选择工作负载)。
- 安装vcpkg
C:\\vcpkg
并将路径添加到您的System Environment Variables
:
- 安装
embree2 64-bit
:
注意: 迄今为止,pyembree 仍然依赖于 Embree 2,并且尚未针对 Embree 3 进行更新。
安装cmake。
venv
创建您的项目文件夹并使用(使用)初始化虚拟环境Python 3.6 - 3.8
。在此示例中,Python 3.8.5 x64-bit
选择它是因为它是Miniconda py38_4.9.2
.安装以下软件包:
将以下cmake 模块添加到您的系统 cmake 模块文件夹(例如
C:\Program Files\CMake\share\cmake-3.21\Modules\
)。导航到
<virtual environment folder>\Lib\site-packages
并克隆pyembree
repo:
- 将目录更改为
pyembree
文件夹并创建以下顶级CMakeLists.txt
- 移动到子文件夹
pyembree
并创建以下子级别CMakeLists.txt
:
替换<system python path>
(例如C:/Program Files/Python38
)并<virtual environment folder>
相应地。
- 移回顶级
pyembree
文件夹并创建以下setup.py
文件:
- 将以下行添加到每个
*.pyx
和*.pxd
文件的顶部pyembree
:
pyembree
通过从顶级文件夹运行以下命令来构建和安装pyembree
:
- 最后,安装
rtree
和trimesh
:
当前挑战
我被困在py setup.py build
.
- 目前,我需要将
embree
标头和库(.lib
和.dll
)复制并粘贴到源文件夹(<virtual environment folder>/Lib/site-packages/pyembree
)和生成的构建文件夹(<virtual environment folder>\Lib\site-packages\pyembree\_skbuild\win-amd64-3.8\cmake-build\pyembree
)
我可以在 CMake 中使用复制文件命令吗?
- 运行时
py setup.py build
,我收到、和LNK201: unresolved external symbol
的链接器错误。我相信这是一个 DLL 构造,它仅适用于 C 语言和共享库(不是静态库),所以我有点困惑。__imp_rtcMapBuffer
__imp_rtc_NewTriangleMesh
__imp_rtcUnmapBuffer
__imp_
对此错误的任何帮助也将不胜感激!
c++ - Embree: stream mode - how does gather and scatter work and what are pid and tid?
I'm trying to upgrade my application from single ray intersection to stream intersection.
What I don't quite understand is how it's possible that the gather
and scatter
functions shown in the tutorials are even working
The example defines a custom extended ray struct Ray2
then it defines an array of these Ray2
structs:
this array is set as the userRayExt before calling the intersection method:
now, for each ray bundle that embree intersects with geometry, the filter callback is invoked:
the last line of this method is what I don't understand
I understand what it is SUPPOSED to do. It should update the transparency property of the Ray2
that corresponds to the traced ray with T. But I don't get why/how this works, since the implementation of scatter
looks like this:
I will reformulate this function a bit to better ask my question (but it should be completely equivalent if I'm not mistaken):
So, the first line still makes sense for me. A pointer to the transparency field of the first Ray2 struct is constructed and then incremented by tid * sizeof(Ray2)
- this makes sense as it will land on another transparency
field, since it is incremented by a multiple of sizeof(Ray2)
but then the next line
I don't get at all. uptr
is a float pointer, pointing to a transparency field. So unless rid
itself is a multiple of sizeof(Ray2)
, this won't point to a transparency field of one of the rays at all.
pid
and rid
are calculated as
which I find weird. Isn't that always the same as
?
what are pid
and rid
and why are they computed like this?