Я попытался использовать Embree в одном из моего проекта, чтобы ускорить некоторые вычисления с трассией лучей. Тем не менее, один запуск по двум Embree не вычисляет вообще не пересечение. Тем не менее, я хочу пропустить первый край квадрата. Поскольку я не знаю, как вычислить пересечение с 2D-геометрией, я просто создаю трехмерную геометрию Quad. /> < /ol>
#include
#include
#include
#include
#include
#include
#include
std::string translateEmbreeError(RTCError error)
{
switch(error)
{
case RTC_ERROR_NONE:
return "no error occured";
case RTC_ERROR_INVALID_ARGUMENT:
return "an unknown error has occured";
case RTC_ERROR_INVALID_OPERATION:
return "the operation is not allowed for the specified object";
case RTC_ERROR_OUT_OF_MEMORY:
return "there is not enough memory left to complete the operation";
case RTC_ERROR_UNSUPPORTED_CPU:
return "the CPU is not supported as it does not support the lowest ISA Embree is compiled for";
case RTC_ERROR_CANCELLED:
return "the operation got canceled by a memory monitor callback or progress monitor callback function";
default:
return "unknown error";
}
}
struct RayQueryContext
{
RTCRayQueryContext context;
unsigned int skipFacet;
};
void intersectionFilter(const RTCFilterFunctionNArguments* args);
int main()
{
RTCDevice device = rtcNewDevice("set_affinity=1");
if(device == NULL)
throw std::runtime_error("failed to create embree device: " + translateEmbreeError(rtcGetDeviceError(NULL)));
RTCScene scene = rtcNewScene(device);
RTCError error = rtcGetDeviceError(device);
if(scene == NULL)
throw std::runtime_error("failed to create embree scene: " + translateEmbreeError(error));
rtcSetSceneFlags(scene, RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS | RTC_SCENE_FLAG_ROBUST);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree scene flags: " + translateEmbreeError(error));
RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_QUAD);
error = rtcGetDeviceError(device);
if(geom == NULL)
throw std::runtime_error("failed to create embree geometry: " + translateEmbreeError(error));
rtcSetGeometryEnableFilterFunctionFromArguments(geom, true);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree geometry flags: " + translateEmbreeError(error));
std::vector points = {
{0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 0.0f}, {1.0f, -1.0f, 0.0f},
{1.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f},
{0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 0.0f},
};
float* vb = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, 3*sizeof(float), 4*4));
for(std::size_t s = 0 ; s < 4 ; ++s)
{
//First point of segment
vb[12*s + 0] = points[2*s + 0][0];
vb[12*s + 1] = points[2*s + 0][1];
vb[12*s + 2] = 0.1f;
//Second point of segment
vb[12*s + 3] = points[2*s + 1][0];
vb[12*s + 4] = points[2*s + 1][1];
vb[12*s + 5] = 0.1f;
//Third point to make a quad
vb[12*s + 6] = points[2*s + 1][0];
vb[12*s + 7] = points[2*s + 1][1];
vb[12*s + 8] = -0.1f;
//Fourth point to make a quad
vb[12*s + 9] = points[2*s + 0][0];
vb[12*s + 10] = points[2*s + 0][1];
vb[12*s + 11] = -0.1f;
}
unsigned int* ib = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT4, 4*sizeof(unsigned int), 4));
for(std::size_t s = 0 ; s < 4 ; ++s)
{
ib[4*s + 0] = 4*s + 0;
ib[4*s + 1] = 4*s + 1;
ib[4*s + 2] = 4*s + 2;
ib[4*s + 3] = 4*s + 3;
}
rtcCommitGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree geometry: " + translateEmbreeError(error));
rtcAttachGeometry(scene, geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to attach embree geometry: " + translateEmbreeError(error));
rtcReleaseGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to release embree geoemtry: " + translateEmbreeError(error));
rtcCommitScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree scene: " + translateEmbreeError(error));
RTCRayHit rayHit;
rayHit.ray.org_x = 0.5f; rayHit.ray.org_y = 1.0f; rayHit.ray.org_z = 0.0f;
rayHit.ray.dir_x = 0.0f; rayHit.ray.dir_y = -1.0f; rayHit.ray.dir_z = 0.0f;
rayHit.ray.tnear = 0.0f;
rayHit.ray.tfar = std::numeric_limits::infinity();
rayHit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
unsigned int facetToSkip = 0;
RayQueryContext context;
context.skipFacet = facetToSkip;
rtcInitRayQueryContext(&context.context);
RTCIntersectArguments args;
rtcInitIntersectArguments(&args);
args.context = &context.context;
args.filter = intersectionFilter;
rtcIntersect1(scene, &rayHit, &args);
if(rayHit.hit.geomID == RTC_INVALID_GEOMETRY_ID)
throw std::runtime_error("You did not intersect while you should ?");
rtcReleaseScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
std::cerr context);
unsigned int skipFacetUInt = context->skipFacet;
if(pHit->primID == skipFacetUInt)
args->valid[0] = 0;
else
args->valid[0] = -1;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... with-quads
Как использовать Embree с квадратами? ⇐ C++
Программы на C++. Форум разработчиков
1757341507
Anonymous
Я попытался использовать Embree в одном из моего проекта, чтобы ускорить некоторые вычисления с трассией лучей. Тем не менее, один запуск по двум Embree не вычисляет вообще не пересечение. Тем не менее, я хочу пропустить первый край квадрата. Поскольку я не знаю, как вычислить пересечение с 2D-геометрией, я просто создаю трехмерную геометрию Quad. /> < /ol>
#include
#include
#include
#include
#include
#include
#include
std::string translateEmbreeError(RTCError error)
{
switch(error)
{
case RTC_ERROR_NONE:
return "no error occured";
case RTC_ERROR_INVALID_ARGUMENT:
return "an unknown error has occured";
case RTC_ERROR_INVALID_OPERATION:
return "the operation is not allowed for the specified object";
case RTC_ERROR_OUT_OF_MEMORY:
return "there is not enough memory left to complete the operation";
case RTC_ERROR_UNSUPPORTED_CPU:
return "the CPU is not supported as it does not support the lowest ISA Embree is compiled for";
case RTC_ERROR_CANCELLED:
return "the operation got canceled by a memory monitor callback or progress monitor callback function";
default:
return "unknown error";
}
}
struct RayQueryContext
{
RTCRayQueryContext context;
unsigned int skipFacet;
};
void intersectionFilter(const RTCFilterFunctionNArguments* args);
int main()
{
RTCDevice device = rtcNewDevice("set_affinity=1");
if(device == NULL)
throw std::runtime_error("failed to create embree device: " + translateEmbreeError(rtcGetDeviceError(NULL)));
RTCScene scene = rtcNewScene(device);
RTCError error = rtcGetDeviceError(device);
if(scene == NULL)
throw std::runtime_error("failed to create embree scene: " + translateEmbreeError(error));
rtcSetSceneFlags(scene, RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS | RTC_SCENE_FLAG_ROBUST);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree scene flags: " + translateEmbreeError(error));
RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_QUAD);
error = rtcGetDeviceError(device);
if(geom == NULL)
throw std::runtime_error("failed to create embree geometry: " + translateEmbreeError(error));
rtcSetGeometryEnableFilterFunctionFromArguments(geom, true);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree geometry flags: " + translateEmbreeError(error));
std::vector points = {
{0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 0.0f}, {1.0f, -1.0f, 0.0f},
{1.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f},
{0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 0.0f},
};
float* vb = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, 3*sizeof(float), 4*4));
for(std::size_t s = 0 ; s < 4 ; ++s)
{
//First point of segment
vb[12*s + 0] = points[2*s + 0][0];
vb[12*s + 1] = points[2*s + 0][1];
vb[12*s + 2] = 0.1f;
//Second point of segment
vb[12*s + 3] = points[2*s + 1][0];
vb[12*s + 4] = points[2*s + 1][1];
vb[12*s + 5] = 0.1f;
//Third point to make a quad
vb[12*s + 6] = points[2*s + 1][0];
vb[12*s + 7] = points[2*s + 1][1];
vb[12*s + 8] = -0.1f;
//Fourth point to make a quad
vb[12*s + 9] = points[2*s + 0][0];
vb[12*s + 10] = points[2*s + 0][1];
vb[12*s + 11] = -0.1f;
}
unsigned int* ib = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT4, 4*sizeof(unsigned int), 4));
for(std::size_t s = 0 ; s < 4 ; ++s)
{
ib[4*s + 0] = 4*s + 0;
ib[4*s + 1] = 4*s + 1;
ib[4*s + 2] = 4*s + 2;
ib[4*s + 3] = 4*s + 3;
}
rtcCommitGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree geometry: " + translateEmbreeError(error));
rtcAttachGeometry(scene, geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to attach embree geometry: " + translateEmbreeError(error));
rtcReleaseGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to release embree geoemtry: " + translateEmbreeError(error));
rtcCommitScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree scene: " + translateEmbreeError(error));
RTCRayHit rayHit;
rayHit.ray.org_x = 0.5f; rayHit.ray.org_y = 1.0f; rayHit.ray.org_z = 0.0f;
rayHit.ray.dir_x = 0.0f; rayHit.ray.dir_y = -1.0f; rayHit.ray.dir_z = 0.0f;
rayHit.ray.tnear = 0.0f;
rayHit.ray.tfar = std::numeric_limits::infinity();
rayHit.hit.geomID = RTC_INVALID_GEOMETRY_ID;
unsigned int facetToSkip = 0;
RayQueryContext context;
context.skipFacet = facetToSkip;
rtcInitRayQueryContext(&context.context);
RTCIntersectArguments args;
rtcInitIntersectArguments(&args);
args.context = &context.context;
args.filter = intersectionFilter;
rtcIntersect1(scene, &rayHit, &args);
if(rayHit.hit.geomID == RTC_INVALID_GEOMETRY_ID)
throw std::runtime_error("You did not intersect while you should ?");
rtcReleaseScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
std::cerr context);
unsigned int skipFacetUInt = context->skipFacet;
if(pHit->primID == skipFacetUInt)
args->valid[0] = 0;
else
args->valid[0] = -1;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79758995/how-to-use-embree-with-quads[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия