1. 下载预编译的ispc,安装
resources -> github page
进入ispc 的github的release页:Releases · ispc/ispc · GitHub
找到一个预编译好了的ispc,其中在windows平台上是:https://github.com/ispc/ispc/releases/download/v1.18.0/ispc-v1.18.0-windows.msi
下载安装。
2. 下载预编译的TBB,并解压至自选路径
https://github.com/oneapi-src/oneTBB/releases
https://github.com/oneapi-src/oneTBB/releases/download/v2021.7.0/oneapi-tbb-2021.7.0-win.zip
3.通过vcpkg 安装 OpenimageIO
3.1 下载vcpkg
3.1.1 进入网页
https://github.com/microsoft/vcpkg
3.1.2 下载
git clone --recursive https://github.com/microsoft/vcpkg.git
3.1.3 get vcpkg.exe
执行 E:\vcpkg>bootstrap-vcpkg.bat
3.2 安装OpenImageIO
E:\vcpkg>vcpkg.exe install OpenImageIO:x64-windows
这条命令的执行时间比较久,半个小时可能
4.设置CMake
4.1 ISPC
EMBREE_ISPC_EXECUTABLE 选中:D:\Program Files\ISPC\ispc-v1.18.0-windows\bin\ispc.exe 文件
4.2 TBB cmake能够自动搜索到
4.3 OpenImageIO 的设置
在cmake embree中是指环境变量:
OPENIMAGEIO_ROOT 为vcpkg中package的路径:E:\vcpkg\packages\openimageio_x86-windows
4.3.1 CMakeLists.txt中对OpenImageIO的使用方式:
The package openimageio provides CMake targets:
find_package(OpenImageIO CONFIG REQUIRED)
target_link_libraries(main PRIVATE OpenImageIO::OpenImageIO)
5. PNG问题
Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR)
本来用cmake3.21,并且用vcpkg安装了 libpng x64widonws,甚至还设置了 PNG_ROOT,都么有找到libpng;
后来安装了cmake3.25,却自动找到了 anaconda(以前安装过)中的libpng,无奈了,不改了,能编译就行;
概览:
下载安装 ispc:
https://github.com/ispc/ispc/releases
下载解压 tbb:
https://github.com/oneapi-src/oneTBB/releases
git clone --recursive https://github.com/microsoft/vcpkg.git
bootstrap-vcpkg.bat
vcpkg install openimageio
在cmake embree中是指环境变量:
OPENIMAGEIO_ROOT 为vcpkg中package的路径:E:\vcpkg\packages\openimageio_x86-windows
debug版本编译比较快,最多几分钟
release版慢很多,大概半个小时
6.编译,install
在cmake中,安装路径改为D:盘,否则需要以管理员身份启动vs2022才能有权限INSTALL到C:盘;
默认为debug版本,这样编译比较快,安装后可以调试学习embree本身的代码
ALL_BUILD
INSTALL
分别生成
7.运行
头发这个示例貌似很占内存,几乎把笔记本跑挂,自动关掉了opera
8,测试安装是否成功
创建一个vs2022 c++ 控制台程序,复制,粘贴example代码,
设置项目属性的VC++的包含目录,库目录分别到安装路径下的 include 和 lib,以及链接中的输入项中前边加入 “embree3.lib;”
即可编译调试
//https://www.embree.org/api.html
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#include <embree3/rtcore.h>
#include <limits>
#include <iostream>
int main()
{
RTCDevice device = rtcNewDevice(NULL);
RTCScene scene = rtcNewScene(device);
RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_TRIANGLE);
float* vb = (float*) rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, 3*sizeof(float), 3);
vb[0] = 0.f; vb[1] = 0.f; vb[2] = 0.f; // 1st vertex
vb[3] = 1.f; vb[4] = 0.f; vb[5] = 0.f; // 2nd vertex
vb[6] = 0.f; vb[7] = 1.f; vb[8] = 0.f; // 3rd vertex
unsigned* ib = (unsigned*) rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3, 3*sizeof(unsigned), 1);
ib[0] = 0; ib[1] = 1; ib[2] = 2;
rtcCommitGeometry(geom);
rtcAttachGeometry(scene, geom);
rtcReleaseGeometry(geom);
rtcCommitScene(scene);
RTCRayHit rayhit;
rayhit.ray.org_x = 0.f; rayhit.ray.org_y = 0.f; rayhit.ray.org_z = -1.f;
rayhit.ray.dir_x = 0.f; rayhit.ray.dir_y = 0.f; rayhit.ray.dir_z = 1.f;
rayhit.ray.tnear = 0.f;
rayhit.ray.tfar = std::numeric_limits<float>::infinity();
rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
RTCIntersectContext context;
rtcInitIntersectContext(&context);
rtcIntersect1(scene, &context, &rayhit);
if (rayhit.hit.geomID != RTC_INVALID_GEOMETRY_ID) {
std::cout << "Intersection at t = " << rayhit.ray.tfar << std::endl;
} else {
std::cout << "No Intersection" << std::endl;
}
rtcReleaseScene(scene);
rtcReleaseDevice(device);
}
运行成功: