Honestly, the uses for this new DirectX raycasting API that interest me the most are pretty pedestrian.
Example: Raycast shadows and never deal with shadow maps again. Holy shit how nice would that be?
Well that was an utter failure. Morton order is a 1.2x slowdown. Hoisting the loop for the fractals to be top-level was a 2x slowdown. (To be fair, I should have seen that one coming, since it means recomputing the distortion noise for each octave.)
I guess I'll try multithreading instead?
Further profiling suggests the bottleneck is now *sampling* the feature buffer. The multiple octaves and distortion both trash the cache pretty thoroughly. I can do the octaves in multiple passes, but not sure what to do about the distortion. Maybe store the feature buffer in Morton order?
First pass optimization massively sped the Voronoi code up. (using sort-by-y as described by Fabian Giesen here: https://fgiesen.wordpress.com/2010/03/28/how-to-generate-cellular-textures/).
2048x2048 feature buffer with 16k points takes ~3.5 seconds. More reasonable point counts (~1024) are under a second. (Used to take ten.)
Kind of incredible how much that helps.
Some more experiments. Using the cell ID + distortion produces a nice camouflage pattern. Would need some sort of antialiasing to use "for real". (Simplest would be just create the image at 2x resolution and downsample after coloring it.)
It *also* means I can build the feature buffer in lower resolution than the output texture at the expense of some minor artifacts. (1/2 is basically imperceptible. Starts being blurry at about 1/8. And obviously you'll lose small features as you cut down.)
Restructured my Voronoi noise generator. Instead of building the image directly, it constructs a "feature buffer" -- two closest distances and the point id of the closest.
This buffer is then sampled to produce the final noise texture. This lets me move the distortion out of the Voronoi pass itself (it made optimizing hard), and allows for cool things like fractal Voronoi:
Easing back into programming this week by writing a texture generator. Voronoi noise that takes arbitrary point sets and supports coordinate distortion.
Sample output: white-noise seeded Voronoi with x and y samples distorted (independently) with Perlin noise. Could make a nice energy shield / plasma effect by animating the distortion?
(All of this is probably worth writing about too, I think. Eventually.)
Related: I've been making an effort the past few months to remove words like "stupid" and "sucks" from my vocabulary when writing. Hoping to be less toxic than I have been.
It's harder to give that up when talking about my own work than it is when talking about someone else's.
I have like 6 or 7 half-written drafts of the next blog post and they're all.. not great.
I think it's because the system I'm talking about is poorly designed. *Why* it's poorly designed is a worthwhile topic, but stressful to write about. Talking about failures is hard.
I haven't really touched code in over a week. This is the longest break from programming I've had in ages.
I think it's done me some good.
Fixed a few minor things, added cables. Added a layer of dust to the casing as well as some slight discolorations and scuff marks.
Whipped up a simple carpet with hair particles to ground everything.
Some stuff I'm still not 100% satisfied with, but overall I am *quite pleased* with how this turned out.
Lesson learned: texturing *really* matters. Also fixed the scaling on the jacks, which helps.
Some of the narrow text got mangled. (Didn't have the font so I was cutting it out of a photo and cleaning it up.) Sort of looks like it's been fixed with a marker, so... happy accidents?
Significant number of details missing that aren't visible from this angle. Trying to decide if I should leave this here or go all in. Modeling the inside bits could be fun.
Next on Bryan Models Random Things: a Boss DS-1 distortion
guitar pedal. First time doing something with a physical reference at hand.
Bad: Overly sharp on the corners, some nastiness on the bottom edges where I used 'crease' instead of loop cuts. Proportions seem slightly wrong.
Good: Really like how the knobs and input jack turned out.
Label text is missing because I haven't bothered with real textures yet. (The logo is modeled in with the cut tool.)
More hard-surface practice. (Reference: http://www.ikea.com/us/en/catalog/products/40342898/ )
This was trickier than I expected, small changes to the sharpness on those curves make a huge difference to the refraction. Also a long render, denoising does not play nice with glass at low sample counts.
Got a normal bake that almost worked, but ran into artifacts from close surfaces and the profile of the water tank looks *bad*.
I guess I need to do actual work on the low-poly, not just deleting subsurf and extra edge loops.
Cleaned up the worst of my topology, added a few details, slightly better materials.
113k triangles. Maybe I need to learn how to bake things next.
Pretty proud of this. Only took, uh, 8 hours or so?
Some bits I'm not happy about with the stock, the topology is all fucked up back there. Merging a cylinder into a surface smoothly is *hard*.
Updated Blender because the older version didn't support subsurface scattering with the GPU. New version does... but has discontinued support altogether for older AMD GPUs like mine.