Skip to content
This repository was archived by the owner on Apr 29, 2021. It is now read-only.

Commit dc2baa3

Browse files
author
Yuncong Zhang
committed
Complete C# part of antialiasing, with temporary shader.
1 parent 41714d2 commit dc2baa3

File tree

9 files changed

+437
-194
lines changed

9 files changed

+437
-194
lines changed

Runtime/Resources/UIWidgets_canvas.cginc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,11 @@ fixed4 frag_mf (v2f i) : SV_Target {
178178

179179
return color;
180180
}
181+
182+
float strokeMask(float u, float v) {
183+
return min(1.0, (1.0 - abs(u * 2.0 - 1.0)) * _alpha) * min(1.0, v);
184+
}
185+
186+
fixed4 frag_stroke_alpha(v2f i) : SV_Target {
187+
return _color * strokeMask(i.ftcoord.x, i.ftcoord.y);
188+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
Shader "UIWidgets/canvas_strokeAlpha"
2+
{
3+
Properties {
4+
_SrcBlend("_SrcBlend", Int) = 1 // One
5+
_DstBlend("_DstBlend", Int) = 10 // OneMinusSrcAlpha
6+
_StencilComp("_StencilComp", Float) = 3 // - Equal, 8 - Always
7+
}
8+
9+
SubShader {
10+
ZTest Always
11+
ZWrite Off
12+
Blend [_SrcBlend] [_DstBlend]
13+
14+
Stencil {
15+
Ref 128
16+
Comp [_StencilComp]
17+
Pass IncrSat
18+
}
19+
20+
Pass { // 0, color
21+
CGPROGRAM
22+
#define UIWIDGETS_COLOR
23+
#include "UIWidgets_canvas.cginc"
24+
#pragma vertex vert
25+
#pragma fragment frag_stroke_alpha
26+
ENDCG
27+
}
28+
}
29+
}

Runtime/Resources/UIWidgets_canvas_strokeAlpha.shader.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_clip.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public static ClipElement create(int saveCount, uiPath uiPath, uiMatrix3 matrix,
3535
newElement.saveCount = saveCount;
3636

3737
var pathCache = uiPath.flatten(scale);
38-
var fillMesh = pathCache.getFillMesh(out newElement.convex);
38+
pathCache.computeFillMesh(0.0f, out newElement.convex);
39+
var fillMesh = pathCache.fillMesh;
3940
newElement.mesh = fillMesh.transform(matrix);
4041

4142
var vertices = newElement.mesh.vertices;

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_impl.cs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ RenderLayer _createMaskLayer(RenderLayer parentLayer, uiRect maskBounds,
419419
var maskState = maskLayer.states[maskLayer.states.Count - 1];
420420
maskState.matrix = parentState.matrix;
421421

422-
drawCallback.Invoke(uiPaint.shapeOnly(paint), mesh, convex, alpha, tex, texBound, textMesh, notEmoji);
422+
drawCallback.Invoke(uiPaint.shapeOnly(paint), mesh, null, convex, alpha, tex, texBound, textMesh, notEmoji);
423423

424424
var removed = this._layers.removeLast();
425425
D.assert(removed == maskLayer);
@@ -528,40 +528,44 @@ void _drawWithMaskFilter(uiRect meshBounds, uiPaint paint, uiMaskFilter maskFilt
528528
layer.draws.Add(CanvasShader.texRT(layer, paint, blurMesh, blurLayer));
529529
}
530530

531-
delegate void _drawPathDrawMeshCallbackDelegate(uiPaint p, uiMeshMesh mesh, bool convex, float alpha,
531+
delegate void _drawPathDrawMeshCallbackDelegate(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha,
532532
Texture tex, uiRect textBlobBounds, TextBlobMesh textMesh, bool notEmoji);
533533

534-
void _drawPathDrawMeshCallback(uiPaint p, uiMeshMesh mesh, bool convex, float alpha, Texture tex,
534+
void _drawPathDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha, Texture tex,
535535
uiRect textBlobBounds, TextBlobMesh textMesh, bool notEmoji) {
536-
if (!this._applyClip(mesh.bounds)) {
537-
ObjectPool<uiMeshMesh>.release(mesh);
536+
if (!this._applyClip(fillMesh.bounds)) {
537+
ObjectPool<uiMeshMesh>.release(fillMesh);
538538
return;
539539
}
540540

541541
var layer = this._currentLayer;
542542
if (convex) {
543-
layer.draws.Add(CanvasShader.convexFill(layer, p, mesh));
543+
layer.draws.Add(CanvasShader.convexFill(layer, p, fillMesh));
544544
}
545545
else {
546-
layer.draws.Add(CanvasShader.fill0(layer, mesh));
547-
layer.draws.Add(CanvasShader.fill1(layer, p, mesh.boundsMesh));
546+
layer.draws.Add(CanvasShader.fill0(layer, fillMesh));
547+
layer.draws.Add(CanvasShader.fill1(layer, p, fillMesh.boundsMesh));
548+
}
549+
550+
if (strokeMesh != null) {
551+
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, 1.0f, strokeMesh));
548552
}
549553
}
550554

551-
void _drawPathDrawMeshCallback2(uiPaint p, uiMeshMesh mesh, bool convex, float alpha, Texture tex,
555+
void _drawPathDrawMeshCallback2(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha, Texture tex,
552556
uiRect textBlobBounds, TextBlobMesh textMesh, bool notEmoji) {
553-
if (!this._applyClip(mesh.bounds)) {
554-
ObjectPool<uiMeshMesh>.release(mesh);
557+
if (!this._applyClip(strokeMesh.bounds)) {
558+
ObjectPool<uiMeshMesh>.release(strokeMesh);
555559
return;
556560
}
557561

558562
var layer = this._currentLayer;
559563

560-
layer.draws.Add(CanvasShader.stroke0(layer, p, alpha, mesh));
561-
layer.draws.Add(CanvasShader.stroke1(layer, mesh.duplicate()));
564+
layer.draws.Add(CanvasShader.strokeAlpha(layer, p, alpha, strokeMesh));
565+
layer.draws.Add(CanvasShader.stroke1(layer, strokeMesh.duplicate()));
562566
}
563567

564-
void _drawTextDrawMeshCallback(uiPaint p, uiMeshMesh mesh, bool convex, float alpha, Texture tex,
568+
void _drawTextDrawMeshCallback(uiPaint p, uiMeshMesh fillMesh, uiMeshMesh strokeMesh, bool convex, float alpha, Texture tex,
565569
uiRect textBlobBounds, TextBlobMesh textMesh, bool notEmoji) {
566570
if (!this._applyClip(textBlobBounds)) {
567571
ObjectPool<TextBlobMesh>.release(textMesh);
@@ -600,16 +604,19 @@ void _drawPath(uiPath path, uiPaint paint) {
600604
var cache = path.flatten(state.scale * this._devicePixelRatio);
601605

602606
bool convex;
603-
var fillMesh = cache.getFillMesh(out convex);
604-
var mesh = fillMesh.transform(state.matrix);
607+
cache.computeFillMesh(this._fringeWidth, out convex);
608+
var fillMesh = cache.fillMesh;
609+
var strokeMesh = cache.strokeMesh;
610+
var fmesh = fillMesh.transform(state.matrix);
611+
var smesh = strokeMesh?.transform(state.matrix);
605612

606613
if (paint.maskFilter != null && paint.maskFilter.Value.sigma != 0) {
607-
this._drawWithMaskFilter(mesh.bounds, paint, paint.maskFilter.Value, mesh, convex, 0, null,
614+
this._drawWithMaskFilter(fmesh.bounds, paint, paint.maskFilter.Value, fmesh, convex, 0, null,
608615
uiRectHelper.zero, null, false, this.___drawPathDrawMeshCallback);
609616
return;
610617
}
611618

612-
this._drawPathDrawMeshCallback(paint, mesh, convex, 0, null, uiRectHelper.zero, null, false);
619+
this._drawPathDrawMeshCallback(paint, fmesh, smesh, convex, 0, null, uiRectHelper.zero, null, false);
613620
}
614621
else {
615622
var state = this._currentLayer.currentState;
@@ -629,21 +636,22 @@ void _drawPath(uiPath path, uiPaint paint) {
629636

630637
var cache = path.flatten(state.scale * this._devicePixelRatio);
631638

632-
var strokenMesh = cache.getStrokeMesh(
639+
var strokeMesh = cache.computeStrokeMesh(
633640
strokeWidth / state.scale * 0.5f,
641+
this._fringeWidth,
634642
paint.strokeCap,
635643
paint.strokeJoin,
636644
paint.strokeMiterLimit);
637645

638-
var mesh = strokenMesh.transform(state.matrix);
646+
var mesh = strokeMesh.transform(state.matrix);
639647

640648
if (paint.maskFilter != null && paint.maskFilter.Value.sigma != 0) {
641649
this._drawWithMaskFilter(mesh.bounds, paint, paint.maskFilter.Value, mesh, false, alpha, null,
642650
uiRectHelper.zero, null, false, this.___drawPathDrawMeshCallback2);
643651
return;
644652
}
645653

646-
this._drawPathDrawMeshCallback2(paint, mesh, false, alpha, null, uiRectHelper.zero, null, false);
654+
this._drawPathDrawMeshCallback2(paint, null, mesh, false, alpha, null, uiRectHelper.zero, null, false);
647655
}
648656
}
649657

@@ -958,7 +966,7 @@ void _drawTextBlob(TextBlob textBlob, uiOffset offset, uiPaint paint) {
958966
return;
959967
}
960968

961-
this._drawTextDrawMeshCallback(paint, null, false, 0, tex, textBlobBounds, mesh, notEmoji);
969+
this._drawTextDrawMeshCallback(paint, null, null, false, 0, tex, textBlobBounds, mesh, notEmoji);
962970
}
963971

964972
public void flush(uiPicture picture) {

Runtime/ui/renderer/cmdbufferCanvas/rendering/canvas_shader.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ static class CanvasShader {
152152
static readonly MaterialByBlendModeStencilComp _texMat;
153153
static readonly Material _stencilMat;
154154
static readonly Material _filterMat;
155+
static readonly MaterialByBlendModeStencilComp _strokeAlphaMat;
155156

156157
static CanvasShader() {
157158
var convexFillShader = Shader.Find("UIWidgets/canvas_convexFill");
@@ -179,6 +180,11 @@ static CanvasShader() {
179180
throw new Exception("UIWidgets/canvas_stroke1 not found");
180181
}
181182

183+
var strokeAlphaShader = Shader.Find("UIWidgets/canvas_strokeAlpha");
184+
if (strokeAlphaShader == null) {
185+
throw new Exception("UIWidgets/canvas_strokeAlpha not found");
186+
}
187+
182188
var texShader = Shader.Find("UIWidgets/canvas_tex");
183189
if (texShader == null) {
184190
throw new Exception("UIWidgets/canvas_tex not found");
@@ -199,6 +205,7 @@ static CanvasShader() {
199205
_fill1Mat = new MaterialByBlendMode(fill1Shader);
200206
_stroke0Mat = new MaterialByBlendModeStencilComp(stroke0Shader);
201207
_stroke1Mat = new Material(stroke1Shader) {hideFlags = HideFlags.HideAndDontSave};
208+
_strokeAlphaMat = new MaterialByBlendModeStencilComp(strokeAlphaShader);
202209
_texMat = new MaterialByBlendModeStencilComp(texShader);
203210
_stencilMat = new Material(stencilShader) {hideFlags = HideFlags.HideAndDontSave};
204211
_filterMat = new Material(filterShader) {hideFlags = HideFlags.HideAndDontSave};
@@ -379,6 +386,18 @@ public static PictureFlusher.CmdDraw stroke1(PictureFlusher.RenderLayer layer, u
379386
);
380387
}
381388

389+
public static PictureFlusher.CmdDraw strokeAlpha(PictureFlusher.RenderLayer layer, uiPaint paint, float alpha, uiMeshMesh mesh) {
390+
var mat = _strokeAlphaMat.getMaterial(paint.blendMode, layer.ignoreClip);
391+
_getShaderPassAndProps(layer, paint, mesh.matrix, alpha, out var pass, out var props);
392+
393+
return PictureFlusher.CmdDraw.create(
394+
mesh: mesh,
395+
pass: 0,
396+
material: mat,
397+
properties: props
398+
);
399+
}
400+
382401
public static PictureFlusher.CmdDraw stencilClear(
383402
PictureFlusher.RenderLayer layer, uiMeshMesh mesh) {
384403
Vector4 viewport = layer.viewport;

0 commit comments

Comments
 (0)