[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=ray title="Loading sampled BRDF data" vod_platform=youtube id=iHXYFbHAmlw annotator=Miblo] [0:01][Welcome to the stream][:speech] [0:26][Reacquaint ourselves with the ray tracer][:research] [1:26][Default LANE_WIDTH to 8 if not defined on our build line] [1:47][Check out our 2017_10_22_Day01.txt :performance dump][:admin] [2:37][Admire our 2017_11_19_Day08_8x.bmp image][:drawing] [3:34][Determine to add some importance :sampling and / or material properties][:lighting :research] [4:27][Try to :run the ray caster] [5:59][Reacquaint ourselves with CastSampleRays()][:research] [10:06][Consider adding some exposure control][:research] [10:57][Try increasing the redness of the 4th material's EmitColor from 4 to 20] [11:22][:Run the program] [11:37][Admire our image with more red emittance][:drawing] [12:45][Try increasing the redness of the 4th material's EmitColor from 20 to 50] [12:52][:Run the program] [13:02][Admire our image with yet more red emittance][:drawing] [14:17][Introduce a second plane] [14:47][:Run the program] [15:06][Admire our image with two planes][:drawing] [15:52][Try decreasing the d of the 2nd plane from 10 to 2] [15:57][:Run the program] [16:29][Admire our image with the second plane cutting through the blue hemisphere][:drawing] [17:11][Determine to vary the light based on direction][:drawing] [17:44][Try adding some Green and Blue to the 4th material's EmitColor, and take RaysPerPixel as a command line argument] [18:13][:Run the program with and without passing a RaysPerPixel] [18:32][Admire our image with orange emittance][:drawing] [19:02][:Research Disney's standard BRDF (Bidirectional Reflectance Distribution Function)[ref site="Disney Animation" page="BRDF Explorer" url=https://www.disneyanimation.com/technology/brdf.html][ref author="Brent Burley" title="Physically-Based Shading at Disney" publisher="Walt Disney Animation Studios" url=https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf][ref site=ShaderToy page="Disney Principled BRDF" url=https://www.shadertoy.com/view/XdyyDd]][:lighting] [25:10][:Research reference implementations of Disney's Principled BRDF[ref site=GitHub page="brdf/src/brdfs/disney.brdf" url=https://github.com/wdas/brdf/blob/master/src/brdfs/disney.brdf][ref site=Shih-Chin page="Implementing Disney Principled BRDF in Arnold" url=http://shihchinw.github.io/2015/07/implementing-disney-principled-brdf-in-arnold.html][ref site="Rendering Equations" page="Rendering the Moana Island Scene Part 1: Implementing the Disney BSDF" url=https://schuttejoe.github.io/post/disneybsdf/]][:lighting] [27:34][Prepare to proceed, reading 2 "The microfacet model"[ref author="Brent Burley" title="Physically-Based Shading at Disney" publisher="Walt Disney Animation Studios" url=https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf]][:lighting :research] [31:21][Read 3 "Visualizing measured BDRFs",[ref author="Brent Burley" title="Physically-Based Shading at Disney" publisher="Walt Disney Animation Studios" url=https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf] describing a gonioreflectometer[ref site=Wikipedia page=Gonioreflectometer url=https://en.wikipedia.org/wiki/Gonioreflectometer] and checking out MERL's BRDF database[ref site="MERL - Mitsubishi Electric Research Laboratories" page="MERL BRDF Database" url=https://www.merl.com/brdf/]][:lighting :research] [39:21][Read 'A Data-Driven Reflectance Model'[ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf]][:lighting :research] [46:56][Consult the BRDF reference implementation in MERL's BRDF database[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting :research] [47:52][Embark on our BRDF loader, introducing brdf_table and LoadMERLBinary()[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:"file io" :lighting] [54:27][Organise our MERL .binary files][:admin] [55:28][Set up to call LoadMERLBinary(), changing it to handle three colour channels[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting] [1:00:19][:Run the program, to see no progress printout][:lighting] [1:03:33][:Run the program with 16 RaysPerPixel][:lighting] [1:03:55][Admire our test.bmp][:drawing :lighting] [1:04:12][Determine to sample the BRDF values, first learning about the colour scaling values[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp][ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf]][:lighting :research] [1:08:41][Change LoadMERLBinary() to read in the colour channels as per the reference implementation[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting] [1:11:09][Upgrade CastSampleRays() to attenuate by the BRDF-sampled reflectance colour, introducing BRDFLookup()][:lighting :sampling] [1:15:26][Implement BRDFLookup(), informed by the reference implementation[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp] and 'A Data-Driven Reflectance Model'[ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf]][:lighting :sampling] [1:29:05][Coordinate System on a Sphere[ref site=Wikipedia page="Spherical cow" url=https://en.wikipedia.org/wiki/Spherical_cow][ref site=Wikipedia page="Hairy ball theorem" url=https://en.wikipedia.org/wiki/Hairy_ball_theorem]][:blackboard :geometry :lighting] [1:33:14][Make CastSampleRays() generate a coordinate system for our :sampling sphere, to pass to BRDFLookup()][:geometry :lighting] [1:37:14][Consult our documents[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp][ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf] on computation of the diff vector][:geometry :lighting :research] [1:39:22][Make BRDFLookup() compute ThetaHalf and PhiHalf, after mapping the LightDir and HalfVector in to the tangent space of the reflection][:lighting] [1:43:36][Make BRDFLookup() compute ThetaDiff[ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf]][:lighting] [1:45:44][Come to understand the PhiDiff computation[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp][ref author="Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan" title="A Data-Driven Reflectance Model" url=http://www.csbio.unc.edu/mcmillan/pubs/sig03_matusik.pdf][ref author="Szymon Rusinkiewicz" title="A New Change of Variables for Efficient BRDF Representation" url=https://www.cs.princeton.edu/~smr/papers/brdf_change_of_variables/brdf_change_of_variables.pdf]][:geometry :lighting :research] [1:49:30][Rename Bitangent to Binormal in plane][:"data structure" :lighting] [1:51:45][Locating a (Light) Vector in a Transformed Coordinate System[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:blackboard :geometry :lighting] [1:57:52][Efficiently locating a (Light) Vector in a Transformed Coordinate System[ref author="Szymon Rusinkiewicz" title="A New Change of Variables for Efficient BRDF Representation" url=https://www.cs.princeton.edu/~smr/papers/brdf_change_of_variables/brdf_change_of_variables.pdf]][:blackboard :geometry :lighting] [2:04:37][Make BRDFLookup() efficiently compute the PhiDiff][:geometry :lighting] [2:10:10][Introduce ExtractF32() for BRDFLookup() to call[ref site=Intel page="Intel Intrinsics Guide" url=https://software.intel.com/sites/landingpage/IntrinsicsGuide/]][:simd] [2:13:51][Make BRDFLookup() look up the colour values[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting] [2:21:57][Begin to make BRDFLookup() index in to the BRDF table[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting] [2:25:26][Wonder if the squaring and rooting is correct[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:mathematics :research] [2:28:34][I = √t × R²][:blackboard :mathematics] [2:30:14][Finish making BRDFLookup() index in to the BRDF table[ref site="MERL - Mitsubishi Electric Research Laboratories" page="BRDFRead.cpp" url=http://people.csail.mit.edu/wojciech/BRDFDatabase/code/BRDFRead.cpp]][:lighting] [2:37:16][:Run the program to find uninitialised Values][:lighting] [2:38:41][Introduce NullBRDF()][:lighting] [2:40:25][:Run the program][:lighting] [2:40:39][Admire our test.bmp][:drawing :lighting] [2:41:06][Q&A][:speech] [2:41:48][@xxthebigfoxx][Q: When computing the sphere bitangent, could you just NOZ the tangent before computing the Bitangent so you don't have to NOZ the Bitangent afterwards?][:lighting] [2:42:22][Save BRDFLookup() from performing NOZ() on the DiffX, and make it perform NOZ() when initialising SphereTangent to save doing in on the SphereBinormal][:lighting] [2:43:28][@somebody_took_my_name][Q: Talking about ray and Linux and more beautiful code, there is still a GitHub issue about :memory loading in :SIMD] [2:43:40][@pythno][Q: Is the BRDS essentially a function that tells us which rays within the hemisphere to use?][:lighting] [2:43:53][@smack_ssbm][Q: Do you get "uncanny valley" impressions sometimes when looking at raytraced images? If so, what strategies might you have to mitigate that?] [2:44:28][@pythno][Q: BRDF, yes, typo, sorry][:lighting] [2:45:21][@xxthebigfoxx][Q: Will you finish this tomorrow?][:lighting] [2:45:31][@sagian2005][Q: The sound was fine and it was synced. Your camera frame rate seems low, though] [2:45:53][@tocsin16][Q: Have you thought about implementing GGX for [~hero/ray Handmade Ray]?][:lighting] [2:46:52][@tinspin][Q: How much of modern skin mesh :animation did you contribute to?] [2:47:24][@tocsin16][Q: Haha, this is what I'm talking about[ref author="Bruce Walter, Stephen R. Marschner, Hongsong Li and Kenneth E. Torrance" title="Microfacet Models for Refraction through Rough Surfaces" url=https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf]][:lighting] [2:49:26][@pythno][Q: Alright, thanks. But what function chooses the outgoing rays to use? Because it will affect the outcome of the picture. It gets fuzzier if the rays spread in more directions][:lighting] [2:49:50][Equally vs BRDF weighted :sampling][:blackboard :lighting] [2:53:21][@tinspin][Q: Did shader weighted skin mesh :animation exist before you started meddling with it? How did it evolve, and do you see any future improvements possible on it?] [2:56:36][@tocsin16][Q: I see missed the start of the stream so didn't realize the dataset was a requirement. I don't know if there is set of measured GGX BRDFs. It is a very common BRDF used in offline pathtracing for film (and I think gaining popularity in the realtime world too). Thanks for the education streams!][:lighting] [2:57:14][@ryanfleury][Was the game Messiah?] [2:58:26][Wrap it up][:speech] [/video]