diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 02a056c5508..f7c0671bb6c 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1143,6 +1143,7 @@
If [code]true[/code], performs 2D skinning on the CPU rather than the GPU. This provides greater compatibility with a wide range of hardware, and also may be faster in some circumstances.
Currently only available when [member rendering/batching/options/use_batching] is active.
+ [b]Note:[/b] Antialiased software skinned polys are not supported, and will be rendered without antialiasing.
If [code]true[/code], forces snapping of 2D object transforms to the nearest whole coordinate.
diff --git a/drivers/gles_common/rasterizer_canvas_batcher.h b/drivers/gles_common/rasterizer_canvas_batcher.h
index 9def2b95f39..d0c1acf3304 100644
--- a/drivers/gles_common/rasterizer_canvas_batcher.h
+++ b/drivers/gles_common/rasterizer_canvas_batcher.h
@@ -2282,7 +2282,16 @@ PREAMBLE(bool)::prefill_joined_item(FillState &r_fill_state, int &r_command_star
#ifdef GLES_OVER_GL
// anti aliasing not accelerated .. it is problematic because it requires a 2nd line drawn around the outside of each
// poly, which would require either a second list of indices or a second list of vertices for this step
+ bool use_legacy_path = false;
+
if (polygon->antialiased) {
+ // anti aliasing is also not supported for software skinned meshes.
+ // we can't easily revert, so we force software skinned meshes to run through
+ // batching path with no AA.
+ use_legacy_path = !bdata.settings_use_software_skinning || p_item->skeleton == RID();
+ }
+
+ if (use_legacy_path) {
// not accelerated
_prefill_default_batch(r_fill_state, command_num, *p_item);
} else {
@@ -2298,9 +2307,9 @@ PREAMBLE(bool)::prefill_joined_item(FillState &r_fill_state, int &r_command_star
bool buffer_full = false;
if (send_light_angles) {
- // NYI
+ // polygon with light angles is not yet implemented
+ // for batching .. this means software skinned with light angles won't work
_prefill_default_batch(r_fill_state, command_num, *p_item);
- //buffer_full = prefill_polygon(polygon, r_fill_state, r_command_start, command_num, command_count, p_item, multiply_final_modulate);
} else
buffer_full = _prefill_polygon(polygon, r_fill_state, r_command_start, command_num, command_count, p_item, multiply_final_modulate);