Game Effects

Contribution to PopcornFX 2.10 Now Released

The PopcornFX team honored me recently by including content I’ve created as part of the official 2.10 release. As they work towards a version in which user content can be uploaded and shared freely, the team approached me knowing I had a pack of templates and example projects I was intending to share out to other users. I was flattered and pleased to share this content out via an official release like this.

It’s worth noting that PopcornFX is free to download and use for personal learning, as is this content pack. https://www.popcornfx.com/ The content I’ve contributed can be downloaded directly from the editor and is among the “official” learning content and examples.

By including this content in the 2.10 release they have a demonstration and first test of how new nodes and files can be created by a third party and shared among users.

The content is a collection of 31 “templates” or custom nodes I originally created for myself as I worked with PKFX. The nodes are documented and tested and vary widely in both their usage and usefulness. A few are so helpful I use them in practically everything I do now, while others are very specific in their use cases. 

In addition there is a small suite of “example” files showing various effects, each cleanly presented, commented and documented. 

I tend to clean and document files for myself as part of my creation process so it didn’t take much effort to prep these files for the public. Hopefully they will spark interest and prove useful as examples of one user’s workflow, in tasks both simple and advanced.

Read more for descriptions of each of the nodes included:

New nodes

Random Spherical Vector
Produces a pure random vector from a unit sphere.
Random Value In Cone
Generates a random vector in a conical arc with the center by default oriented in the positive Y axis.
Test If Points Intersect Plane
Tests point position to determine if it intersects an infinite plane.
Spring Force
Plug into acceleration. Updated position is the particle position on current frame. Rest position is the point the spring seeks to reach. Spring constant is a measure of the “tightness” of the spring.
Wander Around Position
Randomly moves offset around center point position. Two methods available, with their own strengths and weaknesses. Keep seed values low.
Normalized ID
Applies a unique ID ranging from 0 to 1 for all spawned particles. Only works when there is a total (fixed) number of particles spawned.
Time Based Rand
Instead of a unique value per-point this random function delivers a single random value at spawn or per frame.
Animated Noise
Noise function animated over the effect age.
Linear Probability
Produces a boolean and optional values based on a random probability between 0 and 100.
Spiral Trails
When used in a “trail” layer this template causes resulting trail to be a spiral around the parent particle’s path.
Spin on Axis
Animates an incoming vector (position) to rotate around axis over time.
Point Visibility By Facing
Outputs a number 0 or 1 based on whether a point is on the front, back or edge of the sphere of the point normal.
Sparkle Color
Flickers colors over the particle’s lifespan.
Flicker Value
Flips between two values based on a random noise.
Position On Circle
Outputs a vector which lies on a circle defined by input values.
Oscillator
Oscillate between two values. User can choose between several waveforms via a dropdown on the node. Speed is in seconds.
4 Pole Switch
Choose between 4 inputs via a dropdown list on node.
3 Pole Switch
Choose between 3 inputs via a dropdown list on node.
2 Pole Switch
Choose between 2 inputs via a dropdown list on node.
Value by Distance To Camera
Sets a range of values based on each point’s distance to camera.
Kill by Camera Distance
Deletes particles closer or further than a set distance from the camera. 
Identify Single Point
“Tags” a single point or range of points and returns true when graph evaluates them. Use with billboard “enable” to render a single point.
Newtons Universal Gravitation Force
Simple implementation of universal gravitation. Plug into acceleration. Position should be discretized (updated per frame.) Values are arbitrary, not real-world.
Set Circular Orbital Velocity
Calculates velocity needed to place point into a circular orbit when using a universal gravitation force. Normal vector is typically the effect.up vector.
Position On View Axis
Outputs a position along the axis of the camera into the scene, with distance 0 being the camera position. Useful for defining focal planes etc. 
Color Turbulence
Defines a color based on the location of a point within a vector field.
Spatial Basis Rand
Returns random values based on position in a vector field. Must have a “turbulence” node added to sampler input.
Generate Ring
Distributes all spawned points in a ring or arc. Requires a static (total) number of points.
Generate Cyber Rings
Distributes spawned points into a series of circular arcs. Total spawned points must be static, though they can be animated in the layer.
Generate Line
Distributes spawned points on a line between two input locations. Unlike the debug “draw line” this line is made up of spawned points which can be further animated. Requires a static (total) number of points spawned. 
Random Static
Useful for “glitch” effects. Offsets positions by a random value at random intervals. Spatial mode requires a turbulence sample.

 

Article on 80 Level

https://80.lv/articles/using-hooke-s-law-to-create-vfx-effects/

