New Graphics Features

James Lane
Front End Graphics Developer
Wolfram Research

New Features and Improvements:

MaterialShading

Light Directives

[..., offset, CapForm["Round"|"Butt"| "Square"]

Canonicalization of AxisObject

VertexTextureCoordinates->”Flat”

Querying Graphics: AbsoluteOptions[Graphics[...], ]

Software Rasterization Improvements

MaterialShading

Draw surfaces with a realistic "material" appearance

Physically based rendering

Alec Shedelbower, Physically Based Rendering in 3 D Graphics, Friday

tutorial/PhysicallyBasedRendering

Shaders model interaction of light with material, according to optical properties of the material

Set of named materials:

MaterialShading["Gold"]

MaterialShading

Apply MaterialShading to surfaces

Graphics3D[{MaterialShading["Gold"],Sphere[]},Lighting->"ThreePoint"]

Change the materials base color

Graphics3D[{MaterialShading[#],Sphere[]},Lighting->"ThreePoint"]&/@{"Plastic",{"Plastic", Red}}

Use PBR textures to create more realistic custom materials

Graphics3D[{
MaterialShading[<|
"BaseColor"-> Texture[],
"SurfaceNormals"-> Texture[],
"MetallicCoefficient"-> Texture[], "RoughnessCoefficient"-> 0.65|>],
Sphere[]},Lighting->"ThreePoint",Boxed->False,ViewPoint->Front]

Apply MaterialShading to a plot

SphericalPlot3D[1+Sin[5ϕ]/5,{θ,0,Pi},{ϕ,0,2Pi},Axes->False,
PlotStyle-> MaterialShading["Plastic"],PlotPoints->40,Lighting->"ThreePoint"]

Lighting->”ThreePoint” equivalent to:

Graphics3D[{Sphere[]}, Lighting->{{"Directional",GrayLevel[.85],ImageScaled[{1,1,2}]},{"Directional",GrayLevel[.4],ImageScaled[{-1,-2,2}]},{"Directional",GrayLevel[.1],ImageScaled[{.5,2,-1}]}}]

Light Directives

More flexible and convenient than Lighting->{...}

Graphics3D[{
AmbientLight[Blue],
DirectionalLight[Red,{1,0,0}],
PointLight[Green,{3,2,-1}],
SpotLight[Orange,{{0,0,2},{0,0,0}},Pi/10],
Sphere[]
}, Lighting->None]

Same syntax as for Lighting

Light Directives

Additive

Graphics3D[{
(*AmbientLight[GrayLevel[0.3]],
SpotLight[Orange,{{0,0,2},{0,0,0}},Pi/10],DirectionalLight[Red,{1,0,0}],*)
Sphere[{-1,-1,-1},0.7],
(*DirectionalLight[Blue,{0,-1,0}],
PointLight[Green,{3,2,-1}],*)
Sphere[]
}, Lighting->None]

Light Directives

Additive

Lighting->Automatic mixes in default lighting

Graphics3D[{
(*DirectionalLight[Red,{1,0,0}],*)
Sphere[]},Lighting->Automatic]

Light Directives

Syntax to reset previous lights

Reset all previous lights Lighting->None

Graphics3D[{
DirectionalLight[Red,{1,0,0}],
(*Lighting->None,
System`DirectionalLight[Blue,{0,-1,0}],*)
Sphere[]},Lighting->Automatic]

Light Directives

Syntax to reset subset of previous light types

e.g. DirectionalLight[None]

Graphics3D[{Lighting->None,
AmbientLight[GrayLevel[0.3]],
SpotLight[Orange,{{0,0,2},{0,0,0}},Pi/10],DirectionalLight[Red,{1,0,0}],
PointLight[Green,{3,2,-1}],
(*System`DirectionalLight[None],
System`SpotLight[None],
System`PointLight[None],*)
Sphere[]}]

Light Directives

Ambient is a little different, since only 1 Ambient source

Specifying AmbientLight overrides current Ambient lighting

Graphics3D[{
SpotLight[None],DirectionalLight[None],PointLight[None],
(*System`AmbientLight[GrayLevel[0.3]],
System`AmbientLight[Pink],
System`AmbientLight[None],*)
Sphere[]
}]

Dashing, AbsoluteDashing

Specify an offset and cap form for dashes

Dashing[..., offset, cap]
	AbsoluteDashing[..., offset, cap]

Offset dashes

Manipulate[
Graphics[{Line[{{0,0},{2,1}}],Line[{{0,1},{2,0}}],
Opacity[.5],Thickness[.01],
Red,
Dashing[{.1,.1},o/10.0], (* Fraction of Graphics' width *)
Line[{{0,0},{2,1}}],
Blue,
AbsoluteDashing[{50,50},100*o],(* Printer points *)
Line[{{0,1},{2,0}}]
}],{{o,0},-1,1}]

Dashing, AbsoluteDashing

Dashing[..., offset, cap]
	AbsoluteDashing[..., offset, cap]

Change the Cap type. Cap form is applied to each dash

Graphics[{
Line[{{-1,-1},{1,1}}],Circle[],
Dashing[{.1,.1},0,#],Red,Opacity[.5],Thickness[.05],Line[{{-1,-1},{1,1}}],
Dashing[{.1,.1},0,#],
Blue,Thickness[.05],Circle[]
}, ImageSize->Medium]&/@
{"Round","Butt","Square"}

Dashing, AbsoluteDashing

Edges

Manipulate[Graphics[{EdgeForm[{
Dashing[{.03,.03},o, CapForm["Round"]],
Thickness[.01],Red}],Rectangle[],Disk[{8,0.5}, 0.5],
Polygon[{{2,0},{4,1},{6,0}}]}, ImageSize->Full],{{o,0},-0.1,0.1}]

Works in 3D and with VertexColors

Manipulate[Graphics3D[{AbsoluteDashing[{10,10},o,c],Thickness[.01],Line[{{0,0,0},{2,1,1},{4,0,0},{6,1,1}},VertexColors->{Red,Green,Blue,Black}]}],{o,-10,10},{c,{"Round","Square","Butt",None}}]

Exportable

gDash=Graphics[{Line[{{0,0},{2,1}}],Dashing[{.1,.1},0.05,"Round"],Red,Opacity[.5],Thickness[.05],Line[{{0,0},{2,1}},VertexColors->{Red, Green}]},PlotRange->{{-0.1,2.1},{-0.1,1.1}}]

Export[#,gDash]&/@{"try.svg","try.eps","try.pdf","try.png"}

Applications from Tim Shedelbower

({{, , , , , }, {, , , , , }, {, , , , , }, {, , , , , }})

({{, , , , , }, {, , , , , }, {, , , , , }})

Example Exprs:

size=200;
Grid[{{Graphics[{AbsoluteDashing[{0,4},0,"Round"],AbsoluteThickness[2],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Dotted",ImageSize->size],Graphics[{AbsoluteDashing[{0,8},0,"Round"],AbsoluteThickness[4],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Dotted Large",ImageSize->size],Graphics[{AbsoluteDashing[{0,4},0,"Square"],AbsoluteThickness[2],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Box Dash",ImageSize->size],Graphics[{AbsoluteDashing[{0,8},0,"Square"],AbsoluteThickness[4],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Box Dash Large",ImageSize->size],Graphics[{AbsoluteDashing[{1,2},0,"Butt"],AbsoluteThickness[4],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Thin Dash",ImageSize->size],Graphics[{AbsoluteDashing[{4,1},0,"Butt"],AbsoluteThickness[3],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Thick Dash",ImageSize->size]},{Graphics[{AbsoluteDashing[{6,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Six Three",ImageSize->size],Graphics[{AbsoluteDashing[{18,3,6,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Short",ImageSize->size],Graphics[{AbsoluteDashing[{18,3,6,3,6,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Short Short",ImageSize->size],Graphics[{AbsoluteDashing[{18,3,6,3,6,3,6,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Short Short Short",ImageSize->size],Graphics[{AbsoluteDashing[{18,3,1,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Dot",ImageSize->size],Graphics[{AbsoluteDashing[{18,3,1,3,1,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Dot Dot",ImageSize->size]},{Graphics[{AbsoluteDashing[{18,3,1,3,1,3,1,3},0,"Butt"],AbsoluteThickness[1.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Long Dot Dot Dot",ImageSize->size],Graphics[{AbsoluteThickness[1],Line[{{0,0},{1,1}},VertexColors->{Red, Green}],AbsoluteDashing[{.5,18},0,"Butt"],AbsoluteThickness[8],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Railroad",ImageSize->size],
Graphics[{AbsoluteThickness[3],CapForm["Butt"],Line[{{0,0},{1,1}},VertexColors->{Red, Green}],AbsoluteDashing[{9},0,"Butt"],AbsoluteThickness[2.5],White,Line[{{0,0},{1,1}}]},PlotLabel->"Black White Dash",ImageSize->size],
Graphics[{AbsoluteDashing[{8,3},0,"Butt"],AbsoluteThickness[3.5],Line[{{0,0},{1,1}},VertexColors->{Red, Green}],AbsoluteThickness[2.5],CapForm["Square"],White,Line[{{0,0},{1,1}}]},PlotLabel->"Double Dash",ImageSize->size],Graphics[{AbsoluteDashing[{8,8},0,"Butt"],AbsoluteThickness[4],Line[{{0,0},{1,1}},VertexColors->{Red, Green}]},PlotLabel->"Dash Rounded",ImageSize->size]},{Graphics[{AbsoluteThickness[1.5],CapForm["Butt"],Line[{{0,0},{1,1}},VertexColors->{{1,0,0,0.5},{0,1,0,0.5}}],AbsoluteDashing[{6},0,"Butt"],AbsoluteThickness[1.5],Opacity[1],Line[{{0,0},{1,1}},VertexColors->{Red,Green}]},PlotLabel->"Black Gray Dash",ImageSize->size],
Graphics[{AbsoluteThickness[1],CapForm["Butt"],Line[{{0,0},{1,1}},VertexColors->{Red,Green}],AbsoluteDashing[{0,15},0,"Round"],AbsoluteThickness[5],Line[{{0,0},{1,1}},VertexColors->{Red,Green}]},PlotLabel->"Line Dot",ImageSize->size],Graphics[{AbsoluteThickness[1],CapForm["Butt"],Line[{{0,0},{1,1}},VertexColors->{Red,Green}],AbsoluteDashing[{0,15},0,"Square"],AbsoluteThickness[4],Line[{{0,0},{1,1}},VertexColors->{Red,Green}]},PlotLabel->"Line Box",ImageSize->size],Graphics[{AbsoluteDashing[{16,1,8,2,4,3,2,4,1,5},0,"Butt"],AbsoluteThickness[2],Black,Line[{{0,0},{1,1}},VertexColors->{Red,Green}]},PlotLabel->"Log Line",ImageSize->size],Graphics[{AbsoluteDashing[{20,4},0,"Round"],AbsoluteThickness[3],GrayLevel[.8],Line[{{0,0},{1,1}},VertexColors->{RGBColor[1,0,0,0.5],RGBColor[0,1,0,0.5]}],AbsoluteDashing[{14,10},0,"Round"],AbsoluteThickness[2],GrayLevel[.6],Line[{{.01,.01},{1,1}},VertexColors->{RGBColor[1,0,0,0.75],RGBColor[0,1,0,0.75]}],AbsoluteDashing[{6,18},0,"Round"],AbsoluteThickness[1],GrayLevel[0],Line[{{.025,.025},{1,1}},VertexColors->{RGBColor[1,0,0],RGBColor[0,1,0]}]},PlotLabel->"Blurred Dash",ImageSize->size]}}]

size=200;
Grid[{{Graphics3D[{AbsoluteDashing[{0,4},0,"Round"],AbsoluteThickness[2],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Dotted",ImageSize->size],Graphics3D[{AbsoluteDashing[{0,8},0,"Round"],AbsoluteThickness[4],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Dotted Large",ImageSize->size],Graphics3D[{AbsoluteDashing[{0,4},0,"Square"],AbsoluteThickness[2],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Box Dash",ImageSize->size],Graphics3D[{AbsoluteDashing[{0,8},0,"Square"],AbsoluteThickness[4],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Box Dash Large",ImageSize->size],Graphics3D[{AbsoluteDashing[{1,2}],AbsoluteThickness[4],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Thin Dash",ImageSize->size],Graphics3D[{AbsoluteDashing[{4,1}],AbsoluteThickness[3],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Thick Dash",ImageSize->size]},{Graphics3D[{AbsoluteDashing[{6,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Six Three",ImageSize->size],Graphics3D[{AbsoluteDashing[{18,3,6,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Short",ImageSize->size],Graphics3D[{AbsoluteDashing[{18,3,6,3,6,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Short Short",ImageSize->size],Graphics3D[{AbsoluteDashing[{18,3,6,3,6,3,6,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Short Short Short",ImageSize->size],Graphics3D[{AbsoluteDashing[{18,3,1,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Dot",ImageSize->size],Graphics3D[{AbsoluteDashing[{18,3,1,3,1,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Dot Dot",ImageSize->size]},{Graphics3D[{AbsoluteDashing[{18,3,1,3,1,3,1,3}],AbsoluteThickness[1],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Long Dot Dot Dot",ImageSize->size],Graphics3D[{AbsoluteThickness[.5],Line[{{0,0,0},{1,1,1}}],AbsoluteDashing[{.5,18}],AbsoluteThickness[8],CapForm["Butt"],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Railroad",ImageSize->size],
Graphics3D[{AbsoluteThickness[3],CapForm["Butt"],Line[{{0,0,0},{1,1,1}}],AbsoluteDashing[{9}],AbsoluteThickness[2.5],CapForm["Butt"],White,Line[{{0,0,0},{1,1,1.001}}]},PlotLabel->"Black White Dash",ImageSize->size],
Graphics3D[{AbsoluteDashing[{8,3}],AbsoluteThickness[3],CapForm["Butt"],Line[{{0,0,0},{1,1,1}}],AbsoluteThickness[2.5],CapForm["Square"],White,Line[{{0,0,0},{1,1,1.001}}]},PlotLabel->"Double Dash",ImageSize->size],Graphics3D[{AbsoluteDashing[{8,8}],AbsoluteThickness[4],CapForm["Round"],Line[{{0,0,0},{1,1,1}}]},PlotLabel->"Dash Rounded",ImageSize->size]}}]

Canonicalization of AxisObject

[Experimental]

FrontEnd primitive undergirded by Kernel

More versatile than Frame or Axes

Create multiple customizable Axes

MinHsuaun Peng's talk on Visualizations using Axes and Scales

e.g. Multiple-Axes Plots, Parallel Axes, Radial Axis Plots, Ternary Plots

AxisObject[path, scale, options]

Path:

AxisObject[path, ...]

AxisObject of Line, HalfLine, InfiniteLine, Bezier, BSpline, Circle

Graphics[{
AxisObject[{{0,0},{0.3,0.3}}], (* Infinite Line Across PlotRange *)
AxisObject[HalfLine[{{-0.5,0.5},{1,-1}}]],
AxisObject[BezierCurve[ {{-1,0}, {0, 1}, {1,0}, {1.042,1.042}}]],
AxisObject[BSplineCurve[{{0,0.5}, {1, -1}, {2, 1}, {3,0}}]],
AxisObject[Circle[]] 
}]

Graphics[{
AxisObject[{"Horizontal",0.0}],
AxisObject[{"Vertical",0.0}],
AxisObject[{"Horizontal",2, {-1.5,2.5}}],
AxisObject[{"Vertical",1, {-1.25,2.5}}]
}, PlotRange->3]

Scale:

AxisObject[..., scale, ...]

Mapping of values to the Curves

Graphics[AxisObject[InfiniteLine[{{-1,-1},{1,1}}],{0,10}],PlotRange->2, Frame->True]

Graphics[{Circle[],
AxisObject[{"Horizontal",0},{0->10, 1->20}]
}]

Scale values correspond to end points of the curve

Graphics[{
AxisObject[BezierCurve[{{15,-12},{15,15},{40,15}}],{0,10}],
AxisObject[Line[Table[{t Cos[t],t Sin[t]},{t,0,5Pi,0.1}]],{0,10}]}]

Options:

AxisObject[...,options]

Tick Placement | TickPositions

Axis Label Placement | AxisLabel -> Placed[]

LabeOrientation | RotateLabel, TickLabelOrientation

Tick Lines | TickDirection, TickLengths

Tick Labels | TickLabels, TickLabelPositioning

Influence on Image,Plot Range | RangeBehaviour

Custom Scaling | ScalingFunctions

Styling | AxisStyle,  BaseStyle, LabelStyle, TicksStyle

Tick Placement | TickPositions

Hierarchal control

Graphics[
AxisObject[{"Horizontal",0,{0,12}},{0,5},
TickPositions->{{1,4,1},{0.5,5,1},{0.25,5,0.5},{0.125,5,0.25},{{0,5}}},TickLabels->{Automatic,{"A","B","C","D","E"},All,None},
TickLengths->{Scaled[0.1],Offset[18],Scaled[0.05],Scaled[0.02], Scaled[0.05]},
TickDirection->{Up,Automatic,Automatic,Down,"InwardOutward"},
TickLabelPositioning->"Tip"]]

Collision Avoidance:

Tick Labels disappear when overlapping other AxisObjects curves

Tick Labels disappear when overlapping other TickLabels

Graphics[{
AxisObject[{"Horizontal",0}], AxisObject[{"Vertical",0}],
AxisObject[Line[{{-1,-1},{2,1}}]]}, ImageSize->Medium]

Axis Label Placement | AxisLabel -> Placed[]

pts={{1,-1},{-1,0},{2,3},{3,-4},{5,3},{3,1}};
Graphics[{AxisObject[BSplineCurve[pts],Ticks->None,
AxisLabel->Placed[#,#]]}
,Background->LightBlue, ImageSize->Medium]&/@{Above,Below,Before,Center,After,"Start","End",0.0,1.0,0.28,{0.28,Above},{0.28,Below},{0.28,{1.0,1.0}},{0.28,{1.0,0.0}}}

LabeOrientation | RotateLabel, TickLabelOrientation

Graphics[AxisObject[Line[{{0,0},{10,10}}],{0,10},AxisLabel->Placed[#,Center],RotateLabel->#, TickLabelOrientation->#], ImageSize->Medium]&/@{"Parallel","Horizontal","Vertical", "Perpendicular",180 Degree,  {1,2} (* Heading *)}

Tick Lines | TickDirection, TickLengths

Graphics[{
AxisObject[Line[{{-2,-3},{2,-3}}],{0,10},
TickLengths->Scaled[0.05],TickDirection->#],
AxisObject[Line[{{-2,3},{2,3}}],{0,10},
TickLengths->Offset[10],TickDirection->#],AxisObject[Line[{{-3,-2},{-3,2}}],{0,10},
TickLengths->Scaled[0.01],TickDirection->#],AxisObject[Line[{{3,-2},{3,2}}],{0,10},TickLengths->Scaled[0.01], TickDirection->#]}, ImageSize->Medium]&/@{"Inward","Outward","InwardOutward"}

Tick Labels | TickLabels, TickLabelPositioning

Graphics[AxisObject[Line[{{0,0},{10,10}}],{0,10},TickPositions->{{0,10,1}},
TickLabels->{CharacterRange["a","k"]}], ImageSize->Medium]

Graphics[{
AxisObject[Line[{{0,2},{10,2}}],{0,10},TickLengths->Scaled[0.03], TickDirection->Down,TickLabelPositioning->#],
AxisObject[Line[{{0,-2},{10,-2}}],{0,10},TickLengths->Scaled[0.03],TickDirection->Up,TickLabelPositioning->#]}, ImageSize->Medium]&/@{"Base","Tip", Before, After}

Influence on Image,Plot Range | RangeBehaviour

Graphics[{Disk[{0.5,0.5},0.1],
AxisObject[{"Vertical",0.0, {0.5, 1.5}}, TickLabelPositioning->"Tip", 
RangeBehaviour->#]
},Frame->True , FrameStyle->LightGray, PlotLabel->#, ImageSize->Medium]&/@{Automatic,"PlotRange","ImageRange",None}

Custom Scaling | ScalingFunctions

Show[LogPlot[x^x,{x,1,4}],Graphics[{AxisObject[{"Vertical",1.5},ScalingFunctions->{Log,Exp}]}]]

Styling | AxisStyle,  BaseStyle, LabelStyle, TicksStyle

Graphics[AxisObject[Line[{{0,0},{10,10}}],{0,10},TickPositions->{{0,10,2},{1,9,2}},TickLengths->0.1,TicksStyle->{Red,Blue}], ImageSize->Medium]

Graphics[AxisObject[Line[{{0,0},{10,10}}],{0,10},LabelStyle->16,BaseStyle->Red], ImageSize->Medium]

Graphics[AxisObject[Line[{{0,0},{10,10}}],{0,10},AxisStyle->Transparent], ImageSize->Medium]

Querying Graphics

Query more resolved Graphics options:

AspectRatio, ImageSize, ImagePadding, 
	PlotRange, PlotRangePadding, FrameTicks, Ticks

AbsoluteOptions[Graphics[Disk[],AspectRatio->Full],AspectRatio]

AbsoluteOptions[Graphics[{Thickness[.3],Pink,Circle[]},Frame->True,ImageSize->Tiny],{ImageSize,ImagePadding}]

AbsoluteOptions[Graphics[{Disk[{1,1},0.5]}],{PlotRange,PlotRangePadding}]

Querying Graphics

Query how long it takes to render Graphics | Graphics3D

streamPlot =StreamPlot3D[{z,-x,y},{x,-2,2},{y,-2,2},{z,-2,2},StreamMarkers->"Tube",PlotLegends->Automatic];
{streamPlot,Graphics`RenderTiming[streamPlot]}

Graphics`RenderTiming[Expand[(a+b+c+d)^6]]

VertexTextureCoordinates->”Flat”

VertexTextureCoordinates computed from screen coords

Manipulate[Graphics[{Texture[ExampleData[{"TestImage","Sailboat"}]],Rotate[Polygon[{{0,0},{1,0},{.5,1}},VertexTextureCoordinates->#],angle,{.5,.5}]},AspectRatio->aspect, ImageSize->Large]&/@{Automatic,"Flat"},{aspect,.5,1},{angle,0,Pi*2}]

Improvements to Software Rasterization

Upgraded to new version of mesa 20.2 .6

Up to 8 x speed up for rasterization of simple 3D Graphics

"PreferredMesaDriver"  in Options > Global Options > RenderingOptions

Specify mesa software renderer/driver

Llvmpipe | "Softpipe" | openSWR(Windows Only)

LLVMpipe is the software rasterizer commonly used by most Linux distributions for providing OpenGL support when no hardware GPU driver is available/working. Can scale out to multiple CPU cores. OpenSWR newest software rasterizer within Mesa, Intel contributed.

"MesaAntiAliasingSamples" number of samples to use for SuperSampling Antialiasing to improve rasterization quality

CurrentValue[$FrontEndSession,{RenderingOptions,"MesaAntiAliasingSamples"}]

UsingFrontEnd@Rasterize[Style[
Graphics3D[Sphere[],ImageSize->{200,200}],
RenderingOptions->{"3DRenderingEngine"->"Mesa","MesaAntiAliasingSamples"->#}],ImageSize->{200,200}]&/@{1,8}