i was wondering if the PRT FumeFX could be updated
it requires a tremendous amount of particles to get detail on the surface, 90% of which are inside the smoke, not visible,
when you increase the smoke slider you see more and more of the internal smoke, is there a way it can be implemented in the future that the inside can be culled away, not even needing to fill /calculate this in the beginning?
that way we could spread millions of particles on the surface for detail, and remove 80% waiting time just for those invisible particles inside the smoke,
letting the user decide the amount, the thickness of the smoke, so that all internal smoke voxels wont be filled,
i thought since this process is already possible to say which smoke densities are used, that a new reverse function tells krakakatoa which smoke voxel densities to ignore when fillings particles
The Density stored in the Particles Density channel describes how dense the smoke is in that voxel. But you want to know whether a voxel is deep inside or close to the “surface”.
There might be two ways to do this with the current tools:
Use the DensityGradient channel. It is a vector whose direction points in the direction of the increasing density, and the magnitude (length) of the Vector describes the change in density. Assuming the core of the smoke is relatively uniform, the Magnitude of the DensityGradient would be very low. You could wire a KCM that reads the DensityGradient channel, gets the Magnitude, compares to a Float threshold using a LessThan operator, then outputs the result of the comparison converted ToFloat into the Selection channel. Drop a Krakatoa Delete modifier on top of the stack and your core particles will be deleted!
Create a FROST object out of the PRT FumeFX. Drop a KCM on the PRT FumeFX and pick the Frost in a Geometry Input. Pipe into a NearestPoint operator, with the Position channel converted to World Space piped into second socket. Connect a SurfData to the output of the NearestPoint and get the SignedDistance. Compare to a Float threshold using GreaterThan operator, convert result ToFloat and output as Selection channel. Drop Krakatoa Delete modifier to delete the core particles.
If these approaches work, it is unlikely that the PRT FumeFX will implement an internal option to do the culling - we want to stay away from specific solutions that can be achieved via existing, more general workflows like KCM and Frost.
but both require the initial calculation of particles, rihgT?
so if i want to have a highly detailed 100million particle fume surface, i have to generate 800million to delete the remaining 700, correcT?
i thought that implementing this algorithm that is already inside prt_fumeFX would be faster because it wouldnt even fill the inside with particles, thus cutting down rendering timex 10-50x
Well, I don’t think it would be a problem - did you actually try it?
The particles will be generated but then discarded before reaching the top of the stack if you use the DensityGradient method, so rendering itself will be a lot faster.
Depending on the Lighting Density settings, removing inside particles might not be a good idea since it could affect the quality of lighting.
DensityGradient is a good way of culling low-importance particles, but it doesn’t give you a mechanism to have the remaining particles compensate for the missing density. Signed distance will allow you to set up a layer of high density (opacity) particles but it won’t care about how many particles are (were) on the inside or their densities (opacities). A sampling approach would be much better, where you merge particles together based on a combination of the two, but you can’t do sampling in a KCM. You could do it in something like TP or Box#3. And of course it COULD be done at the voxel level, too…
No I will try it this week. Rendering 100 million will be faster than 800million, but 800 million particles still have to be generated to discard 700, i thought that might be a bit time consuming.