@@ -49,11 +49,13 @@ export class ScreenPositionRC extends RC {
4949 . addControl ( new SelectControl ( 'mode' , node , 'Mode' , ModeOptions as any , false ) ) ;
5050 }
5151
52- static initScreenPositionContext ( compiler : ShaderGraphCompiler , mode : ModeValue ) {
52+ static initScreenPositionContext (
53+ compiler : ShaderGraphCompiler ,
54+ mode : Exclude < ModeValue , 'tiled' > ,
55+ ) {
5356 const node = { name : ScreenPositionRC . Name , data : { } } as any ;
5457 const vertVar = 'ScreenPosition' + capitalizeFirstLetter ( mode ) ;
5558
56- // TODO 确认结果是否正确
5759 let code = '' ;
5860 if ( mode === 'default' ) {
5961 const screenPositionVar = ScreenPositionRC . initScreenPositionContext ( compiler , 'raw' ) ;
@@ -72,19 +74,13 @@ export class ScreenPositionRC extends RC {
7274 } else if ( mode === 'center' ) {
7375 const screenPositionVar = ScreenPositionRC . initScreenPositionContext ( compiler , 'raw' ) ;
7476 code = `let ${ vertVar } = vec4f((${ screenPositionVar } .xy / ${ screenPositionVar } .w) * 2.0 - 1.0, 0., 0.);` ;
75- } else if ( mode === 'tiled' ) {
76- const screenPositionVar = ScreenPositionRC . initScreenPositionContext ( compiler , 'raw' ) ;
77- const screenWidth = ScreenRC . initScreenContext ( compiler , 'width' ) ;
78- const screenHeight = ScreenRC . initScreenContext ( compiler , 'height' ) ;
79- code = `let ${ vertVar } = fract(vec4f(((${ screenPositionVar } .x / ${ screenPositionVar } .w) * 2. - 1.) * ${ screenWidth } / ${ screenHeight } , (${ screenPositionVar } .y / ${ screenPositionVar } .w) * 2.0 - 1.0, 0.0, 0.0));` ;
8077 }
8178
8279 compiler . setContext ( 'vertShared' , node , mode , { varName : vertVar , code } ) ;
83-
8480 const varyingVar = compiler . setContext (
8581 'varyings' ,
8682 node ,
87- + 'v_ ' + mode ,
83+ 'v ' + mode ,
8884 varName => `${ varName } : vec4f` ,
8985 ) ;
9086 const defVar = compiler . setVarNameMap ( node , mode , vertVar , varyingVar ) ;
@@ -93,9 +89,20 @@ export class ScreenPositionRC extends RC {
9389 }
9490
9591 compileSG ( compiler : ShaderGraphCompiler , node : SGNodeData < ReteScreenPositionNode > ) : SGNodeOutput {
96- return {
97- outputs : { out : ScreenPositionRC . initScreenPositionContext ( compiler , node . data . modeValue ) } ,
98- code : '' ,
99- } ;
92+ if ( node . data . modeValue !== 'tiled' ) {
93+ return {
94+ outputs : { out : ScreenPositionRC . initScreenPositionContext ( compiler , node . data . modeValue ) } ,
95+ code : '' ,
96+ } ;
97+ } else {
98+ const outVar = compiler . getOutVarName ( node , 'mode' , 'screenPos' + node . data . modeValue ) ;
99+ const screenPositionVar = ScreenPositionRC . initScreenPositionContext ( compiler , 'raw' ) ;
100+ const screenWidth = ScreenRC . initScreenContext ( compiler , 'width' ) ;
101+ const screenHeight = ScreenRC . initScreenContext ( compiler , 'height' ) ;
102+ return {
103+ outputs : { out : outVar } ,
104+ code : `let ${ outVar } = fract(vec4f(((${ screenPositionVar } .x / ${ screenPositionVar } .w) * 2. - 1.) * ${ screenWidth } / ${ screenHeight } , (${ screenPositionVar } .y / ${ screenPositionVar } .w) * 2.0 - 1.0, 0.0, 0.0));` ,
105+ } ;
106+ }
100107 }
101108}
0 commit comments