@@ -8,7 +8,7 @@ import { BasicRenderPipeline } from "./RenderPipeline/BasicRenderPipeline";
8
8
import { PipelineUtils } from "./RenderPipeline/PipelineUtils" ;
9
9
import { Transform } from "./Transform" ;
10
10
import { VirtualCamera } from "./VirtualCamera" ;
11
- import { Logger } from "./base" ;
11
+ import { GLCapabilityType , Logger } from "./base" ;
12
12
import { deepClone , ignoreClone } from "./clone/CloneManager" ;
13
13
import { CameraClearFlags } from "./enums/CameraClearFlags" ;
14
14
import { CameraType } from "./enums/CameraType" ;
@@ -21,6 +21,7 @@ import { ShaderMacroCollection } from "./shader/ShaderMacroCollection";
21
21
import { ShaderProperty } from "./shader/ShaderProperty" ;
22
22
import { ShaderTagKey } from "./shader/ShaderTagKey" ;
23
23
import { ShaderDataGroup } from "./shader/enums/ShaderDataGroup" ;
24
+ import { TextureFormat } from "./texture" ;
24
25
import { RenderTarget } from "./texture/RenderTarget" ;
25
26
import { TextureCubeFace } from "./texture/enums/TextureCubeFace" ;
26
27
@@ -118,6 +119,8 @@ export class Camera extends Component {
118
119
private _renderTarget : RenderTarget = null ;
119
120
private _depthBufferParams : Vector4 = new Vector4 ( ) ;
120
121
private _opaqueTextureEnabled : boolean = false ;
122
+ private _enableHDR = false ;
123
+ private _enablePostProcess = false ;
121
124
122
125
@ignoreClone
123
126
private _frustumChangeFlag : BoolUpdateFlag ;
@@ -141,7 +144,6 @@ export class Camera extends Component {
141
144
* If enabled, the opaque texture can be accessed in the shader using `camera_OpaqueTexture`.
142
145
*
143
146
* @defaultValue `false`
144
- *
145
147
* @remarks If enabled, the `independentCanvasEnabled` property will be forced to be true.
146
148
*/
147
149
get opaqueTextureEnabled ( ) : boolean {
@@ -161,11 +163,11 @@ export class Camera extends Component {
161
163
* @remarks If true, the msaa in viewport can turn or off independently by `msaaSamples` property.
162
164
*/
163
165
get independentCanvasEnabled ( ) : boolean {
164
- if ( this . _renderTarget ) {
165
- return false ;
166
+ if ( this . enableHDR || ( this . enablePostProcess && this . scene . _postProcessManager . hasActiveEffect ) ) {
167
+ return true ;
166
168
}
167
169
168
- return this . _forceUseInternalCanvas ( ) ;
170
+ return this . opaqueTextureEnabled && ! this . _renderTarget ;
169
171
}
170
172
171
173
/**
@@ -356,15 +358,40 @@ export class Camera extends Component {
356
358
357
359
/**
358
360
* Whether to enable HDR.
359
- * @todo When render pipeline modification
361
+ * @defaultValue `false`
362
+ * @remarks If enabled, the `independentCanvasEnabled` property will be forced to be true.
360
363
*/
361
364
get enableHDR ( ) : boolean {
362
- console . log ( "not implementation" ) ;
363
- return false ;
365
+ return this . _enableHDR ;
364
366
}
365
367
366
368
set enableHDR ( value : boolean ) {
367
- console . log ( "not implementation" ) ;
369
+ if ( this . enableHDR !== value ) {
370
+ const rhi = this . engine . _hardwareRenderer ;
371
+ const supportHDR = rhi . isWebGL2 || rhi . canIUse ( GLCapabilityType . textureHalfFloat ) ;
372
+ if ( value && ! supportHDR ) {
373
+ Logger . warn ( "Can't enable HDR in this device." ) ;
374
+ return ;
375
+ }
376
+ this . _enableHDR = value ;
377
+ this . _checkMainCanvasAntialiasWaste ( ) ;
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Whether to enable post process.
383
+ * @defaultValue `false`
384
+ * @remarks If enabled, the `independentCanvasEnabled` property will be forced to be true.
385
+ */
386
+ get enablePostProcess ( ) : boolean {
387
+ return this . _enablePostProcess ;
388
+ }
389
+
390
+ set enablePostProcess ( value : boolean ) {
391
+ if ( this . _enablePostProcess !== value ) {
392
+ this . _enablePostProcess = value ;
393
+ this . _checkMainCanvasAntialiasWaste ( ) ;
394
+ }
368
395
}
369
396
370
397
/**
@@ -380,7 +407,6 @@ export class Camera extends Component {
380
407
value && this . _addResourceReferCount ( value , 1 ) ;
381
408
this . _renderTarget = value ;
382
409
this . _onPixelViewportChanged ( ) ;
383
- this . _checkMainCanvasAntialiasWaste ( ) ;
384
410
}
385
411
}
386
412
@@ -662,6 +688,17 @@ export class Camera extends Component {
662
688
this . scene . _componentsManager . removeCamera ( this ) ;
663
689
}
664
690
691
+ /**
692
+ * @internal
693
+ */
694
+ _getInternalColorTextureFormat ( ) : TextureFormat {
695
+ return this . _enableHDR
696
+ ? this . engine . _hardwareRenderer . isWebGL2
697
+ ? TextureFormat . R11G11B10_UFloat
698
+ : TextureFormat . R16G16B16A16
699
+ : TextureFormat . R8G8B8A8 ;
700
+ }
701
+
665
702
/**
666
703
* @internal
667
704
* @inheritdoc
@@ -768,10 +805,6 @@ export class Camera extends Component {
768
805
return this . _inverseProjectionMatrix ;
769
806
}
770
807
771
- private _forceUseInternalCanvas ( ) : boolean {
772
- return this . opaqueTextureEnabled ;
773
- }
774
-
775
808
@ignoreClone
776
809
private _onPixelViewportChanged ( ) : void {
777
810
this . _updatePixelViewport ( ) ;
@@ -781,7 +814,7 @@ export class Camera extends Component {
781
814
782
815
private _checkMainCanvasAntialiasWaste ( ) : void {
783
816
if ( this . independentCanvasEnabled && Vector4 . equals ( this . _viewport , PipelineUtils . defaultViewport ) ) {
784
- console . warn (
817
+ Logger . warn (
785
818
"Camera use independent canvas and viewport cover the whole screen, it is recommended to disable antialias, depth and stencil to save memory when create engine."
786
819
) ;
787
820
}
0 commit comments