Dear AOUSD folks,
In this week’s USD Games Working Group meeting, we’ve been discussing how to describe complex attribute data in USD. Complex attributes are those encapsulated in structures. They may also be formatted as arrays and dictionaries and even nested within each other.
These complex attributes are common in the game industry. For instance, in Unreal Engine, a static mesh asset has a structure attribute named Nanite Settings, which encloses the configurations for the Nanite system. It also has a structure array attribute named Building Settings that encloses the typology information for each level of detail.
This year in GTC, cooperating with NVIDIA, we’ve been sharing our solution used in Tencent Games for the past couple of years. The record has been released to: Build Games in the Cloud: How Tencent Streamlines 3D Content Production With OpenUSD | NVIDIA On-Demand
As shown in the above slide, our solution is extremely simple and based on namespace. However, it cannot support structure arrays. We’ve been thinking of flattening structure arrays into array attributes, but it hurts the readability of the USD stage, and it also does not support nested structure arrays.
It’s not just us who are struggling with this problem. Jeremiah Zanin and Levi Biasco of Santa Monica Studio have faced the same challenge and ended up with a comprehensive solution named “Compound Attribute.” Here is the record of their presentation: Video Conferencing, Web Conferencing, Webinars, Screen Sharing - Zoom
Compound Attributes can describe the most complex data, whether they are structures, structure arrays, or nested arrays. They have used it wildly in production. However, this solution buries a performance pitfall since it leads to an exponential increase in USD attributes.
Having an array of one million elements in USD is fine, but having a million attributes is totally another story. We’ve been testing it and found it can cause significant performance issues. In practice, Jeremiah and Levi have not encountered such a complex stage, but it was difficult for us to decide and preach it as a standard for the entire USD community.
So far, there is no common agreement on describing complex attributes. So, I wrote this article and am looking for help from the community. Has anyone encountered a similar problem at work? What would your suggestion be? How about eliminating all these solutions by using a TfDictionary? We are seeking a solution that will benefit all game studios, and the final standard might be officially implemented in Unreal Engine to reflect properties as USD attributes.
Cheers,
Calvin Gu