Senior Thesis - "Embers" - Week 16-18

Updated: May 14

Catching up on some weeks in this blog post. Main focus has been on terrain for the environment; finishing the particulate and ashes; and getting the burned log textures to a rendering state.


Note: I did run into an issue with the Renderman servers being down for maintenance so I did not get to render this past weekend because I cannot access my license status.


Burning Log Textures:

This portion of the project I made great project on and I'm really happy with the result. With Houdini and the layering tools in the Renderman shaders, the method is simple to execute.

This is the initial result of a shader network for one of the assets:

I didn't find the render on the right bad by any means, but it needed refinement.


First thing I notice is that the burned area is a flat brown color. I want that to have more variation. To do that, I multiplied a saturated, clamped version of the diffuse map against the burned color.


I also wanted a little more break up in the glowing/burned area. I have other AO maps from lava and rock textures to mix in where I need to. I layered one of those in using a mask from a noise generated in SOPs.


The result is significantly better.


Final Result:

The great thing about the method I'm using is that the shader is dynamic. The burn_mask attribute is created using a sop solver so the mask grows with the fire. I also added a burn_glow attribute that is multiplied against the orange color to make the brightness of that ungulate to add another dynamic layer.


These calculations are not heavy and do not at to the render time.


Particulate and Ashes:

I added these lines of code to my advection wrangle to give each point a subtle sine wave motion. I calculate the distance between the original position and the current position and then multiply that against the velocity in the Y direction to ensure the points that haven't risen far and quickly receive a smaller amplitude of the sine wave.

f@dist = distance(v@P, @og_pos) * 0.1;
@dist *= v@v.y;
@dist = fit01(@dist, 0, 1);

float offset = rand(i@id * ch("seed"));
float wavex = (ch('amplitude_x') * @dist) * sin(ch('scale_x')-(ch('speed_x') * (@Time + offset)));
float wavez = (ch('amplitude_z') * @dist) * sin(ch('scale_z')-(ch('speed_z') * (@Time + offset)));

v@P.x += wavex;
v@P.z += wavez;

The result looks a bit funny and very jittery with just the points, but once I retime the result a bit, drop a trail sop to calculate subframe position and connect those points with a poly line, the result is what I want. With changing the position attribute, I have recalculate the velocity attribute post-sim.