AcademySoftwareFoundation / AcademySoftwareFoundation/OpenShadingLanguage

Tracesets handling proposal

Open
#2,146 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
2.3k
Forks
414
Avg merge
3d 1h
Merged PRs (30d)
10

Description

# Motivation #

The OSL, in its current state, doesn't specify technical details or syntax, other than this line in the docs:

> An optional named set of objects to ray trace (if preceded by a - character, it means to exclude that set).

So technically it can only pass an inclusion or exclusion list of predefined sets (not an expression) to the renderer.
Simple logical operations unavailable, e.g.: `"Character -Hair"`

Sometimes we want to trace only against the object itself, or exclude the currently shaded object from tracing without creating hundreds of tracesets for all instances.
We can employ string features of OSL to implement desired behaviour, but it's inefficient.

# Workarounds #
Exclude itself ( taken from [LaSh](https://github.com/LaikaStudios/LaSh/blob/main/osl/trace/Occlusion.osl) )
```
// Assign unique tracesets to all objects in DCC ahead of rendertime. (RfK should do it for you)

string traceset;
getattribute( "identifier:name", traceset );
traceset = concat( "-", traceset ); // String concatination isn't efficient

int hit = trace( P, dir,
"traceset", traceset );
```
Allow user to format string. User is free to set the `userDefined` parameter to `"%s"` or `"-%s"` or `"%s ground"`
```
// Assign unique tracesets to all objects in DCC ahead of rendertime.

string self, resultingTraceset;
getattribute( "grouping:membership", self);
resultingTraceset = format(userDefined, self); // Performance warning about rendertime formatting

int hit = trace( P, dir,
"traceset", resultingTraceset );
```

Image

# Inspiration #

VEX - SideFX Houdini language [allows](https://www.sidefx.com/docs/houdini/vex/contexts/shading_contexts.html#scope) you to:

> use wildcards `"Object*"`
> use complex expressions `"Object*,^*left"`
> refer to implicit sets using special keywords like `"scope:self"`

Pixar RenderMan [texture](https://rmanwiki-26.pixar.com/space/REN26/19661707/PxrTexture) system allows you to do complex string substitutions to define texture paths.

> `` - will substitute the value of the named constant string primitive variable, such as the name of an asset; for example,`"/assets//diffuse.tex"` on an apple with "const string model" ["apple"] would be expanded to `"/assets/apple/diffuse.tex"`

Seems Arnold renderer also has an implicit `self` traceset assignment, but I didn't find it in the documentation.

Adopting these ideas and syntax in the language might be very helpful in solving current problems. However, I understand the complexity of this solution.

# Simpler solution #
Even without introducing a complex evaluation system, we can achieve more flexibility and robustness by:

Separating the inclusion list from the exclusion list in the trace signature will allow simple constructions (e.g. include Character, but not its Hair) and prevent preceding `"-"` concatenation.
```
int trace (point pos, vector dir,
"tracesetInclude", string includeList,
"tracesetExclude, string excludeList)
```
Accepting tracesets as tuples (not as a single string) will also help to avoid runtime string concatenations and potentially parsing at render time.
```
int trace (point pos, vector dir,
"tracesetInclude", string[] includeList,
"tracesetExclude, string[] excludeList)
```

Having OSL opinion about implicit tracesets (like `current object` or `objects with current material assigned` (Thanks, Chriss) ) in the specification will help write efficient and transferable shaders.

Contributor guide

Open the contributing guide

Research direction

Start with the current OSL trace documentation and the existing traceset syntax described in the issue. Compare the proposed inclusion/exclusion lists, tuple arguments, implicit sets, and expression syntax before choosing a focused direction. Done means an agreed specification and a defined implementation and validation plan.

Written by the indexing model from the issue text.

Assessment

Domain
compilers
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.