TRESS FX THE FAST AND THE FURRY AMD AND MICROSOFT DEVELOPER DAY, JUNE 2014, STOCKHOLM NICOLAS THIBIEROZ WORLDWIDE GAMING ENGINEERING MANAGER, AMD.

Slides:



Advertisements
Similar presentations
Grass, Fur and all things hairy Nicolas ThibierozKarl Hillesland Gaming Engineering Manager, AMDSenior Research Engineer, AMD.
Advertisements

OIT and Indirect Illumination using DX11 Linked Lists
Exploration of advanced lighting and shading techniques
Deferred Shading Optimizations
An Optimized Soft Shadow Volume Algorithm with Real-Time Performance Ulf Assarsson 1, Michael Dougherty 2, Michael Mounier 2, and Tomas Akenine-Möller.
CS123 | INTRODUCTION TO COMPUTER GRAPHICS Andries van Dam © 1/16 Deferred Lighting Deferred Lighting – 11/18/2014.
ATI Stream Computing OpenCL™ Histogram Optimization Illustration Marc Romankewicz April 5, 2010.
ATI Stream Computing ACML-GPU – SGEMM Optimization Illustration Micah Villmow May 30, 2008.
ATI Stream ™ Physics Neal Robison Director of ISV Relations, AMD Graphics Products Group Game Developers Conference March 26, 2009.
CS 352: Computer Graphics Chapter 7: The Rendering Pipeline.
Understanding the graphics pipeline Lecture 2 Original Slides by: Suresh Venkatasubramanian Updates by Joseph Kider.
RealityEngine Graphics Kurt Akeley Silicon Graphics Computer Systems.
CS 4363/6353 BASIC RENDERING. THE GRAPHICS PIPELINE OVERVIEW Vertex Processing Coordinate transformations Compute color for each vertex Clipping and Primitive.
Week 7 - Monday.  What did we talk about last time?  Specular shading  Aliasing and antialiasing.
3D Graphics Rendering and Terrain Modeling
1 Questions about GPUs AS-Temps réel – Bordeaux Philippe Decaudin Fabrice Neyret Stéphane Guy Sylvain Lefebvre.
HOLY SMOKE! FASTER PARTICLE RENDERING USING DIRECTCOMPUTE AMD AND MICROSOFT DEVELOPER DAY, JUNE 2014, STOCKHOLM GARETH THOMAS 2 ND JUNE 2014.
I3D Fast Non-Linear Projections using Graphics Hardware Jean-Dominique Gascuel, Nicolas Holzschuch, Gabriel Fournier, Bernard Péroche I3D 2008.
Real-Time Rendering SPEACIAL EFFECTS Lecture 03 Marina Gavrilova.
3D Graphics Processor Architecture Victor Moya. PhD Project Research on architecture improvements for future Graphic Processor Units (GPUs). Research.
Panel Discussion: The Future of I/O From a CPU Architecture Perspective #OFADevWorkshop Brad Benton AMD, Inc.
University of Texas at Austin CS 378 – Game Technology Don Fussell CS 378: Computer Game Technology Beyond Meshes Spring 2012.
Shadow Algorithms Ikrima Elhassan.
Filtering Approaches for Real-Time Anti-Aliasing /
OpenCL Introduction A TECHNICAL REVIEW LU OCT
Technology and Historical Overview. Introduction to 3d Computer Graphics  3D computer graphics is the science, study, and method of projecting a mathematical.
Geometric Objects and Transformations. Coordinate systems rial.html.
Interactive Rendering of Meso-structure Surface Details using Semi-transparent 3D Textures Vision, Modeling, Visualization Erlangen, Germany November 16-18,
OpenCL Introduction AN EXAMPLE FOR OPENCL LU OCT
1| AMD FirePro™ / Creo 2.0 Launch Event | April 2012 | Confidential – NDA Required AMD FIREPRO ™ / CREO 2.0 Sales Deck April 2012.
Emerging Technologies for Games Alpha Sorting and “Soft” Particles CO3303 Week 15.
CS 638, Fall 2001 Multi-Pass Rendering The pipeline takes one triangle at a time, so only local information, and pre-computed maps, are available Multi-Pass.
Fast Cascade VSM By Zhang Jian.
Computer Graphics The Rendering Pipeline - Review CO2409 Computer Graphics Week 15.
Advanced Computer Graphics Advanced Shaders CO2409 Computer Graphics Week 16.
Games Development 1 Camera Projection / Picking CO3301 Week 8.
1 Perception and VR MONT 104S, Fall 2008 Lecture 21 More Graphics for VR.
Xbox MB system memory IBM 3-way symmetric core processor ATI GPU with embedded EDRAM 12x DVD Optional Hard disk.
09/16/03CS679 - Fall Copyright Univ. of Wisconsin Last Time Environment mapping Light mapping Project Goals for Stage 1.
Stencil Routed A-Buffer
Emerging Technologies for Games Deferred Rendering CO3303 Week 22.
Computer Graphics Blending CO2409 Computer Graphics Week 14.
ATI Stream Computing ATI Radeon™ HD 2900 Series GPU Hardware Overview Micah Villmow May 30, 2008.
Joseph L. GreathousE, Mayank Daga AMD Research 11/20/2014
Global Illumination. Local Illumination  the GPU pipeline is designed for local illumination  only the surface data at the visible point is needed to.
Review on Graphics Basics. Outline Polygon rendering pipeline Affine transformations Projective transformations Lighting and shading From vertices to.
C O N F I D E N T I A LC O N F I D E N T I A L ATI FireGL ™ Workstation Graphics from AMD April 2008 AMD Graphics Product Group.
COMPUTER GRAPHICS CS 482 – FALL 2015 SEPTEMBER 29, 2015 RENDERING RASTERIZATION RAY CASTING PROGRAMMABLE SHADERS.
STRUCTURAL AGNOSTIC SPMV: ADAPTING CSR-ADAPTIVE FOR IRREGULAR MATRICES MAYANK DAGA AND JOSEPH L. GREATHOUSE AMD RESEARCH ADVANCED MICRO DEVICES, INC.
What are shaders? In the field of computer graphics, a shader is a computer program that runs on the graphics processing unit(GPU) and is used to do shading.
Advanced Programmable Shading: Beyond Per-vertex and Per-pixel Shading.
Real-Time Dynamic Shadow Algorithms Evan Closson CSE 528.
FAULTSIM: A FAST, CONFIGURABLE MEMORY-RESILIENCE SIMULATOR DAVID A. ROBERTS, AMD RESEARCH PRASHANT J. NAIR, GEORGIA INSTITUTE OF TECHNOLOGY
SIMULATION OF EXASCALE NODES THROUGH RUNTIME HARDWARE MONITORING JOSEPH L. GREATHOUSE, ALEXANDER LYASHEVSKY, MITESH MESWANI, NUWAN JAYASENA, MICHAEL IGNATOWSKI.
SYNCHRONIZATION USING REMOTE-SCOPE PROMOTION MARC S. ORR †§, SHUAI CHE §, AYSE YILMAZER §, BRADFORD M. BECKMANN §, MARK D. HILL †§, DAVID A. WOOD †§ †
09/23/03CS679 - Fall Copyright Univ. of Wisconsin Last Time Reflections Shadows Part 1 Stage 1 is in.
IMPLEMENTING A LEADING LOADS PERFORMANCE PREDICTOR ON COMMODITY PROCESSORS BO SU † JOSEPH L. GREATHOUSE ‡ JUNLI GU ‡ MICHAEL BOYER ‡ LI SHEN † ZHIYING.
- Introduction - Graphics Pipeline
Week 7 - Monday CS361.
Deferred Lighting.
3D Graphics Rendering PPT By Ricardo Veguilla.
The Graphics Rendering Pipeline
The Small batch (and Other) solutions in Mantle API
SOC Runtime Gregory Stoner.
libflame optimizations with BLIS
UMBC Graphics for Games
RegMutex: Inter-Warp GPU Register Time-Sharing
Advanced Micro Devices, Inc.
Frame Buffer Applications
Jason Stewart (AMD) | Rolando Caloca O. (Epic Games) | 21 March 2018
Presentation transcript:

