1
1
import { now } from '../../core/time.js' ;
2
2
3
- import { math } from '../../math/math.js' ;
4
3
import { Mat3 } from '../../math/mat3.js' ;
5
4
import { Mat4 } from '../../math/mat4.js' ;
6
5
import { Vec3 } from '../../math/vec3.js' ;
@@ -9,20 +8,15 @@ import { BoundingBox } from '../../shape/bounding-box.js';
9
8
import { BoundingSphere } from '../../shape/bounding-sphere.js' ;
10
9
11
10
import {
12
- ADDRESS_CLAMP_TO_EDGE ,
13
11
BUFFER_DYNAMIC ,
14
12
CLEARFLAG_COLOR , CLEARFLAG_DEPTH , CLEARFLAG_STENCIL ,
15
13
CULLFACE_BACK , CULLFACE_FRONT , CULLFACE_FRONTANDBACK , CULLFACE_NONE ,
16
- FILTER_LINEAR , FILTER_NEAREST ,
17
14
FUNC_ALWAYS , FUNC_LESSEQUAL ,
18
- PIXELFORMAT_R8_G8_B8_A8 , PIXELFORMAT_RGBA16F , PIXELFORMAT_RGBA32F ,
19
15
PRIMITIVE_TRIANGLES ,
20
16
SEMANTIC_ATTR , SEMANTIC_POSITION ,
21
- STENCILOP_KEEP ,
22
- TEXTURETYPE_DEFAULT
17
+ STENCILOP_KEEP
23
18
} from '../../graphics/constants.js' ;
24
19
import { IndexBuffer } from '../../graphics/index-buffer.js' ;
25
- import { Texture } from '../../graphics/texture.js' ;
26
20
import { VertexBuffer } from '../../graphics/vertex-buffer.js' ;
27
21
import { VertexFormat } from '../../graphics/vertex-format.js' ;
28
22
@@ -194,9 +188,6 @@ class ForwardRenderer {
194
188
this . ambientColor = new Float32Array ( 3 ) ;
195
189
196
190
this . cameraParams = new Float32Array ( 4 ) ;
197
-
198
- // placeholder texture for area light LUTs
199
- this . _createAreaLightPlaceholderLuts ( ) ;
200
191
}
201
192
202
193
destroy ( ) {
@@ -515,139 +506,6 @@ class ForwardRenderer {
515
506
}
516
507
}
517
508
518
- // placeholder LUT textures for area light
519
- _createAreaLightPlaceholderLuts ( ) {
520
- var placeholderLutTex = new Texture ( this . device , {
521
- width : 2 ,
522
- height : 2 ,
523
- format : PIXELFORMAT_R8_G8_B8_A8
524
- } ) ;
525
- placeholderLutTex . name = 'placeholder' ;
526
-
527
- var pixels = placeholderLutTex . lock ( ) ;
528
- for ( var i = 0 ; i < 4 ; i ++ ) {
529
- for ( var c = 0 ; c < 4 ; c ++ ) {
530
- pixels [ i * 4 + c ] = 0 ;
531
- }
532
- }
533
- placeholderLutTex . unlock ( ) ;
534
-
535
- this . device . scope . resolve ( 'areaLightsLutTex1' ) . setValue ( placeholderLutTex ) ;
536
- this . device . scope . resolve ( 'areaLightsLutTex2' ) . setValue ( placeholderLutTex ) ;
537
- }
538
-
539
- // creates LUT texture used by area lights
540
- _uploadAreaLightLuts ( resource ) {
541
-
542
- function createTexture ( device , data , format ) {
543
- var tex = new Texture ( device , {
544
- width : 64 ,
545
- height : 64 ,
546
- format : format ,
547
- addressU : ADDRESS_CLAMP_TO_EDGE ,
548
- addressV : ADDRESS_CLAMP_TO_EDGE ,
549
- type : TEXTURETYPE_DEFAULT ,
550
- magFilter : FILTER_LINEAR ,
551
- minFilter : FILTER_NEAREST ,
552
- anisotropy : 1
553
- } ) ;
554
-
555
- tex . lock ( ) . set ( data ) ;
556
- tex . unlock ( ) ;
557
- tex . upload ( ) ;
558
-
559
- return tex ;
560
- }
561
-
562
- function offsetScale ( data , offset , scale ) {
563
-
564
- var count = data . length ;
565
- var ret = new Float32Array ( count ) ;
566
- for ( var i = 0 ; i < count ; i ++ ) {
567
- var n = i % 4 ;
568
- ret [ i ] = ( data [ i ] + offset [ n ] ) * scale [ n ] ;
569
- }
570
- return ret ;
571
- }
572
-
573
- function convertToHalfFloat ( data ) {
574
-
575
- var count = data . length ;
576
- var ret = new Uint16Array ( count ) ;
577
- var float2Half = math . float2Half ;
578
- for ( var i = 0 ; i < count ; i ++ ) {
579
- ret [ i ] = float2Half ( data [ i ] ) ;
580
- }
581
-
582
- return ret ;
583
- }
584
-
585
- function convertToUint ( data ) {
586
-
587
- var count = data . length ;
588
- var ret = new Uint8ClampedArray ( count ) ;
589
- for ( var i = 0 ; i < count ; i ++ ) {
590
- ret [ i ] = data [ i ] * 255 ;
591
- }
592
-
593
- return ret ;
594
- }
595
-
596
- // create lut textures
597
- var versions = new Int16Array ( resource , 0 , 2 ) ;
598
-
599
- var luts = {
600
- data1 : new Float32Array ( resource , 4 , 16384 ) ,
601
- data2 : new Float32Array ( resource , 4 + 16384 * 4 , 16384 ) ,
602
- majorVersion : versions [ 0 ] ,
603
- minorVersion : versions [ 1 ]
604
- } ;
605
-
606
- if ( luts . majorVersion !== 0 || luts . minorVersion !== 1 ) {
607
- console . warn ( `areaLightLuts asset version: ${ luts . majorVersion } .${ luts . minorVersion } is not supported in current engine version!` ) ;
608
- } else {
609
- var device = this . device ;
610
- var data1 , data2 ;
611
- var format = device . areaLightLutFormat ;
612
-
613
- // pick format for lut texture
614
- if ( format === PIXELFORMAT_RGBA32F ) {
615
-
616
- // float
617
- data1 = luts . data1 ;
618
- data2 = luts . data2 ;
619
-
620
- } else if ( format === PIXELFORMAT_RGBA16F ) {
621
-
622
- // half float
623
- data1 = convertToHalfFloat ( luts . data1 ) ;
624
- data2 = convertToHalfFloat ( luts . data2 ) ;
625
-
626
- } else {
627
-
628
- // low precision format
629
- // offset and scale to avoid clipping and increase precision - this is undone in the shader
630
-
631
- var o1 = [ 0.0 , 0.2976 , 0.01381 , 0.0 ] ;
632
- var s1 = [ 0.999 , 3.08737 , 1.6546 , 0.603249 ] ;
633
-
634
- var o2 = [ - 0.306897 , 0.0 , 0.0 , 0.0 ] ;
635
- var s2 = [ 1.442787 , 1.0 , 1.0 , 1.0 ] ;
636
-
637
- data1 = convertToUint ( offsetScale ( luts . data1 , o1 , s1 ) ) ;
638
- data2 = convertToUint ( offsetScale ( luts . data2 , o2 , s2 ) ) ;
639
-
640
- }
641
-
642
- var tex1 = createTexture ( device , data1 , format ) ;
643
- var tex2 = createTexture ( device , data2 , format ) ;
644
-
645
- // assign to scope variables
646
- device . scope . resolve ( 'areaLightsLutTex1' ) . setValue ( tex1 ) ;
647
- device . scope . resolve ( 'areaLightsLutTex2' ) . setValue ( tex2 ) ;
648
- }
649
- }
650
-
651
509
dispatchGlobalLights ( scene ) {
652
510
var i ;
653
511
this . mainLight = - 1 ;
0 commit comments