-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
93 lines (88 loc) · 6.57 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<title>
OWL - A Productivity Library for OptiX
</title>
<link rel="stylesheet" type="text/css" media="screen" href="stylesheet.css">
</head>
<body>
<div id="styleheader">
<div id="header-github">
<a id="forkme-banner" href="https://github.com/owl-project/owl">View on GitHub</a>
</div>
<div id="header-title">
OWL - A Productivity Library for OptiX
</div>
<div id="header-navbar">
<ul>
<li id="selected"><a href="About.html">About</a></li><li id="selected"><a href="News.html">News</a></li><li id="selected"><a href="Samples.html">Samples</a></li> </ul>
</div>
<div id="header-spacing"></div>
</div>
<div id="content-wrap">
<div id="content">
<p><img src="about/collage-owl.jpg" class="widepic" /></p>
<!--- ------------------------------------------------------- -->
<h1 id="what-is-owl">What is OWL?</h1>
<p>OWL is a convenience/productivity-oriented library on top of OptiX 7.x, and aims at making it easier to write OptiX programs by taking some of the more arcane arts (like knowing what a Shader Binding Table is, and how to actually build it), and doing that for the user. For example, assuming the node graph (ie, the programs, geometries, and acceleration structures) have already been built, the shader binding table (SBT) can be built and properly populated by a single call <code>owlBuildSBT(context)</code>.</p>
<p>In addition, OWL also allows for somewhat higher-level abstractions than native OptiX+CUDA for operations such as creating device buffers, uploading data, building shader programs and pipelines, building acceleration structures, etc.</p>
<p>Fore more details on OWL, please see the following resources:</p>
<ul>
<li><p>A recent <a href="https://ingowald.blog/2020/11/08/introducing-owl-a-node-graph-abstraction-layer-on-top-of-optix-7/">“Introducing OWL” blog post</a> that gives a high-level motivation/overview what the project is about, and where it currently is (though without much detail on how OWL actually works)</p></li>
<li><p>For latest code on github: <a href="https://github.com/owl-project/owl">https://github.com/owl-project/owl</a></p></li>
<li><p>For a brief (visual) overview over latest samples: <a href="http://owl-project.github.io/Samples.html">http://owl-project.github.io/Samples.html</a></p></li>
<li><p>Latest news/updates: <a href="http://owl-project.github.io/News.html">http://owl-project.github.io/News.html</a></p></li>
</ul>
<h1 id="key-concepts-supported-in-owl">Key Concepts Supported in OWL</h1>
<p>OWL builds on the following key concepts:</p>
<ul>
<li><p>Buffers (realized via CUDA allocated memory), similar to the old Optix 6 <code>optix::Buffer</code> type</p>
<ul>
<li><p>Buffers can be either device buffers (corresponding to regular cudaMalloc’ed memory), host-pinned memory buffers, or managed memory buffers.</p></li>
<li><p>Buffers can be created over all sorts of trivially copyable types like FLOAT3, INT, etc, but also over advanced types like (CUDA) textures or other buffers.</p></li>
</ul></li>
<li><p>Abstraction for <em>geometries</em> and <em>geometry types</em> (i.e., shapes that can be intersected with a ray)</p>
<ul>
<li><p>geometry <em>types</em> define the optix programs (closesthit, anyhit, bounds, etc) that run on the given geometry, as well as the <em>type</em> of data they run on</p></li>
<li><p><em>geometries</em> are specific instances of a given geometry type (not to be confused with a “Instance” object), which is similar to the original Optix 6 <code>optix::GeometryInstance</code> type.</p></li>
<li><p>OWL explicitly supports both (hardware-accelerated) triangle geometry types (specified through index and vertex buffers) as well as user geometry types (that use intersection programs and bounds programs)</p></li>
<li><p>for user geometries, OWL provides functionality to automate the process for computing device-side bounding boxes through bounds program (including building of the kernels, allocation of the memory, parametrization and executing the kernel, etc).</p></li>
</ul></li>
<li><p>Creation of Groups and Acceleration Structures</p>
<ul>
<li><p>OWL abstracts acclerations structures through “groups” built over geometries, with each group containing exactly one acceleration strcutures over all the geometries in that group:</p></li>
<li><p><code>TriangleGeomGroups</code>: a groupover triangle geometries, hardware accelerated where available.</p></li>
<li><p><code>UserGeomGroups</code>: a group over user geometries; in particular, will simplify the process of creating the user geometry bounds that go into the BVH build)</p></li>
<li><p><code>InstanceGroups</code>: a group over instance of other groups.</p></li>
<li><p>building acceleration structures is usually as simple as creating the group, and calling <code>owlGroupBuildAccel(group)</code>. Refitting and motion blur are supported.</p></li>
</ul></li>
<li><p>Instancing: OWL supports instancing through Instance Groups</p>
<ul>
<li>Multi-Level Instancing is explicitly supported by instance groups containing other instance groups (see sample <code>s08-sierpinki</code> for an example)</li>
</ul></li>
<li><p>Abstraction/Automatic Creation of Shader Binding Table, Programs, etc</p>
<ul>
<li>owl will automatically put the created groups/instances in the right order, allocate memory for the SBT, and create the respective entries.</li>
</ul></li>
<li><p>Multi-Device: OWL Supports multi-device rendering, on both ll and ng layer.</p></li>
<li><p>Parametrization of device-side Geometries, Launch Params, etc, via Variables</p>
<ul>
<li>which variables a device-side object has gets defined by the user; these can then be configured via calls like, e.g.,</li>
</ul>
<p>owlParamsSetGroup(myLaunchParams,“world”,world")</p></li>
<li><p>support for launch parameters, asynchronous launches, and CUDA interop.</p></li>
</ul>
<h1 id="currently-still-missing-functionality">Currently still <em>Missing</em> Functionality</h1>
<ul>
<li><p>OWL currently supports both triangle and user-definable geometry, but does not yet support the <code>Curves</code> geometry added in OptiX 7.2.</p></li>
<li><p>OWL does not yet explicitly expose the denoiser. The OptiX denoiser <em>can</em> be called directly on the OWL-buffers used by the application, but currently still still has to be done manually.</p></li>
</ul>
</div>
</div>
<div id="footer">
© 2019-2020 Ingo Wald
</div>
</body>
</html>