TRESS FX THE FAST AND THE FURRY AMD AND MICROSOFT DEVELOPER DAY, JUNE 2014, STOCKHOLM NICOLAS THIBIEROZ WORLDWIDE GAMING ENGINEERING MANAGER, AMD

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 2 TRESSFX: NEXT-GENERATION HAIR AND FUR RENDERING  The time for next-gen quality is now  Tomb Raider pioneered next-gen hair ‒Includes PS4/XB1  Users expect this level of quality for next-gen titles  You need to start thinking about this!

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 3 WHAT MAKES GOOD HAIR/FUR? Basic Rendering Antialiasing + Self Shadowing Antialiasing + Self Shadowing + Transparency Demo  All three components are a must to ensure high quality  Transparency in particular is essential to next-gen visuals ‒Requires an Order-Independent Transparency (OIT) solution

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 4 ISOLINE TESSELLATION FOR HAIR/FUR? 1/2  Isoline tessellation has two tessellation factors ‒First is line density (lines per invocation) ‒Second is line detail (segments per line)  In theory provides easy LOD system ‒Variable line density and detail by increasing both tessellation factors based on distance Tess = (1,1)Tess = (2,1) Tess = (2,2)Tess = (2,3) Tess = (3,3)

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 5 ISOLINE TESSELLATION FOR HAIR/FUR? 2/2  In practice isoline tessellation is not cost effective for this scenario  Lines are always 1-pixel thick ‒Need Geometry Shader to extrude them into triangles for smooth edges ‒ Major impact on performance! ‒Alternative is to enable MSAA ‒ Most engines are deferred so this causes a large performance impact ‒No extrusion for smoothing edges and no MSAA = poor quality!  Bottom line: a pure Vertex Shader solution is faster ‒Curvature is rarely a problem (dependant on vertices/strands at authoring time) ‒If needed LOD benefit can be done in Vertex Shader

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 6 TRESSFX RENDERING PIPELINE  TressFX 2 uses a deferred approach for best performance Three main steps  STEP 1: Hair simulation  STEP 2: Store fragment properties into buffers  STEP 3: Fetch fragment properties, sort, selective shading and render ‒Full shading on K-frontmost fragments ‒“Tail” fragments are shaded with a simpler light equation and shadowing algorithm

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 7 TRESSFX RENDERING PIPELINE STEP 1: HAIR SIMULATION CS Input Geometry (SRV) Post-simulation geometry (UAV) Simulation parameters Pre-simulation line segments (model space) Post-simulation line segments (world space) Simulation compute shaders Edge length constraint Local shape constraint Global shape constraint Not always needed for fur Model Transform Collision Shape Not always needed for fur External Forces (wind, gravity, etc.) Simulation compute shaders Edge length constraint Local shape constraint Global shape constraint Not always needed for fur Model Transform Collision Shape Not always needed for fur External Forces (wind, gravity, etc.)  Input model is a collection of line segments (each segment composed of up to 64 vertices)  Optionally divided into “master strands” and “slave strands” to optimize simulation performance ‒Only master strands are simulated (e.g. 1:4 ratio) ‒Slave strands use master strand simulation results with added noise ‒Virtually no difference from full-scale simulation but much better simulation performance! ‒Master:slave simulation ratio can also vary with distance for even better performance Demo

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 8 TRESSFX RENDERING PIPELINE STEP 2: STORE FRAGMENT PROPERTIES INTO BUFFERS VS World space Index Buffer Indexed triangle list Extrusion into triangles

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 9 LINE SEGMENT EXTRUSION INTO TRIANGLES  A lot of vertices go through rendering high-quality hair or fur! ‒Geometry processing can therefore be a significant bottleneck  In previous versions of TressFX extrusion was done in Geometry Shader (don’t do it!) and then VS with Draw()  Much faster performance was obtained with pure VS solution and precomputed index buffers ‒Maximizes post vertex cache use! DrawIndexed() method Indexed triangle list = { ( 0, 1, 2 ), (2, 1, 3 ), ( 2, 3, 4 ), (4, 3, 5 ), ( … ) }; Line segments Expanded quads ,4 Draw() method Line segments Expanded quads ,5 6 2,3 7,10 8, Triangle list = { ( 0, 1, 2 ), ( 3, 4, 5 ), ( 6, 7, 8 ), (9, 10, 11 ), ( … ) }; SLOW! FAST!

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 10 TRESSFX RENDERING PIPELINE STEP 2: STORE FRAGMENT PROPERTIES INTO BUFFERS Antialiasing VS PS Homogeneous clip space World space Index Buffer Indexed triangle list Extrusion into triangles

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 11 ANTIALIASING  Antialiasing (aka “coverage”) using analytical method ‒This is NOT Multisampling Anti-Aliasing!  Compute pixel coverage on edges of hair strand triangles and convert it to an alpha value  Alpha value fades out based on distance from pixel centre to strand axis  Similar principle to Emil Persson’s phone wire Anti-Aliasing

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 12 TRESSFX RENDERING PIPELINE STEP 2: STORE FRAGMENT PROPERTIES INTO BUFFERS Antialiasing depth tangent coverage next VS PS Homogeneous clip space World space Null RT Stencil PPLL UAV Head UAV Index Buffer Indexed triangle list Extrusion into triangles

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 13 PER-PIXEL LINKED LISTS  Head UAV ‒Each pixel location has a “head pointer” to a linked list in the PPLL UAV  PPLL UAV ‒As new fragments are rendered, they are added to the next open location in the PPLL (using UAV counter) ‒A link is created to the fragment pointed to by the head pointer ‒Head pointer then points to the new fragment // Retrieve current pixel count and increase counter uint uPixelCount = LinkedListUAV.IncrementCounter(); uint uOldStartOffset; // Exchange indices in LinkedListHead texture corresponding to pixel location InterlockedExchange(LinkedListHeadUAV[address], uPixelCount, uOldStartOffset); // Append new element at the end of the Fragment and Link Buffer Element.uNext = uOldStartOffset; LinkedListUAV[uPixelCount] = Element; depth tangent coverage next PPLL UAV Head UAV  Memory requirements can be large! ‒Width * Height * Average overdraw * sizeof (PPLL structure) ‒Can use tiling approach in memory-constrained situations

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 14 TRESSFX RENDERING PIPELINE STEP 3: FETCH FRAGMENTS, SORT, SELECTIVE SHADING AND RENDER VS PS Stencil Head UAV PPLL UAV Lighting Full Screen Quad/Triangle

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 15 LIGHTING  Different options available ‒Kajiya-Kay hair lighting model ‒Marshner model ‒Anything else that looks good!  Fragment properties storage requirements may limit your options!  TressFX 2 sample uses an approximation of the Marchner technique when rendering two highlights ‒Unique fragment properties: depth, tangent vector Primary Highlights Secondary Highlights

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 16 TRESSFX RENDERING PIPELINE STEP 3: FETCH FRAGMENTS, SORT, SELECTIVE SHADING AND RENDER VS PS Stencil Head UAV PPLL UAV Lighting Shadows Full Screen Quad/Triangle

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 17 SHADOWS  Three different cases  Hair self-shadowing ‒Essential component to give next-gen volumetric quality look ‒Simplified Deep Shadow Map technique  Hair casting shadows on body & environment ‒Body: Need a very soft look at close range (blur shadow map) ‒Environment: render (possibly simplified) hair geometry into cascaded shadow map  Environment casting shadows on hair ‒Sample environment shadow map at hair fragment rendering time

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 18 TRESSFX RENDERING PIPELINE STEP 3: FETCH FRAGMENTS, SORT, SELECTIVE SHADING AND RENDER VS PS Stencil Head UAV PPLL UAV K frontmost fragment: full shading, sorting and manual blending Lighting Shadows Full Screen Quad/Triangle Tail fragments: cheap shading, no sorting and manual blending

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 19 SELECTIVE FRAGMENT SHADING THIS IS WHERE THE MEAT OF THE CODE OCCURS! // Go through the rest of the linked list, and keep closest k fragments but // not in sorted order [allow_uav_condition] for(int l=0; l < g_iMaxFragments; l++) { if(pointer == NULLPOINTER) break; int id = 0; float max_depth = 0; // Find the furthest node in array [unroll]for(int i=0; i<KBUFFER_SIZE; i++) { float fDepth = kBuffer[i].depth; if(max_depth < fDepth) { max_depth = fDepth; id = i; } // get the start of the linked list from the head pointer uint pointer = LinkedListHeadSRV[In.vPosition.xy]; // Copy first K fragments from PPLL into KBuffer[] NODE Kbuffer[KBUFFER_SIZE]; for(int p=0; p<KBUFFER_SIZE; p++) { if (pointer != NULLPOINTER) { kBuffer[p] = LinkedListSRV[pointer]; pointer = LinkedListSRV[pointer].uNext; } // If linked list node is nearer than the furthest one in the local array // exchange the node in the local array for the one in the linked list NODE Node = LinkedListSRV[pointer]; if (max_depth > Node.depth) { SWAP(Node, Kbuffer[i]); } // Do simple shading and shadowing for nodes not part of the K closest fragments fragmentcolor = ComputeSimpleShading(Node); // Out of order blending fcolor.xyz = mad(-fcolor.xyz, fragmentColor.w, fcolor.xyz) + fragmentColor.xyz * fragmentColor.w; fcolor.w = mad(-fcolor.w, fragmentColor.w, fcolor.w); // Retrieve next node pointer pointer = LinkedListSRV[pointer].uNext; } // Blend the k nearest layers of fragments from back to front, where k = KBUFFER_SIZE for(int j=0; j<KBUFFER_SIZE; j++) { int id = 0; float max_depth = 0; // Find the furthest node in the array for(int i=0; i<KBUFFER_SIZE; i++) { float fDepth = kBuffer[i].depth; if(max_depth < fDepth) { max_depth = fDepth; id = i; } // Take this node out of the next search Node = KBuffer[id]; KBuffer[id] = (NODE)0; // Do high quality shading and shadowing fragmentcolor = ComputeHighQualityshading(Node); // Blend fragment color fcolor.xyz = mad(-fcolor.xyz, fragmentColor.w, fcolor.xyz) + fragmentColor.xyz * fragmentColor.w; fcolor.w = mad(-fcolor.w, fragmentColor.w, fcolor.w); } return fcolor; Fetch and store first K fragments into array Fetch next fragment and replace in array if closer Out of order cheap shading and blending for fragments outside array Sort, shade and blend K frontmost fragments in array

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 20 TRESSFX RENDERING PIPELINE STEP 3: FETCH FRAGMENTS, SORT, SELECTIVE SHADING AND RENDER VS PS Stencil Head UAV PPLL UAV Render target K frontmost fragment: full shading, sorting and manual blending Lighting Shadows Full Screen Quad/Triangle Tail fragments: cheap shading, no sorting and manual blending

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 21 TRESSFX PERFORMANCE FAST AND FURRY  High number of fragments required for quality look  Main bottleneck is shading all those fragments ‒Not per-pixel linked list traversal!  Selective shading approach allows significant performance savings with minor or negligible quality tradeoffs TechniqueCost Out of order, no shading 1.31 ms Out of order, shading 2.80 ms Deferred PPLL, selective shading 2.13 ms Shading cost is ~ 1.5 ms 24% faster Fur model with ~130,000 fur strands Running on AMD Radeon 1080p DistanceSim LOD Disabled Sim LOD Enabled Close range1.01 ms Medium range1.01 ms0.70 ms Long range1.01 ms0.37 ms Simulation LOD  Distance-adaptive Shading and Simulation LOD further improves performance  “K frontmost fragments” value can inversely scale with distance DistanceShading LOD Disabled Shading LOD Enabled Close range3.26 ms Medium range3.23 ms1.77 ms Long range2.52 ms0.64 ms Shading LOD

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 22 CONCLUSION AND QUESTIONS?  Next-gen hair/fur look at real-time performance is possible now!  Fast: ‒Variable ratio master/slave compute simulations ‒Vertex Shader extrusion of segments into triangles (do not use tessellation + GS) ‒Deferred rendering with selective shading ‒Distance-based shading and simulation LOD ‒Optimized shaders!  Furry:  Full and free access to TressFX 2 SDK sample, code and documentation at:

