21 SLOptixPathtracer::SLOptixPathtracer()
23 name(
"OptiX path tracer");
31 SLOptixPathtracer::~SLOptixPathtracer()
33 SL_LOG(
"Destructor : ~SLOptixPathtracer");
37 OPTIX_CHECK(optixDenoiserDestroy(_optixDenoiser));
42 "Exception in ~SLOptixRaytracer: %s",
47 void SLOptixPathtracer::setupOptix()
49 _cameraModule = createModule(
"SLOptixPathtracerCamera.cu");
50 _shadingModule = createModule(
"SLOptixPathtracerShading.cu");
52 OptixProgramGroupDesc sample_raygen_desc = {};
53 sample_raygen_desc.kind = OPTIX_PROGRAM_GROUP_KIND_RAYGEN;
54 sample_raygen_desc.raygen.module = _cameraModule;
55 sample_raygen_desc.raygen.entryFunctionName =
"__raygen__sample_camera";
56 _pinhole_raygen_prog_group = createProgram(sample_raygen_desc);
58 OptixProgramGroupDesc sample_miss_desc = {};
59 sample_miss_desc.kind = OPTIX_PROGRAM_GROUP_KIND_MISS;
60 sample_miss_desc.miss.module = _shadingModule;
61 sample_miss_desc.miss.entryFunctionName =
"__miss__sample";
62 _radiance_miss_group = createProgram(sample_miss_desc);
64 OptixProgramGroupDesc sample_hitgroup_desc = {};
65 sample_hitgroup_desc.kind = OPTIX_PROGRAM_GROUP_KIND_HITGROUP;
66 sample_hitgroup_desc.hitgroup.moduleAH = _shadingModule;
67 sample_hitgroup_desc.hitgroup.entryFunctionNameAH =
"__anyhit__radiance";
68 sample_hitgroup_desc.hitgroup.moduleCH = _shadingModule;
69 sample_hitgroup_desc.hitgroup.entryFunctionNameCH =
"__closesthit__radiance";
70 _radiance_hit_group = createProgram(sample_hitgroup_desc);
72 OptixProgramGroupDesc occlusion_miss_desc = {};
73 occlusion_miss_desc.kind = OPTIX_PROGRAM_GROUP_KIND_MISS;
74 occlusion_miss_desc.miss.module =
nullptr;
75 occlusion_miss_desc.miss.entryFunctionName =
nullptr;
76 _occlusion_miss_group = createProgram(occlusion_miss_desc);
78 OptixProgramGroupDesc occlusion_hitgroup_desc = {};
79 occlusion_hitgroup_desc.kind = OPTIX_PROGRAM_GROUP_KIND_HITGROUP;
80 occlusion_hitgroup_desc.hitgroup.moduleAH =
nullptr;
81 occlusion_hitgroup_desc.hitgroup.entryFunctionNameAH =
nullptr;
82 occlusion_hitgroup_desc.hitgroup.moduleCH =
nullptr;
83 occlusion_hitgroup_desc.hitgroup.entryFunctionNameCH =
nullptr;
84 _occlusion_hit_group = createProgram(occlusion_hitgroup_desc);
86 OptixProgramGroup path_tracer_program_groups[] = {
87 _pinhole_raygen_prog_group,
89 _occlusion_miss_group,
94 _pipeline = createPipeline(path_tracer_program_groups, 5);
96 OptixDenoiserOptions denoiserOptions;
97 denoiserOptions.inputKind = OPTIX_DENOISER_INPUT_RGB;
98 denoiserOptions.pixelFormat = OPTIX_PIXEL_FORMAT_FLOAT4;
100 OPTIX_CHECK(optixDenoiserCreate(SLOptix::context,
104 OPTIX_CHECK(optixDenoiserSetModel(_optixDenoiser,
105 OPTIX_DENOISER_MODEL_KIND_LDR,
115 _imageBuffer.resize(_sv->scrW() * _sv->scrH() *
sizeof(float4));
116 _curandBuffer.resize(_sv->scrW() * _sv->scrH() *
sizeof(curandState));
118 _params.image =
reinterpret_cast<float4*
>(_imageBuffer.devicePointer());
119 _params.states =
reinterpret_cast<curandState*
>(_curandBuffer.devicePointer());
120 _params.width = _sv->
scrW();
121 _params.height = _sv->scrH();
122 _params.max_depth = _maxDepth;
123 _params.samples = _samples;
126 SLMesh::meshIndex = 0;
127 for (
auto mesh : meshes)
128 mesh->createMeshAccelerationStructure();
130 _sbtClassic = createShaderBindingTable(meshes,
false);
132 OPTIX_CHECK(optixDenoiserComputeMemoryResources(_optixDenoiser,
137 _denoserState.resize(_denoiserSizes.stateSizeInBytes);
138 _scratch.resize(_denoiserSizes.recommendedScratchSizeInBytes);
140 OPTIX_CHECK(optixDenoiserSetup(
145 _denoserState.devicePointer(),
146 _denoiserSizes.stateSizeInBytes,
147 _scratch.devicePointer(),
148 _denoiserSizes.recommendedScratchSizeInBytes));
158 scene->
root3D()->createInstanceAccelerationStructureFlat();
160 _params.handle = scene->
root3D()->optixTraversableHandle();
164 ortCamera cameraData{};
165 cameraData.eye = make_float3(eye);
166 cameraData.U = make_float3(u);
167 cameraData.V = make_float3(v);
168 cameraData.W = make_float3(w);
170 RayGenClassicSbtRecord rayGenSbtRecord;
171 _rayGenClassicBuffer.download(&rayGenSbtRecord);
172 OPTIX_CHECK(optixSbtRecordPackHeader(_pinhole_raygen_prog_group,
174 rayGenSbtRecord.data = cameraData;
175 _rayGenClassicBuffer.upload(&rayGenSbtRecord);
177 _params.seed = (
SLuint)time(
nullptr);
178 _params.oneOverGamma = _oneOverGamma;
180 _paramsBuffer.upload(&_params);
183 SLbool SLOptixPathtracer::render()
196 _paramsBuffer.devicePointer(),
197 _paramsBuffer.size(),
203 CUDA_SYNC_CHECK(SLOptix::stream);
210 if (_denoiserEnabled)
212 OptixImage2D optixImage2D;
213 optixImage2D.data = _imageBuffer.devicePointer();
214 optixImage2D.width = _sv->scrW();
215 optixImage2D.height = _sv->scrH();
216 optixImage2D.rowStrideInBytes = _sv->scrW() *
sizeof(float4);
217 optixImage2D.pixelStrideInBytes = 0;
218 optixImage2D.format = OPTIX_PIXEL_FORMAT_FLOAT4;
220 OptixDenoiserParams denoiserParams;
221 denoiserParams.denoiseAlpha = 0;
222 denoiserParams.blendFactor = 0.0f;
223 denoiserParams.hdrIntensity = 0;
225 OPTIX_CHECK(optixDenoiserInvoke(
229 _denoserState.devicePointer(),
230 _denoiserSizes.stateSizeInBytes,
236 _scratch.devicePointer(),
237 _denoiserSizes.recommendedScratchSizeInBytes));
238 CUDA_SYNC_CHECK(SLOptix::stream);
float SLfloat
analog to GLfloat
#define SL_LOG(...)
Some debugging and error handling macros.
unsigned int SLuint
analog to GLuint
bool SLbool
analog to GLbool
vector< SLMesh * > SLVMesh
Toplevel holder of the assets meshes, materials, textures and shaders.
Active or visible camera node class.
void UVWFrame(SLVec3f &EYE, SLVec3f &U, SLVec3f &V, SLVec3f &W)
static unsigned int instanceIndex
???
The SLScene class represents the top level instance holding the scene structure.
void root3D(SLNode *root3D)
SceneView class represents a dynamic real time 3D view onto the scene.
void camera(SLCamera *camera)
void log(const char *tag, const char *format,...)
logs a formatted string platform independently