I wrote an article for the game-and-vfx website 80 Level a while back, and it’s gone live. The topic is Hooke’s law as implemented in Popcorn FX (and Unity’s VFX graph.) It’s brief but has been well received, I appreciate the feedback I’ve gotten. A second article for 80.lv centered around Newton’s universal gravitation as implemented in PopcornFX (and Houdini this time) is in the works.

Fibonacci emitter module in Unreal Niagara

I created a number of custom emitters for Niagara which I have yet to release to the public. (I wish there was a nice way to package up and share custom modules rather than having to share out entire project files.) These frames are illustrating the use of a fibonacci (or phyllotactic) sphere emitter which is tailor-made for dandelions…

Propagation in PKFX

PopcornFX is a great tool for realtime applications in that it brings to developers a ready-to-integrate particle system which can be used to author sophisticated effects in a nodal/visual style akin to Houdini, ICE etc. I find it much more intuitive than Niagara while easily being as powerful, and it’s integration into After Effects brings those users a level of sophistication with particle effects they simply haven’t had access to before. That said, when I push the limits it understandably can’t chew through the millions of particles Houdini can handle.

For example in PKFX this frost-like propagation effect, which is admittedly computationally expensive, tops out in usefulness at about 50,000 particles. The in-editor framerates are still good (relatively speaking) at 220 ms, comfortable enough for cinematography work in After Effects for example. But when you push the number of particles up beyond that times go up exponentially. By 100k particles (for this particular task, which involves getting neighboring particle information) the editor becomes increasingly likely to crash.

But to be fair this kind of propagation effect is waaay beyond what most realtime engines are engineered to handle. Other effects in PopcornFX can get into the realm of millions of particles without too much trouble, which means those After Effects users have a system which lets them perform most particle effects they are likely to need extremely efficiently… and only need to go to a package like Houdini for the really intensive stuff.

And at the moment these computations are only on the CPU as PKFX is still implementing its GPU support. There is a lot of improvement on the near horizon for these kinds of intensive effects… we may see sph fluids and the like running realtime soon enough.

(It’s also worth mentioning that there is a LOT of room to optimize the effect as built, both with regular settings and as one of the PopcornFX devs points out massive increases in efficiency should be possible by only performing spatial queries on the particles changing values and depositing stable values into a static layer.)

It’s significant that those integrating PopcornFX into realtime tools get a system sophisticated enough that a comparison with Houdini is even possible.

In all, I’m pretty impressed with PKFX and as an effects guy would welcome jobs where it’s integrated into custom pipelines dealing with realtime media even over Niagara and certainly over Unity’s particle system. It is elegant to use without sacrificing power, and it’s universal nature means one day artists might be able to share and use particle assets across multiple engines and custom pipelines.

The free .fga vector fields work fine with PopcornFX

Be advised the scale of the vector fields in this pack should be around .01 or so. If your vector field appears odd, try tweaking the overall scale and magnitude of the fields. The orientation of the vector fields may also need to be adjusted, -90 on the x axis should do it. 

PKFX has a very nice vector field visualizer, but some fiddling around is probably going to be needed since each one of these vector fields was built for other purposes and on a different platform.

Once you get dialed in, however, these .fga vector fields are great.

NPR Shading Continued

I’m continuing to refine the NonPhotoRealistic (NPR) sketch post-process in Unreal. This is using completely different methods now, I’ve changed the method of convolution edge detection for outlines, and am using world-aligned sketch texturing in the shadow and highlight regions.

The background is also given a custom color and texture. The light source is defined through any number of unreal lights.

There is now support for sketchy highlights and varying line colors, and much better response to light. Ideally the post process would support variation in outline width, although I don’t have a good method for that yet.

There are options to use procedural line, dot and crosshatching for a more comic/newsprint look.

The results are very solid and smooth in motion, with no temporal swimming or distractions. I see this shader being ideal for architectural stylization and general NPR usage. 

To get a more chalk-like effect with ink outlines I take this post process and combine it with an NPR painterly process which applies brushstrokes on the image in world space. Here’s the result:

Heightmaps for Unreal

I’ve released 25 terrain/landscape maps for the unreal marketplace. These are intended to act as starting points for environmental projects, hopefully people will find them useful. All heightmaps are of course made in Houdini, and tend to be several miles across.

The most interesting thing about this project was creating the procedural material in unreal which textures large environments based on criterial like slope, height etc. This project is over 10 gigs of assets!

In all, this was a very fun project, and very rewarding work. I can’t wait to see what people do with these heightmaps.