| TRESSFX THE FAST AND THE FURRY | AMD AND MICROSOFT GAME DEVELOPER DAY - JUNE , STOCKHOLM 23 DISCLAIMER & ATTRIBUTION The information presented in this document is for informational purposes only and may contain technical inaccuracies, omissions and typographical errors. The information contained herein is subject to change and may be rendered inaccurate for many reasons, including but not limited to product and roadmap changes, component and motherboard version changes, new model and/or product releases, product differences between differing manufacturers, software changes, BIOS flashes, firmware upgrades, or the like. AMD assumes no obligation to update or otherwise correct or revise this information. However, AMD reserves the right to revise this information and to make changes from time to time to the content hereof without obligation of AMD to notify any person of such revisions or changes. AMD MAKES NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE CONTENTS HEREOF AND ASSUMES NO RESPONSIBILITY FOR ANY INACCURACIES, ERRORS OR OMISSIONS THAT MAY APPEAR IN THIS INFORMATION. AMD SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT WILL AMD BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES ARISING FROM THE USE OF ANY INFORMATION CONTAINED HEREIN, EVEN IF AMD IS EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ATTRIBUTION © 2013 Advanced Micro Devices, Inc. All rights reserved. AMD, the AMD Arrow logo and combinations thereof are trademarks of Advanced Micro Devices, Inc. in the United States and/or other jurisdictions. Other names are for informational purposes only and may be trademarks of their respective owners.