diff --git a/packages/rhi-webgl/src/GLRenderTarget.ts b/packages/rhi-webgl/src/GLRenderTarget.ts index 1265dc62c..103a54052 100644 --- a/packages/rhi-webgl/src/GLRenderTarget.ts +++ b/packages/rhi-webgl/src/GLRenderTarget.ts @@ -245,13 +245,7 @@ export class GLRenderTarget implements IPlatformRenderTarget { ); } else if (this._target.antiAliasing <= 1) { const { internalFormat, attachment } = GLTexture._getRenderBufferDepthFormatDetail(_depth, gl, isWebGL2); - const depthRenderBuffer = gl.createRenderbuffer(); - - this._depthRenderBuffer = depthRenderBuffer; - - gl.bindRenderbuffer(gl.RENDERBUFFER, depthRenderBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthRenderBuffer); + this._depthRenderBuffer = this._createRenderBuffer(internalFormat, attachment); } } @@ -262,33 +256,23 @@ export class GLRenderTarget implements IPlatformRenderTarget { private _bindMSAAFBO(): void { const gl = this._gl; const isWebGL2 = this._isWebGL2; - const MSAADepthRenderBuffer = gl.createRenderbuffer(); /** @ts-ignore */ - const { _depth, colorTextureCount, antiAliasing, width, height } = this._target; + const { _depth, colorTextureCount } = this._target; this._blitDrawBuffers = new Array(colorTextureCount); - this._MSAADepthRenderBuffer = MSAADepthRenderBuffer; gl.bindFramebuffer(gl.FRAMEBUFFER, this._MSAAFrameBuffer); // prepare MRT+MSAA color RBOs for (let i = 0; i < colorTextureCount; i++) { - const MSAAColorRenderBuffer = gl.createRenderbuffer(); - - this._MSAAColorRenderBuffers[i] = MSAAColorRenderBuffer; this._blitDrawBuffers[i] = gl.NONE; - gl.bindRenderbuffer(gl.RENDERBUFFER, MSAAColorRenderBuffer); - gl.renderbufferStorageMultisample( - gl.RENDERBUFFER, - antiAliasing, + const internalFormat = /** @ts-ignore */ - (this._target.getColorTexture(i)._platformTexture as GLTexture)._formatDetail.internalFormat, - width, - height - ); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, MSAAColorRenderBuffer); + (this._target.getColorTexture(i)._platformTexture as GLTexture)._formatDetail.internalFormat; + + this._MSAAColorRenderBuffers[i] = this._createRenderBuffer(internalFormat, gl.COLOR_ATTACHMENT0 + i); } gl.drawBuffers(this._oriDrawBuffers); @@ -300,9 +284,7 @@ export class GLRenderTarget implements IPlatformRenderTarget { (_depth._platformTexture as GLTexture)._formatDetail : GLTexture._getRenderBufferDepthFormatDetail(_depth, gl, isWebGL2); - gl.bindRenderbuffer(gl.RENDERBUFFER, MSAADepthRenderBuffer); - gl.renderbufferStorageMultisample(gl.RENDERBUFFER, antiAliasing, internalFormat, width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, MSAADepthRenderBuffer); + this._MSAADepthRenderBuffer = this._createRenderBuffer(internalFormat, attachment); } this._checkFrameBuffer(); @@ -310,6 +292,24 @@ export class GLRenderTarget implements IPlatformRenderTarget { gl.bindRenderbuffer(gl.RENDERBUFFER, null); } + private _createRenderBuffer(internalFormat: GLenum, attachment: GLenum): WebGLRenderbuffer { + const gl = this._gl; + const { width, height, antiAliasing } = this._target; + const renderBuffer = gl.createRenderbuffer(); + + gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer); + + if (antiAliasing > 1) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, antiAliasing, internalFormat, width, height); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); + } + + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer); + + return renderBuffer; + } + private _checkFrameBuffer(): void { const gl = this._gl; const e = gl.checkFramebufferStatus(gl.FRAMEBUFFER); diff --git a/packages/ui/src/component/advanced/Text.ts b/packages/ui/src/component/advanced/Text.ts index 98a16436a..0eb5edeb9 100644 --- a/packages/ui/src/component/advanced/Text.ts +++ b/packages/ui/src/component/advanced/Text.ts @@ -336,7 +336,7 @@ export class Text extends UIRenderer implements ITextRenderer { const canvas = this._getRootCanvas(); if (this._isContainDirtyFlag(DirtyFlag.LocalPositionBounds)) { this._updateLocalData(); - this._setDirtyFlagTrue(DirtyFlag.LocalPositionBounds); + this._setDirtyFlagFalse(DirtyFlag.LocalPositionBounds); } if (this._isContainDirtyFlag(DirtyFlag.WorldPosition)) { diff --git a/tests/src/rhi-webgl/GLRenderTarget.test.ts b/tests/src/rhi-webgl/GLRenderTarget.test.ts new file mode 100644 index 000000000..e62fcc23b --- /dev/null +++ b/tests/src/rhi-webgl/GLRenderTarget.test.ts @@ -0,0 +1,45 @@ +import { RenderTarget, Texture2D, TextureFormat } from "@galacean/engine-core"; +import { WebGLEngine } from "@galacean/engine-rhi-webgl"; +import { describe, beforeAll, expect, it } from "vitest"; + +describe("GLRenderTarget", () => { + let engine: WebGLEngine; + + beforeAll(async () => { + const canvas = document.createElement("canvas"); + engine = await WebGLEngine.create({ canvas }); + }); + + describe("lifecycle", () => { + it("should create and destroy non-MSAA render target", () => { + const colorTexture = new Texture2D(engine, 512, 512); + const renderTarget = new RenderTarget(engine, 512, 512, colorTexture, TextureFormat.Depth16, 1); + + // @ts-ignore + const glRenderTarget = renderTarget._platformRenderTarget as any; + + expect(() => { + glRenderTarget.activeRenderTarget(0); + glRenderTarget.blitRenderTarget(); + }).not.toThrow(); + + renderTarget.destroy(); + }); + + it("should create and destroy MSAA render target", () => { + const colorTexture = new Texture2D(engine, 512, 512); + const renderTarget = new RenderTarget(engine, 512, 512, colorTexture, TextureFormat.Depth16, 4); + + // @ts-ignore + const glRenderTarget = renderTarget._platformRenderTarget as any; + + expect(() => { + glRenderTarget.activeRenderTarget(0); + glRenderTarget.blitRenderTarget(); + }).not.toThrow(); + + renderTarget.destroy(); + }); + }); + +});