Ray tracing 光线追踪 之 embree ,从入门到精通 02 从源码编译与安装

8 篇文章 4 订阅

1. 下载预编译的ispc,安装 

        网址: https://ispc.github.io

        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;”

即可编译调试

API Examples

//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);
}

运行成功: 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
射线追踪法是一种计算机图形学中常用的算法,用于生成逼真的图像。直达波ray tracing 试射法是射线追踪算法的一种应用,可以模拟光线直接从光源射到物体表面上的效果。以下是一个简单的C源代码示例: ```c #include <stdio.h> typedef struct { float x; float y; float z; } Vector3; typedef struct { Vector3 origin; Vector3 direction; } Ray; typedef struct { Vector3 position; Vector3 normal; } Plane; int intersectRayPlane(Ray ray, Plane plane, float* t) { float denominator = plane.normal.x * ray.direction.x + plane.normal.y * ray.direction.y + plane.normal.z * ray.direction.z; if (denominator == 0) { return 0; } float numerator = plane.normal.x * (plane.position.x - ray.origin.x) + plane.normal.y * (plane.position.y - ray.origin.y) + plane.normal.z * (plane.position.z - ray.origin.z); *t = numerator / denominator; if (*t >= 0) { return 1; } return 0; } int main() { Ray ray; ray.origin.x = 0; ray.origin.y = 0; ray.origin.z = 0; ray.direction.x = 1; ray.direction.y = 0; ray.direction.z = 0; Plane plane; plane.position.x = 5; plane.position.y = 0; plane.position.z = 0; plane.normal.x = -1; plane.normal.y = 0; plane.normal.z = 0; float t; if (intersectRayPlane(ray, plane, &t)) { printf("The ray intersects the plane at t = %f\n", t); } else { printf("The ray does not intersect the plane\n"); } return 0; } ``` 以上代码示例定义了一个包含原点和方向的射线结构体`Ray`以及一个包含位置和法向量的平面结构体`Plane`。通过调用`intersectRayPlane`函数,可以判断射线和平面是否相交并计算相交点的参数`t`值。在示例中,射线的原点在坐标原点,方向为X轴正方向,平面的位置在X轴上5个单位处,法向量为X轴负方向。输出结果将显示射线是否与平面相交以及相交点的参数`t`值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值