Marxian Approach & Neoclassical Critique Michael Roettger Denise Kall February 9, 2004.
GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger,...
Transcript of GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger,...
![Page 1: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/1.jpg)
Ankit Patel, Detlef Roettger, 2018-03-26
AN INTRODUCTION TO NVIDIA OPTIX
GTC 2018 San Jose, S8518 Tutorial
![Page 2: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/2.jpg)
2
AGENDA
OptiX Overview
Programming with OptiX
New Example Applications
Motion Blur
DL Denoiser
![Page 3: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/3.jpg)
3
OptiX
High-level GPU accelerated ray-casting API
C-API to setup scene and data
Multiple program domains and per ray payload under developer's control
Flexible single ray programming model
Supports multi-GPU and NVLINK
Develop "to the algorithm"
https://developer.nvidia.com/optix
NVIDIA GPU Ray Casting API
volume scattering and dispersion
hair intersection and shading
![Page 4: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/4.jpg)
4
Programming with OptiX
Windows, Linux, Mac OS
NVIDIA GPU (Kepler, Maxwell, Pascal, Volta)
Display Driver supporting CUDA 9.0
OptiX SDK
CUDA Toolkit
Host compiler supported by the CUDA Toolkit
Prerequisites
![Page 5: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/5.jpg)
5
OptiX Program DomainsDeveloper controls the algorithm via CUDA C++ programs
RayGeneration
Intersection
BoundingBox
ClosestHit
Miss
AnyHit
Exception
* per entry point
* per geometric primitive type
* per ray type
![Page 6: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/6.jpg)
6
Acceleration StructuresBounding Volume Hierarchy (BVH)
![Page 7: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/7.jpg)
7
OptiX Scene HierarchyOptiX C-API to create and connect scene data
GeometryGroup
GeometryInstance
Geometry
Material
Acceleration
ClosestHit
AnyHit
BoundingBox
Intersection
![Page 8: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/8.jpg)
8
OptiX Scene HierarchyInstancing Sub-Trees
GeometryGroup
GeometryInstance
Geometry
Material
Acceleration
Transform Transform
Group
...
Acceleration
![Page 9: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/9.jpg)
9
![Page 10: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/10.jpg)
10
OptiX Scene HierarchyAcceleration Structure Sharing
GeometryGroup
GeometryInstance
Geometry
Material A
Acceleration
Transform Transform
Group
GeometryGroup
GeometryInstance Material B
Acceleration
![Page 11: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/11.jpg)
11
![Page 12: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/12.jpg)
12
OptiX Introduction Example Programs
![Page 13: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/13.jpg)
13
optixIntro_01
![Page 14: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/14.jpg)
14
optix::Context::create()
RayGeneration
setEntryPointCount(num_entry_points)
setRayTypeCount(num_ray_types)
setStackSize(bytes)
createBuffer(type, format, width, height)
createProgramFromPTXFile(filename, program_name)
launch(entry_point, width, height)buffer->map(level, flags)
buffer->unmap()
context["variable_name"]->set(buffer);
setDevices(begin, end);
setRayGenerationProgram(index, program)
![Page 15: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/15.jpg)
15
rtBuffer<float4, 2> sysOutputBuffer; // RGBA32F
rtDeclareVariable(uint2, theLaunchIndex, rtLaunchIndex, );
rtDeclareVariable(float3, sysColorBackground, , );
RT_PROGRAM void raygeneration(){sysOutputBuffer[theLaunchIndex] = make_float4(sysColorBackground, 1.0f);
}
RayGeneration Program
![Page 16: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/16.jpg)
16
rtBuffer<float4, 2> sysOutputBuffer; // RGBA32F
rtDeclareVariable(uint2, theLaunchIndex, rtLaunchIndex, );
RT_PROGRAM void exception(){rtPrintExceptionDetails();
sysOutputBuffer[theLaunchIndex] = make_float4(1000000.0f, 0.0f, 1000000.0f, 1.0f);}
Exception Program
![Page 17: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/17.jpg)
17
optixIntro_02
![Page 18: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/18.jpg)
18
sysCameraWsysCameraU
sysCameraV
sysCameraPosition
rtLaunchIndex [0, 0]
Pinhole Camera
rtLaunchDim
![Page 19: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/19.jpg)
19
Tracing Rays
Group context["sysTopObject"]->set(group);
rtTrace(sysTopObject, ray, prd);
optix::Ray ray = optix::make_Ray(origin, direction, raytype, t_min, t_max);
rtDeclareVariable(rtObject, sysTopObject, , );
PerRayData prd;
![Page 20: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/20.jpg)
20
Variable SemanticsAccess per ray data in other program domains
rtTrace(sysTopObject, ray, time, prd);
rtDeclareVariable(optix::Ray, theRay, rtCurrentRay, );
rtDeclareVariable(PerRayData, thePrd, rtPayload, );
rtDeclareVariable(float, theTime, rtCurrentTime, );
rtCurrentRay
rtCurrentTime
rtPayload
rtDeclareVariable(float, theDistance, rtIntersectionDistance, );
![Page 21: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/21.jpg)
21
optixIntro_03
![Page 22: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/22.jpg)
22
RT_PROGRAM void boundingbox_triangle_indexed(int primitiveIndex, float result[6]){// uint3 indices = ... ; // vertex indices of the triangle at primitiveIndex// float3 v0, v1, v2 = ... ; // vertex positions
const float area = optix::length(optix::cross(v1 - v0, v2 - v0));
optix::Aabb* aabb = (optix::Aabb*) result;
if (0.0f < area && !isinf(area)) {aabb->m_min = fminf(fminf(v0, v1), v2);aabb->m_max = fmaxf(fmaxf(v0, v1), v2);
} else {aabb->invalidate();
}}
BoundingBox Program
![Page 23: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/23.jpg)
23
rtDeclareVariable(optix::Ray, theRay, rtCurrentRay, );
rtDeclareVariable(float3, varNormal, attribute NORMAL, );
RT_PROGRAM void intersection_triangle_indexed(int primitiveIndex){// uint3 indices = ... ; // vertex indices of the triangle at primitiveIndex// float3 v0, v1, v2 = ... ; // vertex positions
float3 n;float t, beta, gamma;if (intersect_triangle(theRay, v0, v1, v2, n, t, beta, gamma)) {if (rtPotentialIntersection(t)) {// float3 n0, n1, n2 = ... ; // vertex normalsconst float alpha = 1.0f – beta – gamma;varNormal = n0 * alpha + n1 * beta + n2 * gamma; // interpolate shading normalrtReportIntersection(0);
}}
}
Intersection Program
![Page 24: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/24.jpg)
24
rtDeclareVariable(PerRayData, thePrd, rtPayload, );
rtDeclareVariable(optix::float3, varNormal, attribute NORMAL, );
RT_PROGRAM void closesthit(){const float3 normal = optix::normalize(rtTransformNormal(RT_OBJECT_TO_WORLD, varNormal));thePrd.radiance = normal * 0.5f + 0.5f;
}
ClosestHit Program
![Page 25: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/25.jpg)
25
optixIntro_04
![Page 26: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/26.jpg)
26
IntegratorUnidirectional Path Tracer Throughput
![Page 27: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/27.jpg)
27
optixIntro_05
![Page 28: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/28.jpg)
28
radiance ray
shadow rayAnyHit
RayGeneration
RT_PROGRAM void anyhit_shadow(){thePrdShadow.visible = false;rtTerminateRay();
}
![Page 29: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/29.jpg)
29
Next Event Estimation
1spp 1spp 16spp 64spp 256spp16spp 64spp 256spp
![Page 30: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/30.jpg)
30
optixIntro_06
![Page 31: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/31.jpg)
31
Adding more BSDF and Light TypesHow much code do you really need?
closest_hit
sample BSDF
eval BSDF
sample light
direct lighting?
calc state
calc radiance
closest_hit
sample BSDF
eval BSDF
sample light
direct lighting?
calc state
calc radiance
closest_hit
sample BSDF
eval BSDF
sample light
direct lighting?
calc state
calc radiance
...
![Page 32: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/32.jpg)
32
Buffers of Bindless Callable Program IDsImplement fixed-function elements as bindless callable programs
closest_hit
sample BSDF
eval BSDF
sample light
direct lighting?light_constant
light_env
diffuse_reflection
specular_reflection
specular_reflection_transmission
calc state
calc radiance
light_areadiffuse_reflection
(specular_reflection)
(specular_reflection_transmission)
...
...
...
sysSampleLight
sysSampleBSDF
sysEvalBSDF
![Page 33: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/33.jpg)
33
Lens Shaders
Pinhole Fisheye Spherical
![Page 34: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/34.jpg)
34
Bindless Callable ProgramDeclaration of Buffer of IDs and Example
rtBuffer< rtCallableProgramId<return_typename(typename arg0, …, typename argN)> > name;
RT_CALLABLE_PROGRAM void lens_shader_pinhole(const float2 pixel,const float2 screen,const float2 sample,float3& origin,float3& direction)
{const float2 fragment = pixel + sample;const float2 ndc = (fragment / screen) * 2.0f - 1.0f;
origin = sysCameraPosition;direction = optix::normalize(sysCameraU * ndc.x +
sysCameraV * ndc.y +sysCameraW);
}
sysCameraWsysCameraU
sysCameraV
sysCameraPosition
rtLaunchIndex [0, 0]
rtLaunchDim
![Page 35: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/35.jpg)
35
Variable ScopesOrganize your parameters
Program Type Search Order
ClosestHit
AnyHitProgram GeometryInstance Material Context
BoundingBox
IntersectionProgram GeometryInstance Geometry Context
Raygeneration
Exception
Miss
Bindless Callable Program
Program Context
Visit Program Node
![Page 36: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/36.jpg)
36
optixIntro_07
![Page 37: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/37.jpg)
37
![Page 38: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/38.jpg)
38
Cutout OpacityOr how to use AnyHit programs
Raygeneration
RT_PROGRAM void anyhit_cutout(){if (getOpacity() < threshold)rtIgnoreIntersection();
}
RT_PROGRAM void anyhit_shadow_cutout(){if (getOpacity() < threshold) {rtIgnoreIntersection();
} else {thePrdShadow.visible = false;rtTerminateRay();
}}
![Page 39: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/39.jpg)
39
WrapMode
FilteringMode
IndexingMode
MaxAnisotropy
Buffer
MipLevelClamp
MipLevelBiasReadMode
getId()
1D 2D 3D
rtTex*<typename>(id, u, v, …)
MipLevelCount
CUBEMAP
TextureSampler
![Page 40: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/40.jpg)
40
optixIntro_08
![Page 41: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/41.jpg)
41
rtTransformSetMotionKeys(), rtTransformSetMotionRange(), rtTransformSetMotionBorderMode()
Motion Blur
New functions for the Transform node
Motion in Transform nodes
Two motion key types: A linearly interpolated 3x4 matrix or 16 elements from a Scale-Rotation-Translation (SRT) transformation
![Page 42: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/42.jpg)
42
rtGeometrySetMotionSteps(), rtGeometrySetMotionRange(), rtGeometrySetMotionBorderMode()
Motion Blur
New functions for the Geometry node
Motion in Geometry Nodes (Morphing)
RT_PROGRAM void boundingbox_motionblur(int prim_index, int motion_index, float result[6]);
New BoundingBox program function signature
![Page 43: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/43.jpg)
43
Rolling shutters
![Page 44: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/44.jpg)
44
optixIntro_09
![Page 45: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/45.jpg)
45
Post-Processing Pipeline
beauty
albedo
normal
tonemapped
denoised
Render
Tonemap
Denoise
![Page 46: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/46.jpg)
46
PostprocessingStage tonemapper = context->createBuiltinPostProcessingStage("TonemapperSimple");
tonemapper->declareVariable("input_buffer")->set(bufferOutput); // from the renderertonemapper->declareVariable("output_buffer")->set(bufferTonemapped);tonemapper->declareVariable("exposure")->setFloat(1.0f);tonemapper->declareVariable("gamma")->setFloat(2.2f);
PostprocessingStage denoiser = context->createBuiltinPostProcessingStage("DLDenoiser");
denoiser->declareVariable("input_buffer")->set(bufferTonemapped);denoiser->declareVariable("input_albedo_buffer")->set(bufferAlbedo); // optionaldenoiser->declareVariable("input_normal_buffer")->set(bufferNormal); // optionaldenoiser->declareVariable("output_buffer")->set(bufferDenoised);
CommandList commandList = context->createCommandList();
commandList->appendLaunch(0, w, h); // Launch raygeneration at entry point 0 => RendercommandList->appendPostprocessingStage(tonemapper, w, h);commandList->appendPostprocessingStage(denoiser, w, h);commandList->finalize();
commandList->execute(); // Result in bufferDenoised.
Post-Processing Setup
![Page 47: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/47.jpg)
47
closest_hitray_gen
lens shader
integrator
output
any_hit
cutout opacity?
sample BSDF
eval BSDF
sample light
direct lighting?
bounding_box
intersection
light_constant
light_env
diffuse_reflection
specular_reflection
pinhole
fisheye
sphere
miss_null
miss_constant
miss_env
* rectangles are fixed-function code
* round rectangles are bindless callable programs
specular_reflection_transmission
calc state
calc state
calc radiance
light_area
diffuse_reflection
(specular_reflection)
(specular_reflection_transmission)
![Page 48: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/48.jpg)
48
Takeaway
OptiX is a high-level GPU ray casting SDK with a flexible programming model which allows to concentrate on the algorithm during developement
State-of-the-art acceleration structures and core features get added or improved with each new version
An easily extendable architecture for a global illumination path tracer using OptiX features available in version 5.0.1 has been presented
The nine OptiX examples accompanying this tutorial are going to be available on github
![Page 49: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/49.jpg)
CE8105: Ray Tracing with the NVIDIA OptiX SDKMonday, Mar 26, 4:00 - 5:00pm, LL Pod A
S8519: New Features in OptiXTuesday, Mar 27, 3:30 - 4:20pm, Room 230B
![Page 50: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/50.jpg)
50
BACKUP SLIDES
![Page 51: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/51.jpg)
51
m_context = optix::Context::create();
m_context->setEntryPointCount(1);m_context->setRayTypeCount(0);m_context->setStackSize(m_stackSize);
m_bufferOutput = m_context->createBuffer(RT_BUFFER_OUTPUT, RT_FORMAT_FLOAT4, m_width, m_height);
m_context["sysOutputBuffer"]->set(m_bufferOutput);
optix::Program prgRaygen = m_context->createProgramFromPTXFile(ptxPath("raygeneration.cu"), "raygeneration");
m_context->setRayGenerationProgram(0, prgRaygen); // per entry point
optix::Program prgException = m_context->createProgramFromPTXFile(ptxPath("exception.cu"), "exception");
m_context->setExceptionProgram(0, prgException); // per entry point
m_context["sysColorBackground"]->setFloat(0.0f, 1.0f, 0.0f); // green
m_context->launch(0, m_width, m_height); // ==> uint2 rtLaunchDim
const void* data = m_bufferOutput->map(0, RT_BUFFER_MAP_READ);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, (GLsizei) m_width, (GLsizei) m_height, 0,
GL_RGBA, GL_FLOAT, data);m_bufferOutput->unmap();
![Page 52: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/52.jpg)
52
rtBuffer<float4, 2> sysOutputBuffer; // RGBA32F
rtDeclareVariable(rtObject, sysTopObject, , );
RT_PROGRAM void raygeneration(){PerRayData prd;
prd.radiance = make_float3(0.0f);
... // Camera implementations calculate origin and direction here.
optix::Ray ray = optix::make_Ray(origin, direction, 0, 0.0f, RT_DEFAULT_MAX);
rtTrace(sysTopObject, ray, prd);
sysOutputBuffer[theLaunchIndex] = make_float4(prd.radiance, 1.0f);}
rtTrace
![Page 53: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/53.jpg)
53
rtDeclareVariable(optix::Ray, theRay, rtCurrentRay, );rtDeclareVariable(PerRayData, thePrd, rtPayload, );
rtDeclareVariable(float3, sysColorBottom, , );rtDeclareVariable(float3, sysColorTop, , );
RT_PROGRAM void miss_gradient(){const float t = theRay.direction.y * 0.5f + 0.5f;thePrd.radiance = optix::lerp(sysColorBottom, sysColorTop, t);
}
Miss Program
![Page 54: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/54.jpg)
54
rtDeclareVariable(float3, varGeoNormal, attribute GEO_NORMAL, );rtDeclareVariable(float3, varNormal, attribute NORMAL, ); rtDeclareVariable(optix::Ray, theRay, rtCurrentRay, );rtDeclareVariable(PerRayData, thePrd, rtPayload, );
RT_PROGRAM void closesthit(){float3 geoNormal = optix::normalize(rtTransformNormal(RT_OBJECT_TO_WORLD, varGeoNormal));float3 normal = optix::normalize(rtTransformNormal(RT_OBJECT_TO_WORLD, varNormal));
thePrd.pos = theRay.origin + theRay.direction * theIntersectionDistance;
thePrd.flags |= (0.0f <= optix::dot(thePrd.wo, geoNormal)) ? FLAG_FRONTFACE : 0;if ((thePrd.flags & FLAG_FRONTFACE) == 0) {geoNormal = -geoNormal;normal = -normal;
}// Lambert sampling implementation:thePrd.radiance = make_float3(0.0f); // No emission, no direct lighting.unitSquareToCosineHemisphere(rng2(thePrd.seed), normal, thePrd.wi, thePrd.pdf);if (thePrd.pdf <= 0.0f || optix::dot(thePrd.wi, geoNormal) <= 0.0f) {thePrd.flags |= FLAG_TERMINATE;return;
}MaterialParameter parameters = sysMaterialParameters[parMaterialIndex];thePrd.f_over_pdf = parameters.albedo * (M_1_PIf * optix::dot(thePrd.wi, normal) / thePrd.pdf);
}
![Page 55: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/55.jpg)
55
rtDeclareVariable(PerRayData_shadow, thePrdShadow, rtPayload, );
RT_PROGRAM void anyhit_shadow(){thePrdShadow.visible = false;rtTerminateRay();
}
![Page 56: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/56.jpg)
56
RT_FUNCTION void integrator(PerRayData& prd, float3& radiance){radiance = make_float3(0.0f);float3 throughput = make_float3(1.0f);
int depth = 0; // Primary ray is path segment 0.while (depth < sysPathLength){prd.wo = -prd.wi;prd.flags = 0;
optix::Ray ray = optix::make_Ray(prd.pos, prd.wi, 0, sysSceneEpsilon, RT_DEFAULT_MAX);rtTrace(sysTopObject, ray, prd);
radiance += throughput * prd.radiance;
if ((prd.flags & FLAG_TERMINATE) || prd.pdf <= 0.0f || isNull(prd.f_over_pdf)){break;
}
throughput *= prd.f_over_pdf; // == f * (fabsf(optix::dot(wi, normal)) / pdf);
++depth;}
}
![Page 57: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/57.jpg)
57
#include <optix.h>#include <optixu/optixu_math_namespace.h>
#include "material_parameter.h"#include "per_ray_data.h"
RT_CALLABLE_PROGRAM void sample_bsdf_specular_reflection(MaterialParameter const& parameters,State const& state,PerRayData& prd)
{prd.wi = optix::reflect(-prd.wo, state.normal);if (optix::dot(prd.wi, state.geoNormal) <= 0.0f){prd.flags |= FLAG_TERMINATE;return;
}prd.f_over_pdf = parameters.albedo;prd.pdf = 1.0f;
}
RT_CALLABLE_PROGRAM float4 eval_bsdf_specular_reflection(MaterialParameter const& parameters,State const& state,PerRayData const& prd,float3 const& wiL)
{return make_float4(0.0f);
}
![Page 58: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/58.jpg)
58
rtDeclareVariable(PerRayData_shadow, thePrdShadow, rtPayload, );
rtBuffer<MaterialParameter> sysMaterialParameters;rtDeclareVariable(int, parMaterialIndex, , );
rtDeclareVariable(optix::float3, varTexCoord, attribute TEXCOORD, );
RT_PROGRAM void anyhit_shadow_cutout(){float opacity = 1.0f;
const int id = sysMaterialParameters[parMaterialIndex].cutoutID; // bindless texture IDif (id != RT_TEXTURE_ID_NULL) {opacity = intensity(make_float3(optix::rtTex2D<float4>(id, varTexCoord.x, varTexCoord.y)));
}
// Stochastic coutout opacity, think Monte Carlo!if (opacity < 1.0f && opacity <= rng(thePrdShadow.seed)) {rtIgnoreIntersection();
} else {thePrdShadow.visible = false;rtTerminateRay();
}}
![Page 59: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/59.jpg)
59
optix::Buffer buffer = context->createBuffer(RT_BUFFER_INPUT, RT_FORMAT_UNSIGNED_BYTE4, w, h);
buffer->setMipLevelCount(1);
void *dst = buffer->map(0, RT_BUFFER_MAP_WRITE_DISCARD);memcpy(dst, texels, w * h * getElementSize(RT_FORMAT_UNSIGNED_BYTE4));buffer->unmap(0);
optix::TextureSampler sampler = context->createTextureSampler();
sampler->setWrapMode(0, RT_WRAP_REPEAT);sampler->setWrapMode(1, RT_WRAP_REPEAT);sampler->setWrapMode(2, RT_WRAP_REPEAT);sampler->setFilteringModes(RT_FILTER_LINEAR, RT_FILTER_LINEAR, RT_FILTER_NONE);sampler->setIndexingMode(RT_TEXTURE_INDEX_NORMALIZED_COORDINATES;sampler->setReadMode(RT_TEXTURE_READ_NORMALIZED_FLOAT);sampler->setMaxAnisotropy(1.0f);sampler->setBuffer(buffer);
TextureSampler
![Page 60: GTC 2018 San Jose, S8518 Tutorial AN INTRODUCTION TO ... · Ankit Patel, Detlef Roettger, 2018-03-26 AN INTRODUCTION TO NVIDIA OPTIX GTC 2018 San Jose, S8518 Tutorial](https://reader035.fdocuments.us/reader035/viewer/2022063011/5fc77d5e06c0841d5519ceb0/html5/thumbnails/60.jpg)