OROCHI
 
Loading...
Searching...
No Matches
GxUnitWaterModel.h
Go to the documentation of this file.
1//===========================================================================
14//===========================================================================
15#pragma once
16
17#if defined(_PS4) || defined(_WINDOWS) || defined(_PS5)
18
19GX_SHADER_NAMESPACE_BEGIN()
20
21//===========================================================================
23//===========================================================================
24class GxUnitWaterModel : public GxUnitModel
25{
26#define FFT_TEXTURE_ARRAY_NUM 8
27
28public:
30 enum class WATER_SURFACE_TECHNIQUE_TYPE
31 {
32 NONE,
33 GERSTNER,
34 DFT,
35 MIDDLE,
36 FFT,
37 MAX,
38 };
39#if GX_DEVELOP
41 GX_ENUM_TABLE_MAX(WATER_SURFACE_TECHNIQUE_TYPE)
42#endif //GX_DEVELOP
43
45 enum class WATER_SURFACE_ENVIRONMENT_MAP_TYPE
46 {
47 FIXED_COLOR,
48 ENV_MAP_COLOR,
49 MAX,
50 };
51#if GX_DEVELOP
53 GX_ENUM_TABLE_MAX(WATER_SURFACE_ENVIRONMENT_MAP_TYPE)
54#endif //GX_DEVELOP
55
56protected:
58 static constexpr u32 GERSTNER_WAVES_NUM_MAX = GxMath::VALUE_4;
59
60 //-----------------------------------------------------------
62 //-----------------------------------------------------------
64public:
65 GX_RTTI_CLASS_NAME( GxUnitWaterModel, GxUnitModel, "水表現用シェーダーモデル" )
66 // ClassBaseReference継承クラス用禁止宣言
67 GX_PROHIBIT_CLASS_BASE_REFERENCE( GxUnitWaterModel )
68
70 //-----------------------------------------------------------
72 //-----------------------------------------------------------
74public:
76 GxUnitWaterModel(void);
78 void cleanup(void) override;
79
81 //-----------------------------------------------------------
83 //-----------------------------------------------------------
85protected:
87 b32 setup(void) override;
89 b32 renderInitialize(RENDER_VIEW view, RENDER_SUB_VIEW subView) override;
91 void render(void) override;
93 b32 checkDoRender(const GxRenderMaterial* pMaterial) override;
94
96 void preRenderWaterSurfaceResource(void);
97
98 // コンスタントバッファハンドルの初期化
99 virtual void initializeConstantBufferHandle(void);
100
102 virtual void initializeResources(void);
103
105 void initializeTextureHTilde0(void);
106
108 void initializeTextureWavesSampler(void);
109
111 void initializeTextureSpectrum12SamplerAndSpectrum34Sampler(void);
112
114 void initializeTextureButterflySampler(void);
115
117 void initializeTexturePingSamplerAndPongSampler(void);
118
120 f32 calculateDFTPhillips(s32 n_prime, s32 m_prime);
122 void calculateWaterSurfaceVerticesHTilde0ForDFT(struct MyVertexElement_hTilde_0* pWaterSurfaceVerticesHTilde0ForDFT);
123
125 f32 calculateFFTOmega(f32 k);
127 f32 calculateFFTSpectrum(f32 kx, f32 ky, b32 omnispectrum = false);
129 void getFFTSpectrumSample(s32 i, s32 j, f32 lengthScale, f32 kMin, f32* pResult);
130
132 void renderTextureFFTInitialize(void);
134 void renderTextureFFTX(void);
136 void renderTextureFFTY(void);
138 void renderTextureFFTXY(u32 shaderPass);
139
141 void drawQuad(u32 shaderPass);
142
144 void simurateFFTWaves(void);
145
147 void createResourceForFFTCalculation(void);
148
149#if GX_DEVELOP
151 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index);
152#endif //GX_DEVELOP
153
155 //-----------------------------------------------------------
157 //-----------------------------------------------------------
159public:
161 constexpr WATER_SURFACE_TECHNIQUE_TYPE getWaterSurfaceTechniqueType(void) const { return _waterSurfaceTechniqueEnable ? _waterSurfaceTechniqueType : WATER_SURFACE_TECHNIQUE_TYPE::NONE; }
163 constexpr void setWaterSurfaceTechniqueType( WATER_SURFACE_TECHNIQUE_TYPE type ) { _waterSurfaceTechniqueType = type; }
164
166 constexpr WATER_SURFACE_ENVIRONMENT_MAP_TYPE getWaterSurfaceEnvironmentMapType(void) const { return _waterSurfaceEnvironmentMapType; }
168 constexpr void setWaterSurfaceEnvironmentMapType( WATER_SURFACE_ENVIRONMENT_MAP_TYPE type ){ _waterSurfaceEnvironmentMapType = type; }
169
171 constexpr f32 getWaveTimeCommon(void) const { return _waveTimeCommon; }
173 constexpr void setWaveTimeCommon( f32 fCommon ) { _waveTimeCommon = fCommon; }
174
176 constexpr f32 getDFTWaveParamLambdaX(void) const { return _dftWaveParamLambda[ 0 ]; }
178 constexpr f32 getDFTWaveParamLambdaY(void) const { return _dftWaveParamLambda[ 1 ]; }
180 constexpr f32 getDFTWaveParamLambdaZ(void) const { return _dftWaveParamLambda[ 2 ]; }
182 constexpr void setDFTWaveParamLambdaX( f32 value ) { _dftWaveParamLambda[ 0 ] = value; }
184 constexpr void setDFTWaveParamLambdaY( f32 value ) { _dftWaveParamLambda[ 1 ] = value; }
186 constexpr void setDFTWaveParamLambdaZ( f32 value ) { _dftWaveParamLambda[ 2 ] = value; }
187
189 constexpr f32 getDFTWaveParamW0Div(void) const { return _dftWaveParamW0Div; }
191 constexpr void setDFTWaveParamW0Div( f32 value ) { _dftWaveParamW0Div = value; }
192
194 GX_FORCE_INLINE b32 getFFTWaveParamIsChoppyEnabled(void) const { return _fftWaveParamIsChoppyEnabled; }
196 GX_FORCE_INLINE void setFFTWaveParamIsChoppyEnabled( b32 isEnabled ) { _fftWaveParamIsChoppyEnabled = isEnabled; }
198 constexpr f32 getFFTWaveParamChoppyFactor( u32 index ) const { return _fftWaveParamChoppyFactor[ index ]; }
200 constexpr void setFFTWaveParamChoppyFactor( u32 index, f32 value ) { _fftWaveParamChoppyFactor[ index ] = value; }
201
202protected:
204 void setConstantBufferCommon(void);
206 void setConstantBufferGerstner(void);
208 void setConstantBufferDFT(void);
210 void setConstantBufferMiddle(void);
212 void setConstantBufferFFT(void);
213
215 f32 getWaveTime(void);
216
218 constexpr void getPropertyWaterSurfaceTechniqueType( void* const pValue ) { *static_cast<WATER_SURFACE_TECHNIQUE_TYPE*>(pValue) = getWaterSurfaceTechniqueType(); }
220 constexpr void setPropertyWaterSurfaceTechniqueType( const void* const pValue ) { setWaterSurfaceTechniqueType(*static_cast<WATER_SURFACE_TECHNIQUE_TYPE*>(const_cast<void*>(pValue))); }
221
223 constexpr void getPropertyWaterSurfaceEnvironmentMapColorType( void* const pValue ) { *static_cast<WATER_SURFACE_ENVIRONMENT_MAP_TYPE*>(pValue) = getWaterSurfaceEnvironmentMapType(); }
225 constexpr void setPropertyWaterSurfaceEnvironmentMapColorType( const void* const pValue ) { setWaterSurfaceEnvironmentMapType( *static_cast<WATER_SURFACE_ENVIRONMENT_MAP_TYPE*>(const_cast<void*>(pValue)) ); }
226
228 GX_FORCE_INLINE void getPropertyCubeMapTextureResource( void* const pValue ) { *static_cast<GxResTexture**>(pValue) = getCubeMapTextureResource(); }
230 GX_FORCE_INLINE void setPropertyCubeMapTextureResource( const void* const pValue ) { setCubeMapTextureResource( *static_cast<GxResTexture**>(const_cast<void*>(pValue)) ); }
232 virtual b32 setCubeMapTextureResource( GxResTexture* pResTexture );
234 GX_FORCE_INLINE virtual GxResTexture* getCubeMapTextureResource( void ) const { return _pResTexture_WaterSurfaceCubeMap; }
235
237 //-------------------------------------------------------------
239 //-------------------------------------------------------------
241protected:
242 b32 _waterSurfaceTechniqueEnable;
243
244 WATER_SURFACE_TECHNIQUE_TYPE _waterSurfaceTechniqueType;
245
246 WATER_SURFACE_ENVIRONMENT_MAP_TYPE _waterSurfaceEnvironmentMapType;
247
248 GX_HANDLE _handleTransformWaterSurface;
249
250 GX_HANDLE _handleApplyWaterSurfaceEnvironmentMap;
251
252 GX_HANDLE _handleApplyWaterSurfaceOn;
253
254 GX_HANDLE _handleWaterSurfaceTechniqueType;
255 GX_HANDLE _handleWaveTime;
256
257 f32 _waveTimeCommon;
258
259 GX_HANDLE _handleGerstnerWavesNum;
260 GX_HANDLE _handleGerstnerWavesDirection;
261 GX_HANDLE _handleGerstnerWavesAmpOverLen;
262 GX_HANDLE _handleGerstnerWavesLength;
263 GX_HANDLE _handleGerstnerWavesSpeed;
264 GX_HANDLE _handleGerstnerWavesSteepness;
265
266 u32 _gerstnerWavesNum;
267 GxVector3 _gerstnerWavesDirection [GERSTNER_WAVES_NUM_MAX];
268 f32 _gerstnerWavesAmpOverLen[GERSTNER_WAVES_NUM_MAX];
269 f32 _gerstnerWavesLength [GERSTNER_WAVES_NUM_MAX];
270 f32 _gerstnerWavesSpeed [GERSTNER_WAVES_NUM_MAX];
271 f32 _gerstnerWavesSteepness [GERSTNER_WAVES_NUM_MAX];
272
273 GX_HANDLE _handleDftWaveParamWaveDimension;
274 GX_HANDLE _handleDftWaveParamWaveGridSize;
275 GX_HANDLE _handleDftWaveParamLambda;
276 GX_HANDLE _handleDftWaveParamW0Div;
277 GX_HANDLE _handleSamplerHTilde0;
278
279 s32 _dftInitialWaveParamDimension;
280 s32 _dftInitialWaveParamGridSize;
281 f32 _dftInitialWaveParamAmp;
282 GxVector2 _dftInitialWaveParamWindDirect;
283 f32 _dftWaveParamLambda[ 3 ];
284 f32 _dftWaveParamW0Div;
285
286 u32 _middleInitialWaveParamNbWaves;
287 f32 _middleInitialWaveParamLambdaMin;
288 f32 _middleInitialWaveParamLambdaMax;
289 f32 _middleInitialWaveParamHeightMax;
290 f32 _middleInitialWaveParamU0;
291 f32 _middleInitialWaveParamWaveDispersion;
292 f32 _middleWaveParamWaveDirection;
293 f32 _middleWaveParamNyquistMin;
294 f32 _middleWaveParamNyquistMax;
295 f32 _middleWaveParamSigmaXsquare;
296 f32 _middleWaveParamSigmaYsquare;
297
298 GX_HANDLE _handleNumberWaves;
299 GX_HANDLE _handleSigmaSquareTotal;
300 GX_HANDLE _handleLods;
301 GX_HANDLE _handleNyquistMinMax;
302 GX_HANDLE _handleWindToWorld;
303 GX_HANDLE _handleSamplerWavesSampler;
304 GX_HANDLE _handleSamplerSkySampler;
305
306 //===== FFTCalculation用ハンドル =====//
307 GX_HANDLE _handleFftSize;
308 GX_HANDLE _handleInverseWaveSizes;
309 GX_HANDLE _handleTimeFftInitialize;
310 GX_HANDLE _handleSamplerSpectrum12Sampler;
311 GX_HANDLE _handleSamplerSpectrum34Sampler;
312
313 GX_HANDLE _handlePass;
314 GX_HANDLE _handleSamplerButterflySampler;
315 GX_HANDLE _handleSamplerImageSampler;
316
317 GX_HANDLE _handleWaveSizes;
318 GX_HANDLE _handleChoppy;
319 GX_HANDLE _handleChoppyFactor;
320 GX_HANDLE _handleSamplerFftWavesSampler[FFT_TEXTURE_ARRAY_NUM];
321 GX_HANDLE _handleFftWaveGridSize;
322
323 f32 _fftInitialWaveParamWaveSizes[ 4 ];
324 s32 _fftInitialWaveParamPasses;
325 b32 _fftInitialWaveParamPropagate;
326 f32 _fftInitialWaveParamCm;
327 f32 _fftInitialWaveParamKm;
328 f32 _fftInitialWaveParamAmp;
329 f32 _fftInitialWaveParamWindSpeed;
330 f32 _fftInitialWaveParamOmega;
331 b32 _fftWaveParamIsChoppyEnabled;
332 f32 _fftWaveParamChoppyFactor[ 4 ];
333 f32 _fftWaveParamWaveGridSize;
334
335 //===== WaterSurfacePixelShader用パラメータ =====//
336 GxVector3 _waveParamSunPosition;
337 GxColor _waveParamEmissiveColor;
338 GxColor _waveParamAmbientColor;
339 GxColor _waveParamDiffuseColor;
340 GxColor _waveParamSpecularColor;
341 f32 _waveParamEmissiveContribution;
342 f32 _waveParamAmbientContribution;
343 f32 _waveParamDiffuseContribution;
344 f32 _waveParamSpecularContribution;
345 f32 _waveParamSpecularPower;
346 f32 _waveParamFresnelRefractive;
347 f32 _waveParamFresnelAdditionalAlpha;
348
349 GxRenderTexture* _pRenderTexture_hTilde0;
350 GxRenderTexture* _pRenderTextureWavesSampler;
351 GxRenderTexture* _pRenderTextureSpectrum12Sampler;
352 GxRenderTexture* _pRenderTextureSpectrum34Sampler;
353 GxRenderTexture* _pRenderTextureButterflySampler;
354 GxRenderTexture* _pRenderTexturePingSampler[FFT_TEXTURE_ARRAY_NUM];
355 GxRenderTexture* _pRenderTexturePingSamplerRT[FFT_TEXTURE_ARRAY_NUM];
356 GxRenderTexture* _pRenderTexturePongSampler[FFT_TEXTURE_ARRAY_NUM];
357 GxRenderTexture* _pRenderTexturePongSamplerRT[FFT_TEXTURE_ARRAY_NUM];
358
359 //===== FFTCalculation用リソース =====//
360 GxResShaderPackage* _pShaderPackageWaterFFTCalculation;
361 GxRenderVertexDeclaration* _pVertexDeclarationFFTCalculation;
362 GxRenderVertexBuffer* _pVertexBufferFFTCalculation;
363 GxResTexture* _pResTexture_WaterSurfaceCubeMap;
364
365 //===== WaterSurfacePixelShader用ハンドル =====//
366 GX_HANDLE _handleInverseViewMatrix;
367 GX_HANDLE _handleSamplerWaterSurfaceCubeMap;
368 GX_HANDLE _handleWaveParamSunPosition;
369 GX_HANDLE _handleWaveParamEmissiveColor;
370 GX_HANDLE _handleWaveParamAmbientColor;
371 GX_HANDLE _handleWaveParamDiffuseColor;
372 GX_HANDLE _handleWaveParamSpecularColor;
373 GX_HANDLE _handleWaveParamEmissiveContribution;
374 GX_HANDLE _handleWaveParamAmbientContribution;
375 GX_HANDLE _handleWaveParamDiffuseContribution;
376 GX_HANDLE _handleWaveParamSpecularContribution;
377 GX_HANDLE _handleWaveParamSpecularPower;
378 GX_HANDLE _handleWaveParamFresnelRefractive;
379 GX_HANDLE _handleWaveParamFresnelAdditionalAlpha;
380 GX_HANDLE _handleIsDrawNormalColor;
381
382 b32 _isDrawNormalMode;
383
385};
386
387GX_SHADER_NAMESPACE_END()
388
389#endif // _PS4 || _WINDOWS || _PS5
#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__)
GxClassBaseReference継承の禁止宣言(new以外の生成禁止 + コピー禁止)
Definition GxBase.h:244
@ MAX
定義数
void GxTypedObject
その他
Definition GxDefine.h:213
u32 GX_HANDLE
ハンドル
Definition GxDefine.h:214
@ NONE
何もしない
RENDER_VIEW
描画優先度(ビュー)
Definition GxRender.h:442
RENDER_SUB_VIEW
描画優先度(サブビュー)
Definition GxRender.h:485
static constexpr u32 VALUE_4
4
Definition GxMath.h:121
プロパティクラス
Definition GxProperty.h:48
マテリアル構造体
Definition GxRenderMaterial.h:18
テクスチャクラス
Definition GxRenderTexture.h:19
頂点バッファを管理する
Definition GxRenderVertexBuffer.h:20
頂点シェーダに渡す頂点の宣言を管理する
Definition GxRenderVertexDeclaration.h:22
シェーダパッケージリソースクラス
Definition GxResShaderPackage.h:19
テクスチャリソース
Definition GxResTexture.h:23
実行時型情報クラス
Definition GxRtti.h:154
モデルクラス
Definition GxUnitModel.h:19
Definition GxColor.h:21
2次元ベクトル
Definition GxVector.h:34
3次元ベクトル
Definition GxVector.h:245
32bitブーリアン
Definition GxDefine.h:173