Bamboo, Sugar Cane, Sun Flowers, Quartz ... and more

Next Post
Bamboo, Sugar Cane, Sun Flowers, Quartz ... and more
1 / 10
DESCRIPTION



Hey!

Please check out the images above - in full-screen (there are a lot of details)

First, let's talk about YouTube:  I've been thinking of starting to make videos again - but on a new channel with a different name. There is just so much weird MCPE stuff associated with "umsoea" now, that I'm actually kind of ashamed to still use this username.

Here are a few "survival-friendly" textures that made:
(downloads are at the bottom of this post)

  • bamboo:  I did not want to make a more "round" model for the bamboo stem, that's just going to lag and have weird lighting glitches. I just went with the cubic vanilla model.    To make the bamboo forests look more natural, I used 5 different random models/textures. Make sure to have "Alternate Blocks" enabled in the Detail settings.

  • sugar_cane:  Similar to bamboo, but a bit more yellowish. I first tested using 2D planes just like the vanilla model - but that looked really strange.  I can't add more randomness to the position of the individual sugar cane stems - this would mess up the vertical tiling.

  • sun_flower:  I used POM to make it look a bit more 3D. In the images you can see that the flower's center part (where the seeds are) is casting a small shadow onto the yellow leaves.   I added multiple sizes/heights for more variation.  Requires enabling "Alternate Blocks" in the Detail settings.
  • reworked oak/dark_oak leaves - They look a bit more neutral now, I also added sticks (similar to the birch leaves).  They still don't look like real "oak" leaves - they are actually from an apple tree.  In my mind, minecraft's "oak" trees have always been apple trees.

  • quartz: The texture is not photographed - it's made in Substance Designer.  I tried to replicate this "crystal"-like effect of quartz. Looks a bit like ice to be honest.

  • vines: I used the model from the rendering series and adapted it for survival use. It can now tint, depending on the biome. Looks cool in swamp biomes.

  • grass_path:   Grass overlays onto grass_path (connected textures have to be enabled for this to work)

  • podzol:  It's not seamless because I also used random blockstates. - To minimize visibility of texture repetition. I think it looks really atmospheric in large spruce forests and bamboo forests.

  • dandelion
  • a few other flowers.
  • granite and andesite, both kinda ugly.

  • performance should actually have improved in some biomes, I optimized the grass models.


I think the survival textures are somewhat usable now.
Before I finish this project, I'd like to have most of the overworld vegetation completed.




My progress on learning how ray/path-traced shaders work:


In my last post, I created a renderer with ray-traced shadows, reflections and glass refractions. Every frame calculates a completely new, pixel-perfect image. This approach only works for simple effects that can be calculated perfectly. For example, to calculate a 100% sharp shadow, we just need to shoot a ray from the surface to the light-source and check if there is something in between that's blocking the light. (0 or 1, nothing in between)


This only works for infinitely small light sources. Any real light source has a certain radius/size and thus creates soft shadows. The larger the light source, the softer the shadow. 


Calculating soft shadows
We would need to shoot infinite rays from the surface towards all possible points on the light source and then average all the results. We would get a value between 0 and 1 which tells us how much of the light source is exposed and illuminates the surface. 0 is completely blocked. 1 is completely exposed. and everything in between means that there is a soft shadow visible there.


Noise
Because we cannot do infinite checks, the best thing is to choose random points on the light source. Here we finally introduce noise. Noise just means that something is sampled randomly. In our example, this means we shoot a ray from the surface point towards a random point on the light source.

For every pixel, we choose a different, random point - this is the reason every pixel has a slightly different level of brightness.


Accumulating Frames
Now we have soft shadows but a really noisy image.
The easiest way to reduce noise is to just average multiple images/frames.
The noise is different on every frame so when you average them, they "smear" over time and slowly converge to a single correct value.
A good comparison would be a real camera:
The longer the camera aperture opens to take an image, the more the electronic noise caused by the sensor is "smeared" over time and you get a clean image.  But longer shutter-speeds also mean that everything that moves is "smeared" as well. This is one of the reasons - besides TAA and denoising - why shaders like PTGI have visible "ghosting" when you move.


Global Illumination
Light is infinitely complex. Light rays bounce around many many times until they loose all their energy.  Calculating this cannot be done with super basic raytracing - it cannot be calculated, it can only be approximated by averaging A LOT of random checks/samples. (Monte-Carlo-Theory)


What's the difference between Ray and Path-tracing?
Ray-tracing is just a general term for calculating things like intersections with vector-mathematics. Path-tracing is just a special/advanced use of ray-tracing.

During Path-tracing, we follow one possible path of a light ray - it can reflect, refract, scatter, be absorbed etc.... And at the end we get an RGB value that describes the brightness at this specific pixel. By doing this many many times randomly and for every single pixel, we get a clean final image - the average of all the individual light paths.

This takes a lot of time and is just an approximation of something infinitely complex that cannot be calculated directly.


The goal was to code a simple Monte-Carlo path-tracer in minecraft. That's done now.
I don't want to dive any deeper into graphics programming for now. - I was mostly interested in the "geometric" aspect. More advanced topics like BRDFs, denoising and optimizations require a lot more math and system level understanding.

Added a debug screen that displays a few technical values such as the light source storage or the auto-focus distance, etc.. The image on the right is an "infinity mirror room". 4 spheres and 2 blocks of orange glass, surrounded by iron_blocks (mirrors).  The auto-focus for the DOF is also working through reflections and through glass. There is an option to switch between different auto-focus modes. (focus glass surface directly, ignore glass and focus whats behind, focus what's visible in reflections)


Downloads:   

  • "survival-friendly" textures v0.5:         256x        512x
    It should work on anything from 1.13 to 1.16, I mainly use SEUS Renewed 1.0 or PTGI for the screenshots.
  • my test shaders:          soft_shadows           global_illumination 
umsoea PATREON 2 favs
VIEWS1
FILES10 files
POSTEDMay 4, 2021
ARCHIVEDJun 10, 2026