Getting Started with Blender
For CGI I use Blender. It's free software, and can be downloaded as an executable for Mac OS and Ubuntu Linux and Windows, or built from source. I'll work through examples of digital paintings I created in Blender illustrating a female model, trees, wine glasses, lakes, fences, hats, ocean, sun and outdoor scene lighting, backdrops.
Blender is super powerful and will take time to learn. Begin by watching the Blender 4.0 Beginner Tutorial Series by Andrew Price, then follow his more advanced tutorials at Blender Guru. CG Cookie has advanced tutorials, e.g. Jonathan Williamson's Female Character Modeling series. Blender's Web Site has more tutorials and the user manual.
When you get stuck, search the web with google, look into user forums such as Blender Stack Exchange and Blender Artists. Be sure to view the release notes video for Blender 4.2 LTS
All works are Copyright © 1986-2024 by Sean Erik O'Connor. All Rights Reserved
Setup
I'm working on a MacBook Pro laptop with a GPU, trackpad and two button mouse. The workflow is more pleasant after plugging in a large 27" LG display, 3 button mouse with scroll wheel, and desktop keyboard with numpad. You can use the laptop screen for tutorials or manuals while reserving the large screen for blender.
Factory Settings
Especially when upgrading to a new version of Blender, I found it avoids problems to start clean. Generate the default cube view with File ➤ New ➤ General, then clear all settings to default with File ➤ Defaults ➤ Load Factory Settings You'll see the standard Blender interface:
User Settings
Go to Edit ➤ Preferences ➤ Input. To use the laptop keyboard, click on Emulate Numpad which uses the top row of number keys 0-9 on the laptop. Click on Emulate 3 Button Mouse to simulate the middle button on a two button mouse with Alt LMB
In Edit ➤ Preferences ➤ Keymap set Spacebar Action: to Search. Enlarge the text a little by using a scale factor $> 1$ in Edit ➤ Preferences ➤ Interface ➤ Display ➤ Resolution Scale = 1.15
File Path Settings and Hotkeys
Set the file paths for each project in Edit ➤ Preferences ➤ File Paths The fonts are the Mac system fonts. Each project has directories of texture images, python scripts, sounds, and render results. Use double slash // for paths relative to the directory containing the .blend file. I use Gimp as my image editor.
When switching views using the numpad keys 1 3 7 I noticed I was getting dumped out of Perspective Mode into Ortho Mode. To stop this, go to Edit ➤ Preferences ➤ Navigation ➤ Auto and turn off Perspective
In the Outliner, set the Restriction toggles to hide/show objects in the viewport and to enable/disable renders.
We gots tool tips now when you hover over a file name.Add-ons and Extensions
Add-ons
You'll want to enable a few add-ons to help debug your artistry. Go to Edit ➤ Preferences ➤ Add-ons ➤ Click the check box to enable Node Wrangler. Also enable Rigify.
Now you can Ctrl Shift LMB on any shading node to see its output in the 3D window. Node wrangler temporarily routes the output of the selected node to a Viewer node as in this example,
Extensions
You'll also want several extensions. Go to Edit ➤ Preferences ➤ Get Extensions ➤ Allow Online Access. Now you'll see a list of extensions to install.
Search for sapling and install the Sapling Tree Generator Tool After doing Install you'll see the local location
Going to the local location you can see the Python source code which implements Sapling!
Afterwards, turn off internet access again.
Render Settings for Eevee and Cycles
Cycles Render Settings
Tune the render settings to trade off speed and accuracy. Enable Transparent in the Render options so the world background won't show.
Select the fastest device to use for rendering. This will usually be the GPU. In Edit ➤ Preferences ➤ System ➤ Cycles Render Devices, and select GPU or CPU. Here is an example of selecting a GPU for cycles rendering on an Ubuntu/Linux PC.
and on the new MacBook Pro with Apple Silicon for both the ARM CPU and M1 Max GPU.
Eeevee Settings
Material Preview or Lookdev or Eevee mode is much faster than Cycles rendering, but not nearly as accurate. It settings need extensive tweaking to make it closer to the quality of Cycles. To avoid slowing down, Eevee doesn't render transparent or reflective objects by default. For each such object, enable reflections and refractions in both the Eevee render settings and in Editor Type ➤ Material Properties ➤ Viewport Display ➤ Settings ➤ Screen Space Refraction
There can be a major improvement in realism for transparent objects such as an eye. For example, these are the Eevee default settings for an eye Eevee with transparency enabled Cycles render
I have leaves on a tree which whose background is an alpha mask. Eevee will show this as solid black by default. Fix it by changing settings to Editor Type ➤ Materials Properties ➤ Viewport Display ➤ Settings ➤ Blend Mode ➤ Alpha Blend Disable Backface Culling to see the underside of the leaves.
Viewport Default Lighting Tweaks
Viewport Shading ➤ Solid Mode can be adjusted to give the figure better form definition through shadows when you are modeling. Go to Edit ➤ Preferences ➤ Lights ➤ Studio Lights ➤ Edtor ➤ Edit Studio Light you can turn off one light and change the two remaining; one strong light from the upper left to show strong shadows and a softer backlight from below right. You can adjust the diffuse/specular properties of each light. Then do Save as Studio light using the default name. The file will be saved (on macOS) in the file ${HOME}/Library/Application Support/Blender/3.x/datafiles/studiolights/studio/StudioLight.sl
Whenever you want to use your custom studio light in Solid Mode select it in the shading tab (down arrow). and it will look like this for a figure,
Saving Preferences
When you are all done, save your preferences using Edit ➤ Preferences ➤ Save and Load ➤ Save Preferences
The user preferences files are saved in on macOS in $HOME/Library/Application Support/Blender/4.2 and in Linux at $HOME/.config/blender/4.2 You can freely copy these settings files back and forth between macOS and Ubuntu Linux systems. The same goes for the *.blend files.
Importing from Blend File
When using a major new version of Blender, you might have crashes and glitchy behaviour. You might be able to get back to a clean state as follows:
- Delete and reinstall Blender.
- Load default factory settings.
- Set up user preferences manually as above.
- Bring up the default cube scene, then select and delete the cube.
- Append from the .blend file as follows:
3D View Hotkeys
Action | Hot Keys | Description |
---|---|---|
Position 3D cursor | Shift RMB | Where new objects are placed. |
Center object in view | ~ 3 | Center the view around a spot on the mesh (good for zooming in and working on a small area) |
Change modes (pie menu) | Ctrl Tab NUMBER | Select among modes: object, edit, sculpt, weight paint, texture paint, vertex paint, particle edit.) |
Toggle between object and edit modes | Tab | Fast way to toggle since we use this all the time. |
Preview mode (pie menu) | z NUMBER | Select wireframe, solid, material preview (Eevee), render |
Move object | G, Shift G | G for grab. Shift G scales down the motion to fine tune the position. |
Applying Object Scaling Tip
Following Blender Guru's recommendations I always make sure an object's scale is set to 1 as shown in the properties window toggled by N. To do this apply the current scale to the object with Ctrl A Apply Scale
Manipulating Windows
To create a new window, or join windows, right click mouse with the cursor hovering over the boundary between two windows to get a menu.
Lighting
You can view lighting in the Layout Workspace. Eevee mode will be fast enough to give you a close approximation to the rendered view as you pan and zoom. If you have a computer with a really fast GPU or CPU, you can even pan and zoom in the Cycles rendered view if you don't mind a few seconds delay.
Lighting comes not only from lights like the sun or lamps, but from the surrounding environment of sky and landscape if you're outdoors. You need both to get realistic lighting.
Environment Lighting
To get a source of outdoor lighting, I took an HDR Pano (high dynamic range, panoramic) image with an iPhone 7+ camera of an outdoor scene at Palo Alto Foothills park. If Blender is spending a lot of time Updating Lights whenever you switcph between Evee and Cycles, you can increase the speed by scaling down the image width and height at the cost of detail using Gimp.
Go to the Shading Workspace. In the Shader Editor select World instead of object and use Shift A to add these nodes. The first is an Environment Texture node. We open the HDR image file in the node, and the name changes to the file name. The second node is a Hue Saturation Value node which can tweak the background lighting. For example, you can change the brightness with Value.
The ocean is a tough case which won't look right unless you have environment lighting enabled. The mirror ball is a test probe to let you see where the light is coming from.
To show only the environment lighting, in the 3D viewport, select Viewport Shading ➤ Scene World. Here's how Eevee looks: and this is Cycles render:
Sunlight
Adjust the angle of the sun relative to the objects. For sunlight only the angle, not the position matters. Enable multiple importance sampling to reduce noise.
When rendering with evee, only the sun strength in the panel changes the sun intensity; the emission node values are not used.
To see the sun lighting only, in the 3D viewport, select Viewport Shading ➤ Scene Lights.
When rendering with Cycles, both the sun strength and the emission node strength matter. I usually keep the sun strength = 1 and adjust the emission strength.
Combined Lighting
To see the combined lighting in Cycles render, select both Scene Lights and Scene World
Camera
Objects are clipped in the 3D view by default when they are closer to the camera than 1 meter, which is too large. Change this to something small using N ➤ View Tab ➤ Clip Start type in 1cm You'll need to do this in every workspace!
You may still have clipping in the camera view for objects which are far away. To fix this, increase the clipping end distance in the camera settings using Outliner Panel ➤ Lens ➤ Clip End and type in a large number such as 1km
By default, when you are in camera mode, moving the viewpoint dumps you out of it. Stop that by setting N ➤ View Lock ➤ Lock Camera to View You'll need to do this in every workspace!
To enlarge the camera view to fit the entire 3D window, do View ➤ Camera ➤ Frame Camera Bounds Then if you want to adjust the resize the bounds smaller, temporarily disable N ➤ View ➤ View Lock ➤ Camera to View then zoom out with the middle mouse wheel, or on the Mac Command Vertical Swipe on Mouse If you are doing Cycles rendering in the camera view, you can resize the render area smaller within the camera frame. Select the camera in the Outliner. The window borders will show up, and you can drag them.
Modeling
We'll illustrate modeling in the Modeling Workspace with a female figure mesh which I did as a study for a painting,
The basic idea is to use edge loops which follow muscles, tendons and bones so we can animate the figure more easily after rigging and skinning it. But there are many mesh hotkeys to learn first to make this process fast.
Topology
It's important to use polygons with a low number of vertices to make modeling simpler and figures more flexible and to use square faces (quads) whenever possible to make surfaces render more smoothly. We can use a limited number of poles (i.e. vertices with 5 edges) when joining edge loops.
Also see Optimizing Topology for a Game Character by M. Makinen Back to top
Commands for Editing the Mesh
Action | Hot Keys | Description |
---|---|---|
Delete edges / faces / vertices | x | Pick which type to delete from menu. |
Edge loop select | double click LMB | (if you have emulate 3 button mouse enabled) |
Toggle X-ray mode show hidden vertices | ALT z | Useful when using B to select even the hidden back vertices. |
Mesh cut | CTRL R | Subdivide the mesh with a cut |
Generate faces. | F | Create faces between edges and vertices. |
Proportional editing toggle | O | You can alteratively use Sculpting mode. |
Select connected part of the mesh | L | Works in uv mapping also |
Slide Edges | Ctrl E ➤ Edge Slide | |
Split off selection as new object | P | |
Merge vertices | Alt M ➤ Merge at Center | |
Shrink / Flatten vertices | Alt S mouse | Move vertices normal to faces |
To smooth vertices select them in edit mode. Then invoke Ctrl-V ➤ Menu ➤ Smooth Vertices which you can repeat as needed.
To select interior of a mesh you can select two edge loops on opposite ends of an object, such as this arm, using Double Click Left Mouse Button then select the region between for smoothing using Search Menu ➤ Select Loop Inner Region.
Face Loops
Face loops on my model's face following muscles around the eyes, lips, and jaw. I did a grease paint overlay (blue circles) to show the poles which are vertices with more than 5 edges where the edge loops meet: To color the edge loops green, select a loop using double click left mouse (if you have emulate 3 button mouse enabled). Then color the edge using Ctrl E ➤ Mark Freestyle Edge, which you can shorten to Ctrl E y (Red edges are seams used for unwrapping).
Extruding From Face Loops
Start with the face loop for lips. Extrude several times to create the lips.
Dissolving Edges
Simplify the mesh by dissolving edges. Select the edge loop with Double Click Left Mouse Button then remove it with Search Menu ➤ Dissolve Edges
Hiding Portions of the Mesh
I want to work on the mesh behind the ears by temporarily hiding them. First Double Click Left Mouse Button to select an edge loop which joins the ear to the head. Next Search Menu ➤ Select Loop Inner Region to select the entire ear mesh, and H to hide the ear. Once we are done, unhide the ear again with Alt H.
Mirroring the Mesh
I created only half of the mesh as a shortcut since the human body has mirror symmetry That's done by adding a mirror modifier (before the subsurf modifier). Select mirror in the x axis. The mirror plane must be the centered exactly, i.e. the local origin must be correctly positioned. See the Blender Manual: Accurately Positioning the Mirror Plane I'll repeat the method here.
Go into Edit Mode. Select the left edge loop on the half figure double click left mouse (if you have emulate 3 button mouse enabled). Then Shift S ➤ Cursor To Selection puts the 3D cursor at the center of the edge. Go into Object Mode. Use the search menu to select Set Origin ➤ Origin to 3D Cursor which puts the object origin (and thus, the mirror plane) to the 3D cursor. In the Mirror Modifier Panel I set the Merge Limit to 5cm and enable Clipping which causes vertices along the mirror line to snap together without a seam.
Duplicating Finger Mesh by Copying and Pasting Mesh Geometry Within the Same Object
After you've modelled one finger, you can simply duplicate the mesh geometry to create the other fingers. Select a portion of the finger mesh with B. Duplicate with Shift D then immediately drag the duplicate away from the original with the mouse. Move it into place at the new location and connect the edges. Note that all portions of the mesh are still connected to the same object.
Fixing Inconsistent Normals
If you have odd looking pieces in the object, your normals may be inconsistent.
Go into edit mode, select the entire mesh with A, then Recalculate Normals with Shift N You can double check in 3D View by toggling on Viewport Overlays ➤ Overlays ➤ Face Orientation You should see a blue color for the object indicating normals point outwards.
Removing Duplcate Vertices
Duplicate vertices can cause the object surface to look oddd.
To fix this go into mesh mode with TAB and select all vertices with A then do Mesh ➤ Clean Up ➤ Merge by Distance
Now it's fixed!
Body Proportions Guide
I created a body proportion guide by creating a plane, deleting its face, and extruding its edges to give some thickness so we can see it. Then repeat many times to get all the guide bars: Shift D to duplicate and g z to move up to the correct position. Then create text for all the guide bars in the same collection with the same orange emission node material. Edit mode lets you use the keyboard and arrow keys to edit text. The usual resize object commands will work.
You can adjust the proportions more easily in Orthographic Projection mode. If the figure skin looks strange in Viewport Shading ➤ Materials Preview (Evee mode) toggle on Material Properties ➤ Viewport Display ➤ Settings ➤ Backface Culling
Back to topSkin
Making realistic skin is hard -- we'll we'll do it in several steps.
- UV Mapping I did separate UV mapping of head and torso of the female figure to get more control over the skin colors and textures. Tricky: I use an alpha channel from the torso to make sure the colors stay separate and don't mix.
- Skin Material Shaders I use a simplified model of skin material explained in Ben Simonds Three Layer SSS in Blender Demystified. See also Blender manual for subsurface scattering
- Texture Mapping Skin needs some texture. So I start with flat images of skin color, then texture paint on top of them. These color images feed into the skin shaders color inputs.
- Normal Mapping Real skin has pores, bumps and wrinkles, especially on the lipst. Texture painting is too flat and not realistic. So we need to duplicate the head mesh, create a high res copy of it, sculpt the hi res head to make pores and wrinkles. Then we bake into a normal map image which we feed into all the skin shaders.
Marking Seams
Mark seams along edge loops with Ctrl E ➤ Mark Seam on the figure so we will get a clean unwrap. The seams will show up as red edges in Edit mode (The green edges are face loops). I've separated out complicated facial parts such as the ears, nostrils, nipples and separated the head and the torso, marking extra seams to factor out the hands and feet.
To check the seams are partitioning correctly, go into Edit Mode Face Select. Select a face in the mesh then L to highlight all connected faces.
Separate UV Maps for Head and Torso
I did separate UV maps for head and torso and combined them. Just adding them won't work: it will mix the colors of one UV map with the default black color outside the other UV map. Instead, I hook up the alpha channel of the torso UV map to the mix node factor input. The torso alpha channel will be 0 for the head and 1 for the torso. But that's just what we want! We'll add 100% of the head color (fac = 0) with 100% of the torso color (fac = 1). Thus our colors add seamlessly without overlapping.
UV Mapping for Head
Go to the UV Editing Workspace. In Object Data Properties, hit + to create a new UV map, then double click on the default name UVMap to rename it to Head Start clean by tabbing into Edit Mode, selecting the entire mesh with A, deleting any old meshes with U ➤ Reset Now with the entire mesh selected, unwrap it with U ➤ Unwrap. In the left pane you'll see the mesh on a gray image grid background (because you don't have an image created for the UV yet).
Even though we will have different UV maps for head and torso, we must always select the entire body, unwrap it, then move the unwanted pieces of the meshes outside the image.
To make selected vertices show up in both left and right panels, synchronize the left and right panel views by going into UV Editor Left Panel ➤ Face Mode in the left panel, and making sure you've selected UV Editor Left Panel ➤ UV Sync Selection In the right panel click on a face in the torso mesh, then use L to select the torso. Your selected mesh should show up in the left panel also. Use G to move it outside th gray grid square. Once you get it out of the way, you can shrink it with S. Similarly, move the other parts of the body out of the domain of the image grid. Then select the head, nostrils, and ears and move them into the image and arrange them using rotation R, scaling S and translation G You can smooth out the pieces of the mesh with the tools in the left panel. Here I rotate the left part of the lips to straighten them out. You'll get smoother coverage of texture with a more regular uv grid. Now create a new UV image for the head mesh. We'll use the default resolution of 1024 pixels, The * on the Image button means we should remember to save this changed image. Let's rename the image name to Head then save it away in the /Textures directory,
Note: Blender won't automatically save your UV images. But it will put a star next to it to remind you to save with Alt S
Texture Painting
Go to the Texture Paint Workspace In the Left Panel pick Editor Type ➤ Image Editor, Editor Context ➤ Paint. In the Right Panel pick Object Interaction Mode ➤ Texture Paint,
Intermission: After upgrading to a new macOS, I got this problem where texture draw in the left pane crashed Blender. Fix it by Toggling Off the UV grid display.
Let's say you want to work on the Head UV map. Make sure to select the name of the UV map for the head in the Properties Panel ➤ Object Data Properties ➤ UV Maps making sure the camera icon is clicked on: NOTE: Also go to the Shading Workspace and click on the image texture node for the head to make it active. Otherwise you won't be able to paint with the brush in both the 3D viewport and the UV Editor portions of the workspace.
In the Left Panel bring up paint tools with T and their settings with N. Select a brush type, color, radius, strength and use Mix. Paint it directly on the model. Here I'm painting over the lips. I like to dial down the strength with Shift F and make several passes to imitiate paintbrush texture.
NOTE: Keep the meshes away from the edges of the image. I noticed when my ear mesh was too close to the image edge, painting on it upper portion caused painting to appear on part of the torso.
Here's what I'm using for skin color, by the way,
For more realistic skin, we want to paint a texture instead of a solid color. In the right panel, in Texture Properties create a new brush. I used a Noise texture to model skin pores, and named it Skin. In the left panel, I experimented and finally used Brush Blending Mode ➤ Darken. Back in the left panel, I created a new Texture Mask and selected the Skin texture. Now I use the brush to paint the texture, selecting a low strength and fairly big size brush. I paint on the model in the right panel and also on the UV map in the left panel, whichever works better. When you are don't don't forget to save the image in the left panel with Alt S.
Now the skin looks less like wax and more like human skin. The lip texture can't be faked with texture painting and is done using normal maps (see below).
Now do the exact same process with the UV map for the torso, starting by creating a new UV map for the torso.
Skin Material Nodes
Let's go into the Shading Workspace Here are all the material nodes we need for skin. I'm using different UV maps head and torso to get more fine detail control. I'll explain all the settings as we go along.
Use Shift A to create the nodes and link their inputs and outputs. Use N to bring up the node properties and change the names and colors of the nodes.
Mostly, I followed people's recommendations for the subsurface scattering radii needed for skin. We'll talk about the scale factor in a moment.
More Realistic Skin with Normal Maps
Texture painting will not be enough for realistic skin. We need to create a high resolution surface and sculpt it with the fine skin detail. However, we are not going to use the high resolution surface directly (that would take forever to render). Instead, we'll cheat by mapping the high resolution surface normals to the low resolution mesh to perturb the light paths and make it appear as if we had the actual high res surface. The process is called normal baking, and while the realism breaks down at sharp viewing angles, it's still pretty good. See How to Bake a Normal Map. These old tutorials are still worth looking at: Andrew Price Normal Baking Tutorial. KatsBits normal baking with cycles
Instead of retopologizing a high resolution sculpted mesh to create a low resolution mesh, I went in the reverse direction by duplicating the low res mesh, and creating a hi res sculpted duplicate.
Creating a Duplicate Hi Res Mesh
Go into the Modeling Workspace and TAB into edit mode. Select any vertex on the the head portion of the mesh, say the cheek, and type L to select all connected parts of the mesh. Now do the same for the lips, nostrils and ears, but add to the selection by doing SHIFT select on a vertex then L. Duplicate the head mesh using SHIFT D then RETURN. Now separate the mesh using P selection ➤ separate and TAB back into object mode. The new head mesh will show on top of the old.
Select the hi res head, then Shift Selectlow res head, then parent it with Ctrl P ➤ Set Parent to Object ➤ (Keep transform) This will anchor it in place. You'll see the Outliner show the parent ➤ child relationship.
In case you have problems later, try this Since the high and low resolution meshes must be aligned perfectly in order to map the normals, get rid of any local transforms by doing Ctrl A ➤ Select Rotation and Scale to both meshes.
Sculpting the Hi Res Mesh
Go to the Sculpting Workspace and select Sculpt Mode. Shift H to hide all other objects except the hi-res head.
This object will only be used for creating the normal map, so delete the materials in Material Properties. TAB into edit mode, select the entire mesh with A and do Ctrl E ➤ Clear Seam and go back into object mode. The hi res head will appear white now. At this point, save a copy of this hi res head by doing Shift D Return then M to move it out of the way to the top of the collection. Rename as LauraHiResHeadSaved, and toggle the filters to turn off its display in viewport and render. If we mess up the next steps, we can recover using this saved object.
Apply the mirror modifier (which is irreversible, which is why we made a copy of the head), delete the subsurf modifier. Add the multiresolution modifier. Subdivide 4 times to get fine enough resolution for the lips when sculpting, and hit Apply.
If you go into Viewport Shading and Edit Mode you can see just how fine the mesh is:
Turn off the X-mirror property so you can draw without duplicating your brush strokes in the x-direction. Select T to bring up the brushes if they are not already present. Select the Draw Brush Select a noise texture to use for the brush using Texture Properties ➤ New Texture ➤ Clouds Adjust the brush radius with F and the mouse. Brush strength is Shift F. Sculpt the high res mesh for the head in the area of the lips,
Baking Normals
Add these three additional nodes for the normal map in the compositing window with Shift A. In UV Map, select the low res head mesh; normal baking needs to know the coordinate system. We'll create the image texture later. Use Tangent Space and leave the Strength later. Don't connect the output yet --- if you do, you'll get a "circular dependency" warning when baking. You can, if you want, connect the outputs and simply ignore the warning.
Baking assumes we have a UV map for the low res mesh already in place, and we do. But since we have multiple UV maps, we will need to explicitly select the UV Map for head to be active. Do that in the Object Data Properties, Also you need to make visible the layers containing both hi res and low res meshes (or you'll get a warning).
Go to the UV Editing Workspace. Now we'll create a blank hi res image. In the in the left pane create a new hi res normal image texture, 4096 x 4096, which is defaulted to black. You can do math inside Blender's input fields such as typing * 4 in the input field. You can drag downwards to copy the value to other fields. Give it a name also, "LauraHeadHiRes" It's important to have the normal map image loaded in the Image Texture - Normals node and the left pane of the UV Editor show the corresponding same name for the active normal map image to avoid getting a warning.
Hit Alt S to bring up a dialog window, then rename and save the blank image to the /textures folder, Now go to the Shading Workspace. Select the normal texture node and open the blank texture image you've just created, Select Non-color Data because it's color coded normal vectors components. Extend paints normals of zero beyond the normal map image applied to the head. A bit of trial and error here to avoid the normal map being applied to the rest of the body.
Go to the UV Editing Workspace and TAB into object mode. In Render Properties ➤ Bake select Bake Type ➤ Normal, Influence ➤ Space ➤ Tangent, Selected to Active, Rays are cast from a point Ray Distance above lo-res mesh into the low-res mesh. Rays must intercept the hi-res mesh along the way in order to bake normals. I adjusted the ray distance up from zero gradually until all the hi-res geometry was intercepted and baked into a proper normal image: fine textured purples, blue and pink, but not large mustard green and red blotches. The working value was 1 cm.
Now we'll bake! In the 3D viewport panel at the right, first select the hi res head, and keeping the mouse in the same spot, shift select the low res head (must be in that order!). The active object is the one last selected. You can look at the outliner panel to confirm the order of the selections are correct by seeing an orange color for the hi res head and a yellow color for the low res head. Then hit the Bake button in the render panel. This will take a few minutes. Hit Alt S to save the image (Blender save won't automatically save your images).
Go back to the Shading Workspace. Reconnect the normal output to the shader nodes inputs,
Hide the hi res image with H. Switch into render mode and adjust the Strength up from zero while rendering. I finally used a strength of 3.3 to show the roughness of the lips but not cause artifacts in the rest of the face.
If you get artifacts it's because you have extraneous normals introduced by the multiresolution head geometry not quite fitting the low res mesh. You can play with the Ray Distance in the Bake Panel. If that fails, one workaround is to paint artifacts out of the normal map image using the background color (zero normal) and resave the image.
Further Work
Eventually, I'd like to generate the normal map for skin with a procedure. Here's mathematics on how to combine two normal maps: combine the normal maps.
Hair
Blender 3.5 has a new hair system using geometry nodes which replaces the old particle system for hair. There is an introductory tutorial on How to Create Realistic Hair in Blender 3.5 New Hair System and an in depth tutorial from Blender Studio
Wig
My figure has complicated UV islands which partially overlap. So I cannot use the hair system on it directly. I will create a separate mesh for a wig with a simple UV map, place the hair on that instead. After that the wig is locked to the skull and moves with it.
First, go into edit mode and use B (box) or C (circle) selection modes to select the hairline in vertex, edge, or face mode. Hold down SHIFT key to deselect and make minor adjustments to your selection. Hit ESC to finish. I used a reference photo of a female with a very short haircut to figure out a reasonable hairline. Selection is faster if you toggle on X-Ray mode Option Z because you can select both sides of the head at the same time.
Duplicate the mesh with Shift D RETURN. Detach this mesh as a separate object from its parent head meash using P, choosing By Selection. You will now see the wig as a new object in the outliner; rename it to wig.
The wig inherits the mirror modifier of the female model. In the wig's Mirror Modifier, do Apply to generate a complete mesh. This removes the modifier so we can place the hair on the entire wig,
The wig is the same size as the head, so you'll have a duplicate render of wig and skull. The 3D view shows overlap in some places because they aren't exactly identical. We'll fix that now. Select the wig and add the Shrinkwrap modifier.
Now select body as the target for the wig to shrink wrap onto, using Target ➤ Object ➤ Eyedropper tool Next, let's shrink the wig slightly smaller than the head so it doesn't render on top of the skull. We must shrink along the direction of the normals to the head surface, Wrap Method ➤ Target Normal Project, keep the wig inside the head surface using Snap Mode ➤ Inside, and use the smallest positive Offset so the wig doesn't intersect the head, which I found is 2mm.
This gives us the final wig with no overlaps with the head.
Creating Hair
We will add hair to our model's head using the Blender 3.5 new hair system based on geometry nodes.
UV Map for Wig
The wig object must have a UV map with no overlapping UV islands. Go into the UV Editing Tab Delete any old UV maps in the UV Maps section using - Start clean by tabbing into Edit Mode, selecting the entire mesh with A, deleting any old meshes with U ➤ Reset Delete any seams inherited from the parent head by selecting the entire mesh with A, then Right Mouse Click ➤ Clear Seam Now with the entire mesh selected, unwrap it with U ➤ Unwrap. In the left pane you'll see the mesh on a gray image grid background (because you don't have an image created for the UV yet). If you put the cursor in an island of the UV mesh in the left pane, you can select the connected vertices with L then rotate with Ror scale with S
It's important to name your UV Surface and also your UV map. In my example, LauraWigMesh and LauraWigUVMapHair Curves
Select the wig, then add an empty hair curve with Shift A.
In the Outliner you'll see the wig has a new Hair Curves object. You might as well rename them from Curves to Hair
There's also a Surface Deform modifier for the Curves object.
Select the Hair Curves object under the Wig object in the Outliner. You must select the curves object, or you won't see the hair sculpting controls, but rather the default sculpting controls
Switch into Sculpt Mode. Select the density brush, set Distance Minimum (the distance between hair roots) to 0.1m, set Curve Shape ➤ Length to 5m and number of control Points to 15 to get maximium smoothness in the curves, and falloff to Projected.
You can now paint with the density brush on the model. Use the F key to change the brush size. I assume you have generated your model symmetric to the x-axis, so you can turn on x-symmetry when you add hair.
Before you comb the hair, enable the sculpt collision option. This prevents the hair from going through the wig (but the hair can still penetrate other objects such as the body). Then comb the hair with the Comb Brush
Select the Density brush again, enable Curve Shape ➤ toggle Length, Shape This will add new hair based on the existing hair curves orientation and shape.
You can select any hair curves using the Paint Selection brush, then switch to the Puff brush so the forehead hairs don't lie so flat. Selected hairs are white and all other hairs are black.
From the Asset Browser select the Hair Curve Proile asset in Write and drag and drop onto the selected hair. Adjust the hair thickness. I set the hair root to 0.5mm
The hair curves we have sparsely placed are called guide curves. Next we generate many more hairs using interpolation. From the Asset Browser select the Interpolate Hair Curves
From the Asset Browser select the Interpolate Hair Curves asset in Generation and drag and drop onto the selected hair.
All the hair vanishes! You must select the hair curves again and select Surface = LauraWig, the name of the wig object, and Surface UV Map, the name of the UV map for the wig. Also enable Surface Rest Position
Notice the difference when we toggle interpolate hair on and off in the viewport display:
The hair is default white so change it to black in the viewport.
Notice if you are in sculpt mode, when you select the hair, only the guide curves are selected (white) and not the interpolated curves (black). That's a nice convenience.
If the wig size changes, the hair curves won't automatically by synchronized to the change. In Sculpt Mode you will have to do this manually by Select Hairs ➤ Curves ➤ Snap to Deformed Surface
Hair Color and Texture
The wig mesh has skin as its default material. As it stands, the hair material, since it's emitted from the wig mesh, will inherit the skin color, which is wrong. So we need to add a new material for hair. Use the principled hair shader. Since my figure has black hair, I'm using the melanin parameters rather than direct colors.
I was getting bright white shiny highlights on the hair. Lowering the sun brightness and increasing the environmental lighting helped somewhat, but there was still too much, so I changed the default offset to a large negative number to push the glint away from most of the hair.
Eyebrows
To create eyebrows, create two objects eyebrow.L and eyebrow.R consisting of planar mesh.
Parent each eyebrow to the head bone by selecting it, then shift selecting the head bone as parent object and using Ctrl-P Set Parent to Bone. Now the wig and both eyebrows have the head bone as parent.
Add hair as above, adding a particle system, materials, combing and so on.
Position the eyebrows and move the vertices just below the skin surface so we render the hair only.
Toggle the wireframe mode with z to see the vertices below the skin more easily.
I cloned the material for the hair in the eyebrows, but modified to make it use finer hairs and different colors. The color of the object, I left as the default skin material. Assign the new eyebrow material in the hair particle system for the eyebrows,
Finally do a test render in the viewport:
Eyes
I followed most of this tutorial on CG Cookie - Creating a Procedural Eyeball except that I use UV mapped image textures instead of procedures.
Creating the Eyeball and Iris Meshes
Place the 3D cursor at a convenient spot. Create the eyeball by adding a UV Sphere using Shift A ➤ Mesh ➤ UV Sphere Dial down the radius to 1.25cm and keep the other defaults. Now we will smooth out the mesh geometry to avoid shading artifacts. Select the vertex the pole, and delete the fan geometry, then select the edge loop with Shift Double Click on one of the loop edges. Fill with a quad grid using Shift Spacebar ➤ Grid Fill and adjust the span and offset to get a smooth even grid.
Select proportional editing with O, select a vertex in the middle of the grid and then pull out normal to the mesh using Alt S and dialing the strength of the influence with the mouse scroll wheel to create the cornea shape. Do the same for the other pole. Add Subsurface modifier to smooth out the mesh. I used 3 levels.
Now we do the iris. Create another UV Sphere using Loop Select an edge at the equator. Then select the hemisphere with Shift ➤ Select ➤ Select Loops ➤ Select Loop Inner-Region and delete it with X ➤ Delete Vertices. Then S Z 0 to flatten the disk. To make a pupil, select the innermost ring with Double Click on a ring edge, Spacebar ➤ Select ➤ Select Loops ➤ Select Loop Inner-Region, pull back the vertices, finally select the fan geometry with Shift B mouse drag and delete the edges to leave a hole for the pupil.
UV Uwrapping for Eyes
Go to the UV Editing Workspace. First we create the outer surface of the eyeball, the Sclera. Create a new image in the left panel called Sclera and use defaults. Save the image with Alt S into your /Textures directory as an image Sclera.png
In the right panel create a new UVMap called UVMapSclera
Reset any previous UV mappings U R. Now we will select the back of the eye mesh and UV unwrap it. Do that by toggling on x-ray mode with Alt z and selecting the mesh with B Mouse Drag Unwrap the mesh using U. Move and shrink the island of vertices using S and G as one would expect. Now do the same for the cornea and the piece of mesh between the two. This way we'll have three disconnected UV mesh islands
Now we need another UV Map for the cornea transparency mask. Hit the + key to generate a new UV Map and rename it Cornea. In the same way as above, create a new image for it, name it Cornea.png and save it to /Textures.
Similarly, set up a UV map for the iris.
Materials for the Eyes
Let's create the materials first and color them later. We'll use the general purpose principled shader for cornea and iris. The Sclera will be the eyeball color but the Cornea will be a Transparency Mask modulating the shader node where white is opaque and black is transparent.
Texture Painting the Eyes
Go to the Texture Paint Tab. We'll paint the iris first.
If you cannot paint onto the iris, check that you've selected the iris object. Also that the faces are pointing towards you (blue not red). If not rotate the iris object around to the front in the viewport.
Once you have duplicated the eye, see section below), texture painting on one iris will mirror onto the other eye's iris.
Now we paint the cornea transparency.
Parenting Iris to Cornea
To tie the iris in place to the cornea, Select the iris (child object) first, Shift Select the parent object (Cornea) next, then do Ctrl-P keep transform
The relationships show up hierarchically in the outline view: Finally, move the eye to the figure with M
Duplicating Eyes
Duplicate the eye using Shift D and move it over out of the way of the first eye. Rename the eyes to mark the left eye with .L and the right eye with .R. This will help with rigging later.
Rigging Eyes
Look at how we do torso rigging
Create two new eye bones with Shift A. Go to bone properties and leave Deform off because we don't want the bone to change the eye shape. Then Select the eyeball object and Shift Select the bone for the eye. Keep the transform.
Do the same for the other eyeball.
Torso Rigging
We'll want to create a skeleton for the figure and pose it by moving the bones. First view Complete Character Rigging by Lee Salvemini and also Jonathon Williamson's Blender Cookie tutorial, Introduction to Character Rigging
To create the rig, I first do Shift A to create a single root bone and move it between the feet. This will position the whole figure. Then selecting the root bone in edit mode, duplicate it using Shift D and move it up to the pelvis to be the first bone in the spine. Next use E to extrude the second bone in the spine, and so on for all the bones including the head bone. For the left arm bones, duplicate the top spine bone with Shift D and move it into position to be the clavicle. Do similarly for the left leg bones, duplicating the bottom spine bone. Rename all the arm and leg bones on the left side, and add the suffix .L Copy the left side bones and move to the right. Now, selecting the right side bones, do W Flip Names to change all the names to the .R suffix. Now we do a bit of clean up and parent the two clavicle bones to the thoracic upper spine bone. Go into Pose Mode, shift select both clavicle bones and finally the thoracic bone, then parent with Ctrl-P keeping the relative bone offset (so one bone doesn't automatically connect to the end of the other bone). parent both femurs to the lumbar spine bone, Parent the entire body armature to the root bone, For the root bone, we just want it to move the body rig, not deform the mesh, so we unset deform, The bones are chained in child/parent relationships, By duplicating bones with Shift-D, we keep all the bones as part of one single object even though they are not directly connected to each other.
Torso Skinning
Go into object mode, click on the mesh, then shift click on the armature, then Ctrl-P with automatic weights to tie the mesh to the armature. You'll see new vertex groups in the mesh controlled by the bones in the armature.
You'll now need to weight paint the vertex group on the mesh associated with each bone. In the List View window above, select the bone in the vertex group of the mesh. The name will be highlighted in white. Turning on the names of the bones will help. Go to Object View in the 3D view and select the mesh. Next go into Weight Painting mode and bring up the brushes with T, selecting the weight between 0 and 1 and selecting the Drawing brush. Weight paint the mesh in the neighborhood of the bone. Default is zero weight (blue) and full weight (red).
Now go into Pose Mode and move the hand bone. You'll see the mesh of the hand move also.
Be sure to weight paint all parts of the hand or you'll see this when moving the bone,
Torso Posing
Select the rig and hit m to move all the bones to their own layer,
You can adjust the pose in pose mode and keep the new pose as the resting pose,
You may need to reset the armature to its resting position,
You can position from inside the object if that's easier. Here I'm moving an eyeball using the eyebone from the inside of the head,
Here's an example of what you can do with the rigging. I switched to pose mode and moved the head bone with G to tilt the entire head, eyes, hair and all. Then did a test render.
Large Objects: an Orbital
We are going to input a huge object: an orbital. It's a ring with radius r = 1.5 x 106 km Spin up the orbital to a 24 hour day/night cycle and check the acceleration, r ω2 = 0.808639 g, which is comfortable for us Terrans. The side walls are 500km up, the trees are 100km tall, and the base of the orbital is 400km wide. Create the orbital with Shift A select mesh torus. Rotate it 90 degrees. Apply the rotation factor to the object with Ctrl-A so the rotations return to 0 and the torus lines up with the coordinate axis in its rotated position. Finally, we want the torus origin to be it's center, not the bottom, so bring up the tools with T and select Origin to Geometry. The yellow object center dot will shift from bottom to middle.
Checking Backface Culling will help you view the mesh better as you edit it to remove the inner rings. Also you can select the seam in the middle with Alt Shift Select and dissolve To see the orbital, you need to greatly extend the clipping end range Finally, enter in the dimensions of the orbital and translate it upwards in z by the orbital radius so that the female figure is positioned near the bottom inner surface. As you zoom out to see the huge orbital, you may lose the female figure. Select the figure and hit space bar view selected to find it. The same goes for zooming out to see the orbital, with the origin marked near the bottom,
Trees
Who doesn't like trees? Please see this three part tutorial series Blender Smoothie: How to Create a Realistic Trees I'll go through a worked example for a painting I'm working on. First you'll need to activate the Sapling add on by clicking the checkbox, Sapling is a python program which generates a tree model as a series of curves. It's located in the directory
To add the tree, do T to get the tool window, then do Shift A and select curve/sapling, You'll see the tree outline and the settings appear in the toolbar. I'm going to load the Callistemon preset tree type in the toolbar, In the tree settings in the toolbar, set the bevel to 4 so the trunk isn't square, There's lots of settings. Try adjusting the tree scale, the number of branch splits, branch lengths, random seed, leaf scale, etc. Use a nonzero vertical attraction because branches grow upwards. You can click a box to show the leaves, If you move the tree, the tree settings go away. As soon as you are done with your tree design, name your tree and save it in export presets, At this point the tree is all curves. You can move it around and scale it. The next step is convert curves to a mesh with Alt C. Be aware this will slow down viewing and rendering considerably. We will separate out the trunk. Shift select vertices on the trunk, then Ctrl L to select connected vertices, Then P choose separate by selection to separate the trunk mesh from the branches mesh. Obtain an image of tree bark, Now go into UV Editing, select the trunk, go into edit mode, Shift Alt Select a a few edge loops and mark them as seams with Ctrl-E Mark Seam. Select all the vertices with A, do u to UV unwrap. Load the tree bark image. Now resize and position the mesh on the image. You can let uv mesh extend beyond image, it will repeat. Go back to Compositing, select the trunk and create a new material. Use the tree bark as texture image in UV mode,
Now let's do leaves. I captured a photograph of a leaf, then used Gimp to erase the background: the foreground is the leaf and the background has alpha = 0. Also create an alpha mask by painting the leaf white and flood filling the transparent background with black, Go to UV Editing, select the leaves and go into edit mode and mask mode. Sapling has already unwrapped the leaves, so each leaf is mapped to the image with an orange mask. However the orientation of the image and leaf square don't match, so you'll have to rotate, translate and scale the mask, Here's the final mapping and how it looks on the leaves in both mask mode and image mode, Now go into Compositing and create new nodes with Shift A. The leaf image feeds into the diffuse BDSF shader and the leaf alpha mask feeds into the mix shader. One more thing, to avoid showing the leaf background as white in the viewport, dial down the alpha setting in the materials pane, Do a test render,
Leaves
We'll use the particle system to spread leaves all over the floor of the treehouse.
Select the object which hosts the particles. Properties Editor->Particle Properties Select Hair, not emitter. Render Properties Render As Object. Object->Instance Object->Eyedropper, then select donut in 3D viewport Or create a new collection, add your objects to the collection, then in the above, Render As Collection instead. Scale, Scale Randomness. Click on Advanced. Enable Rotation. Randomize Phase and phase. Particle Properties->Use Count, up the count to sample those objects more from the collection. Object Data Properties (mesh)-> Vertex Groups. Add Group. Particle Properties->Vertex Groups->Density Add Group. 3D Viewport Weight paint mode. Brush blue = 0 density, Red = 1 (highest) density. You’ll see the donuts rearrange their positions to avoid blue and attract to red. Particle Settings Click off TV monitor icon to hide the particles to speed up.
Fence
Now let's do a fence using the array modifier. First create a segment of the railing by adding a Nurbs curve with Shift A Go into Edit mode and shape it with the control points. The main properties we'll use for now are Bevel to add thickness and create a tube instead of wire, Clear the object's rotation and scale to defaults (zero angles, scale = 1) with Ctrl A Rotation and Scale This is because the array modifier uses offsets based on rotation and scale of the object. Set the object’s origin to the geometry using Shift Ctrl Alt C Geometry to Origin. The object’s (0,0,0) is the center of the object, bounding box center, I think? You'll see it marked with a small yellow dot. Now create an Empty object using Shift A Empty Plain Axes. Clear the empty's rotation and scale to defaults (zero angles, scale = 1) with Ctrl A Rotation and Scale Now some contortions to match the origins of both the empty and the curve. Select the railing and move the 3D cursor to railing’s origin with Shift-S Cursor to Selected Finally move the empty's origin to the 3D cursor to make empty and curve share the same origin by selecting the empty and using Shift-S Cursor to Selected Let's rename the empty to Railing Control You should see something like this: Now select the railing again and add an Array modifier. For its settings, let's pick a Relative Offset of x = 0.5cm, a Fixed Count of 5 to begin with and for the Object Offset select the empty. Now rotate the empty in z and increase the array fixed count. You'll see that each copy of the railing object is offset by the empty's angle giving a circle, If you want to move this structure, remember to select both the curve and the empty simultaneously with Shift Select You can adjust the angle of the railing by selecting it, going into edit mode and rotating the base element in z,
Mirror Ball
About the mirror ball... We can use the new principled shader for all materials. See Andrew Price's Blender Guru Presentation The main features are:
- Fresnel is built-in: glancing angles show mirror reflections correctly. What is Fresnel?
- Leave specular at the default 0.5 for IOR = 1.5
- Real materials are either metals (1) or dielectrics (0), not in between.
- Metals have reflection only. The metal reflection color is set in the specular tint. Diffuse materials don’t have specular tint.
- For glass and water: use metallic = 0, roughness = 0, transmission = 1, IOR = whatever
- Sheen and Sheen Tint is for fabric like velvet.
- Clearcoat. TBD.
- TBD Image Texture Node, set to Non-Color Data, feed into Metallic input in Principled BSDF node.
- For dielectrics, adjust roughness. This will automaticaly reduce Fresnel.
Wine Glass
We'll render a wine glass (with wine) using the glass liquid interface method. The key is to make sure all interfaces, air/glass, glass/water, and air/water have the correct index of refraction and (IOR) that the normals point in the correct direction. The IOR for the glass to water interface is is based on Snell's law and derived as follows:
First we create a two coencentric cylinders connected at top and bottom then extrude and shape it into a wine glass. We also create a face for the liquid surface.
Bring up the settings with N and turn on the normal display, tweaking the normal vector lengths. Note that normal vectors all point outwards from the surface by default. Add a new Glass BSDF material with the color white, i.e. clear glass. The index of refraction (IOR) = 1.5 [glass] / 1.0 [air] = 1.5, assuming outward pointing normals. Give it a name WineGlass. Select all vertices for the glass to air interface which are those on the outside of the glass plus the inside of the glass above the liquid surface. Assign this material to the vertices.
Create a new material Wine with IOR = 1.33 [water] / 1.5 [glass]= 0.8. Select the vertices on the inside surface of the glass. Assign the vertices to this material.
Create the final material Wine Top with IOR = 1.33 [water] / 1.0 [air]. Select the top liquid surface. Verify the normals are pointing upwards. Assign the vertices to this material.
Do a test render,
Table Cloth
We'll do a simple table cloth.
First create a simple plane with an opaque material, Then add a Multiresolution Modifier, subdivide a few times, then go into Sculpt Mode, bring up a grab Brush, adjust its radius and strength settings and put wobblies into the cloth, we'll add a Cloth Modifier Adjust it in the Physics tab to do Self-intersection so the folds look right, The table cloth must not fall through the table! Add a Collision Modifier to the table top, Blender has gravity turned on by default in the -z direction. To engage the physics, and allow the table cloth to fall in folds across the table, Play in the Animation panel, Here's our test render in the viewport,
Ocean
Let's do a ocean! I based it on Create Large Scale Oceans in Blender 2.8 by Dylan Neill
First create a large plane 200m x 200m. Subdivide it with 64 cuts.
Add a Principled BSDF material node with no color (black). Since we have an air to water interface, set IOR = 1.33 and 100% transmission, alpha = 1.0. Set roughness to 0 since the ocean modifier will provide the surface irregularity.
Add a Subsurf Modifier, then an Ocean Modifier. In the Ocean Modifier set Geometry ➤ Displace since we'll be modifying the flat plane geometry. Resolution is cranked up gradually until we get enough detail in the waves, but not to slow down the rendering a lot. Spatial size = 200 to match the plane size. Smallest wave = 0 so as not to smooth out detail. Play with alignment and direction of the waves. Set Damping = 0.
Adjust the world lighting in Look Dev Mode. Mine is very simple, just a single sky blue color which will be reflected in the ocean surface, Do a test render,
Compositing
Composition can denoise renders, tune overall colors and superimpose rendered objects over a painted background image. It's done in the Compositing Workspace
Background Image
We can do a matt painting for the background scene in Gimp to save rendering time for large and distant objects. This will let us do two things:
- While modeling, give us a background painting for reference before we do any rendering.
- After rendering, provide the background painting. The rendered view will go on top of it.
Create a new node using Shift A ➤ Image ➤ Background. Then load the image from file.
You can adjust the background image position, size and depth in the Properties Editor ➤ Object Data Properties
Composition Nodes
We are going to render our objects with a transparent background, so it can be placed on top of a background painting. Properties Area ➤ Render Properties ➤ Film ➤ Transparent We'll use the new denoiser which eliminates most of the speckles from the cycles render.
Scale and translate the background image until the render view is placed where you want it. I've turned on Wrap ➤ Both Axes to make the image wrap around, though it would work better if the image were periodic. Use the Alpha Over node with Fac = 1 and the render image in the bottom slot to merge the render image on top of the background image. You'll need to send the final image to the Composite node to get the rendered image; to the File Output node to save the final image to file (note the relative path //Render; and to the Viewer node to see the result in this Compositing workspace.
Rendering
Rendering the image with this button which will bring up a new window If you switch to the compositor, it will now show the complete scene. To speed up renders, you can make sure your image size is no more than needed. In the camera view, Ctrl-B drag mouse to create a smaller subwindow to render in.
Building Blender from Source Code
Building Blender on Mac OS
Follow instructions in Building Blender for macOS
You can also build with XCode and do source level debugging!
Building Blender on Ubuntu Linux
Follow instructions at Building Blender in Ubuntu from Source Code
Timing tests for Blender
Cyberpower PC AMD, Ubuntu Linux 20.04 LTS (Focal Fossa), CPU render | 23 seconds |
Mid 2015 MacBook Pro 2.5GHz Intel quadcore i7 16GB, macOS Monterey, CPU render | 22 seconds |
2018 MacBook Pro 15 inch 2.9GHz Intel 6-Core Intel Core i9, 32GB, macOS Monterey, CPU render | 19 seconds |
2021 MacBook Pro Apple M1 Max 64GB, macOS Monterey, CPU render | 8 seconds |
2021 MacBook Pro Apple M1 Max 64GB, macOS Monterey, GPU render | 5 seconds |