Log 9: End's Cibo.

The video above has a very high bitrate.
If you're having trouble loading it, please check out the compressed video on Youtube.

This piece was created for Clinton Jones' "Eternal Ascent" challenge over the course of a month, from concept to final render. Participants were given a template animation to work with. All models, textures, animations, and shaders beyond that were made for this challence.

Concept

As I was researching inspiration for this challenge, I came across manga panels from my favorite manga "Blame!" that were composed very similarly to the challenge's prompt. I was inspired by the graphical style, and since I've recently been working on realtime shaders, I figured that it would be fun to try to create the most true-to-source manga shader I could in the time I had.

I chose Blender's Eevee render engine. It's a raster engine as opposed to a path tracing one, which gave me better control over stylized shading.

Much of my time was spent modeling Cibo herself, a major character from the manga. I was lucky enough to find some concept art sheets online from the author, Tsutomu Nihei, and based her model off of that.

The other major portion of the render, and perhaps the more unique one, was the stylized shader - which ended up being a near-realtime shader in its implementation. I'd actually love to revisit it and make a proper realtime version for games sometime.

I'm quite happy with how it turned out, so below I've outlined some interesting principles I discovered as I was developeing it.

Shader Breakdown

This shader works by taking the RGB output of another shader, and filtering it. This approach isn't optimal for a realtime rendering context, I'd usually prefer stripping the rendering pipeline of all the unnecessary features and doing this manga filter earlier on to avoid unnecessary computation. But, given this was an offline render it didn't feel too problematic.

It gave me a lot of liberty over what input my shader was working with, so I could use a principled BSDF, for instance, and define PBR properties that would later be filtered through my shader. This gives Cibo her more metallic and reflective legs, and the environment its dry and rough surfaces.

Cel Shading & Hatching

Traditionally, manga is printed in pure black and white. To emulate this, I use a simple threshold which determines whether a pixel will render white or black.

This produces very clean and boring shapes, however, and it doesn't really match the more messy and chaotic scratchy style of Tsutomu's drawings.

So, I created some procedural hatching textures (I mixed a couple of variants together: noise stretched in a single UV direction, and a sine wave to create lines, multiplied with some perlin noise to break it up), and stretched them over the X UV axis. This means that I can orient my UVs to determine which direction the strokes move in, and scale them to determine the size of these strokes.

Multiplied with the RGB input, I now have a more textured and organic pen-stroke-like transition between black and white.

Finally, to avoid creating clean shapes of light and darkness, I add some noise to the RGB input so that when it's wired into the cel shading, it helps mask the otherwise clean and perfect delineations of light and dark.

There is a lot of fiddling and tweaking that can go into getting the exact black-white transition for any given surface.

Halftone

Halftones are a technique to create gradations using a varying density and scale of dots. It's used in manga to create all the gray tones between black and white. This technique is similar to its digital counterpart, dithering. Dithering is applying noise over an image (often black and white, but it could be colored too) to create gradations in tone with a limited palette. It essentially achieves the same result! Just with a slightly different approach.

I use a halftone pattern accross the board in this shader. It's entirely visible on the background, while in the foreground it's masked so that it only appears in a select band of light (to further enhance the sense of transitioning from light to dark). The pattern is generated with a voronoi noise with practically 0 distortion / randomness, and it's mapped in screen space (or 'window', in Blender's terminology) so that it feels separate from the surfaces it's drawn on. This screen space mapping makes sense in a manga context, because halftone patterns are applied by artists across the whole page, and therefore have no perspective distortion.

Because voronoi noise is a series of radial gradients, multiplying it with the RGB input acts as a scale multiplier of these gradients, making larger or smaller dots based on the RGB input's brightness.

Regular patterns like these can produce moire patterns. These are artifacts which occur because of the interaction between two regular patterns (ex. the pixel grid of your screen, and the halftone grid in the shader), and they can be pretty distracting. Adding a smidge of randomness, and rotating the pattern so that it doesn't align with our screen pixel grid (~23 degrees in my case) works well to reduce the moire patterns. It doesn't fully eliminate them, but it's good enough.

Grease Pencil

Blender's grease pencil is super useful for adding contour and intersection lines, which nicely emphasize modeled detail through line art. I kept mine animated each time the camera moved, though it could look good to make this line work more static if it suited the scene better.

Limited Framerate

Because anime is usually animated at 12fps, limiting the framerate of camera movement and animation to 12fps reduces the sensation of ultra-smooth 3D movement, which is uncanny when trying to emulate hand-drawn styles.

Textures

Hand-drawn textures complement the shader very well as they look natural with the art style, and create texture where modeling is unreasonable. In the render, much of the background is a texture drawn onto the interior of a cylinder-like surface.

Effects

I found that many effects (depth of field, bloom, soft shadows, contact shadows, ambient occlusion) were generally hard to match with the manga aesthetic. They're all post processing in Eevee, meaning that they are (unfortunately) calculated later in the pipeline, after Blender's shader graph operations. This means that they aren't ran through the manga shader but instead are calculated after that, and many of them create a softness rarely seen in manga, or produce soft gradations which break the black-and-white-only rule.

With that being said, I still made use of contact shadows, because they only affected the character, who doesn't take a lot of space on screen, and the shot isn't dynamic enough to notice contact shadows' drawbacks.

I did however turn off contact shadows for the second video showing off Cibo, where the camera is far more dynamic. One downside to contact shadows are that they can be inaccurate and shade areas that shouldn't be shaded. Another downside is that they can only use geometry on the screen to calculate shadows, meaning that dynamic shots where new geometry comes into frame will only cast contact shadows from that geometry once it's in view. That is to say, shadows that should always be present will only suddenly appear once the shadow caster is on screen. This is something to watch out for with these screen space effects.

Potentially injecting the manga shader after screen space effects like bloom and ambient occlusion could help utilize these effects without detriment to the aesthetic.

And that's about it! Lots of parameter tweaking, creating variants of the shader for different surfaces, and we have a fairly true to the source stylized shader!