OROCHI
 
Loading...
Searching...
No Matches
GxUnitModel.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_SHADER_NAMESPACE_BEGIN()
14
15//===========================================================================
17//===========================================================================
19{
20 //-----------------------------------------------------------
22 //-----------------------------------------------------------
24public:
25 // RTTI定義
26 GX_RTTI_CLASS_NAME(GxUnitModel, GxUnitModelBase, "シェーダーモデル")
27 // new, delete定義
28 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::UNIT)
29 // ClassBaseReference継承クラス用禁止宣言
31
32
34 {
35 SINGLE_PASS,
36 SEMI_TRANSPARENCE_DEPTH,
37 SEMI_TRANSPARENCE_COLOR,
38 };
39
40private:
42 static constexpr u32 PREV_RENDER_MATRIX_DEFAULT_COUNT = GxMath::VALUE_4;
43
44protected:
46 enum class SHADER_PASS
47 {
48 SHADOW_0,
49 SHADOW_1,
50 SHADOW_2,
51 SHADOW_POINT_0,
52 SHADOW_POINT_1,
53 SHADOW_POINT_2,
54 PRE,
55 NORMAL,
56 NORMAL_PBR,
58 SEMI_TRANSPARENCE_PBR,
59 MOTIONBLUR_ON,
60 MOTIONBLUR_OFF,
61 ENV_MAP,
62 LIGHT_PROBE_MAP,
63 HIGH_SPEED,
64 VERTEX_LIT_NORMAL,
65 VERTEX_LIT_SEMI_TRANSPARENCE,
66 PRE_SHADOW,
67 POLYGON_LINE,
68#if GX_ENABLE_TESSELLATION
69 SHADOW_0_TESSELLATION,
70 SHADOW_1_TESSELLATION,
71 SHADOW_2_TESSELLATION,
72 SHADOW_POINT_0_TESSELLATION,
73 SHADOW_POINT_1_TESSELLATION,
74 SHADOW_POINT_2_TESSELLATION,
75 PRE_TESSELLATION,
76 NORMAL_TESSELLATION,
77 NORMAL_PBR_TESSELLATION,
78 SEMI_TRANSPARENCE_TESSELLATION,
79 SEMI_TRANSPARENCE_PBR_TESSELLATION,
80 MOTIONBLUR_ON_TESSELLATION,
81 MOTIONBLUR_OFF_TESSELLATION,
82 VERTEX_LIT_NORMAL_TESSELLATION,
83 VERTEX_LIT_SEMI_TRANSPARENCE_TESSELLATION,
84 PRE_SHADOW_TESSELLATION,
85 POLYGON_LINE_TESSELLATION,
86#endif //GX_ENABLE_TESSELLATION
87 };
88
90 enum class SHADER_HANDLE
91 {
92 INVERS_VIEW_MATRIX,
93 FISH_EYE_PARAMETER,
94 NORMAL,
95 DIFFUSE,
96 SPECULAR,
97 FOG_COLOR,
98 METALLIC_ROUGHNESS,
99 BRDF,
100 TOON_RIM_LIGHT,
101 PREVIOUS_WORLD_VIEW_MATRIX,
102 INVERS_PROJECTION_MATRIX,
103 SHADOW_MATRIX,
104 SHADOW_FAR,
105 SHADOW_BUFFER_SIZE,
106 SHADOW_LERP,
107 OPACITY_MAP_SAMPLER,
108 DEPTH_MAP_SAMPLER,
109 SHADOW_BUFFER_SAMPLER,
110 APPLY_LIGHTING,
111 APPLY_LIGHTING_SEMITRANSPARENCE,
112 CASCADE_SHADOW_MAP,
113 DIRECTIONAL_SHADOW,
114 DIRECTIONAL_SHADOW_MASK,
115 SHADOW_LIGHT_COLOR,
116 SHADOW_LIGHT_AMBIENT_COLOR,
117 SHADOW_LIGHT_DIRECTION,
118 POINT_SHADOW,
119 POINT_SHADOW_MAP,
120 LIGHTING_COUNT,
121 POINT_LIGHT_COLOR,
122 POINT_LIGHT_POSITION,
123 POINT_LIGHT_PARAM,
124 POINT_LIGHT_ORIENTATION,
125 POINT_LIGHT_SPOT,
126 POINT_SHADOW_LIGHT_COLOR,
127 POINT_SHADOW_LIGHT_POSITION,
128 POINT_SHADOW_LIGHT_PARAM,
129 POINT_SHADOW_LIGHT_ORIENTATION,
130 POINT_SHADOW_LIGHT_SPOT,
131 POINT_SHADOW_MATRIX,
132 ENVIRONMENT_SAMPLER,
133 CHROMA_KEY,
134#if GX_DEVELOP
135 CHROMA_KEY_COLOR,
136#endif // GX_DEVELOP
137 FACE_FORWARD,
138 APPLY_COLOR_MAP_SECOND,
139 MULTI_MAP,
140 COLOR_MAP_COMPOSITE,
141 TRANSFORM_SKINNING,
142 TRANSFORM_OFFSET,
143 HIGH_SPEED_VERTEX_SHADER_MODE,
144 ALPHA_TEST,
145 ALPHA_TEST_PARAMETER,
146 VERTEX_OFFSET_PARAMETER,
147 VERTEX_OFFSET_PARAMETER_2,
148 SEMITRANSPARENCE_PRIORITY_OFFSET,
149 REFRACTION_PARAMETER,
150 SSR_PARAMETER,
151 CONTROL_PARAMETER,
152 APPLY_LIGHT_MAP,
153 LIGHT_PROBE_POSITION,
154 LIGHT_PROBE_EXTENT,
155 LIGHT_PROBE_SAMPLER,
156 LIGHT_PROBE_RED,
157 LIGHT_PROBE_RED_1,
158 LIGHT_PROBE_RED_2,
159 LIGHT_PROBE_GREEN,
160 LIGHT_PROBE_GREEN_1,
161 LIGHT_PROBE_GREEN_2,
162 LIGHT_PROBE_BLUE,
163 LIGHT_PROBE_BLUE_1,
164 LIGHT_PROBE_BLUE_2,
165 HIGH_SPEED_COLOR_MAP_SAMPLER_STATE,
166 LIGHTING_ENABLE,
167 SHADOW_ENABLE,
168 SHADOW_PARAMETER,
169#if defined(_PS4) || defined(_PS5)
170 COLOR_MAP_SAMPLER,
171 COLOR_MAP_SAMPLER_MATERIAL,
172#endif //_PS4 || _PS5
173#if defined(_WIN64)
174 APPLY_INTERSECTION_BLEND,
175#endif // _WIN64
176 MAX,
177 };
178
180 //-----------------------------------------------------------
182 //-----------------------------------------------------------
184public:
186 GxUnitModel(void);
187
189 //-----------------------------------------------------------
191 //-----------------------------------------------------------
193protected:
195 void postAsyncUpdate(void) override;
197 void forceAsyncUpdate(void) override;
198
199public:
201 b32 setModelResource(GxResModel* pResModel) override;
203 virtual b32 checkDoRender(const GxRenderMaterial* pMaterial);
204
205protected:
207 b32 renderInitialize(RENDER_VIEW view, RENDER_SUB_VIEW subView) override;
209 void renderMeshGroupAll(void) override;
211 void renderMeshGroup(const GxResModel::GxMeshGroup* pMeshGroup) override;
213 void renderMesh(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount) override;
215 virtual void renderMeshNormal(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
217 virtual void renderMeshShadow(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
219 virtual void renderMeshPointShadow(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
221 virtual void renderMeshEnv(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
223 virtual void renderMeshPolygonLine(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
224#if GX_ENABLE_OCCLUSION_CULLING
226 void renderOcclusionQuery(u32 startIndex, u32 count, const GxRenderMaterial* pMaterial, u32 instanceStartIndex, u32 instanceCount);
227#endif //GX_ENABLE_OCCLUSION_CULLING
228
230 b32 setRenderMaterial(GxRenderMaterial* pMaterial, const GxResModel::GxMeshGroup* pMeshGroup) override;
232 b32 setRenderState(const GxRenderMaterial* pMaterial) override;
234 void updateLightContext(b32 updateContext);
235
237 virtual void updateMeshCullingFlagShadow(RENDER_VIEW view, CULLING_FRUSTUM frustumtype, u32 cascadeLevel);
239 virtual void updateMeshCullingFlagPointShadow(RENDER_VIEW view, CULLING_FRUSTUM frustumtype, GxUnitLightBase* pLight);
241 virtual void updateMeshCullingFlagEnvironmentMap(RENDER_VIEW view, CULLING_FRUSTUM frustumtype);
243 virtual void updateInstanceCullingFlagShadow(RENDER_VIEW view, CULLING_FRUSTUM frustumtype, u32 cascadeLevel);
245 virtual void updateInstanceCullingFlagPointShadow(GxUnitLightBase* pLight, RENDER_VIEW view, CULLING_FRUSTUM frustumType);
247 virtual void updateInstanceCullingFlagEnvironmentMap(RENDER_VIEW view, CULLING_FRUSTUM frustumType);
249 b32 isHitBox(const GxShapeBox& box0, const GxShapeBox& box1);
251 f32 getLengthSegOnSeparateAxis(const GxVector3& sep, const GxVector3& e0, const GxVector3& e1, const GxVector3& e2);
253 f32 getLengthSegOnSeparateAxis(const GxVector3& sep, const GxVector3& e0, const GxVector3& e1);
255 b32 hasSemiTransparenceMaterial(void);
257 b32 isUseSemiTransparenceDepthPass(void);
259 void renderInitializeSemiTransparence(void);
261 u32 getRenderPolygonCount(u32 startIndex, u32 count, u32 instanceStartIndex, u32 instanceCount);
262
264 void updateShowLod(const GxUnitCameraBase* pCamera) override;
266 virtual void loadShaderHandles(void);
267
269 //-----------------------------------------------------------
271 //-----------------------------------------------------------
273public:
275 GX_FORCE_INLINE b32 isEnableObjectMotionBlur(void) const { return _enableObjectMotionBlur; }
277 GX_FORCE_INLINE void setEnableObjectMotionBlur(b32 enable) { _enableObjectMotionBlur = enable; }
278
280 GX_FORCE_INLINE b32 isEnableEnvironmentMapElement(void) const { return _enableEnvironmentMapElement; }
282 GX_FORCE_INLINE void setEnableEnvironmentMapElement(b32 enable) { _enableEnvironmentMapElement = enable; }
283
285 GX_FORCE_INLINE b32 isEnableShadow(void) const { return _enableShadow; }
287 GX_FORCE_INLINE void setEnableShadow(b32 enable) { _enableShadow = enable; }
288
289#if GX_DEVELOP
291 GX_FORCE_INLINE b32 isMaskEnable(void) const { return _maskEnable; }
293 GX_FORCE_INLINE void setMaskEnable(b32 enable) { _maskEnable = enable; }
294#endif // GX_DEVELOP
295
296#if GX_DEVELOP
298 constexpr u32 getPolygonCount(void) const { return _polygonCount; }
300 constexpr u32 getDrawCallCountOpacity(void) const { return _drawCallCountOpacity; }
302 constexpr u32 getDrawCallCountSemiTransparence(void) const { return _drawCallCountSemiTransparence; }
304 constexpr u32 getDrawCallCountShadow(void) const { return _drawCallCountShadow; }
306 constexpr u32 getDrawCallCountEnv(void) const { return _drawCallCountEnv; }
307#endif // GX_DEVELOP
308 // 半透明描画時の優先度固定フラグを取得
309 GX_FORCE_INLINE b32 isEnableSemiTransparencePriority(void) const { return _enableSemiTransparencePriority; }
310 // 半透明描画時の優先度固定フラグを設定
311 GX_FORCE_INLINE void setEnableSemiTransparencePriority(b32 enable) { _enableSemiTransparencePriority = enable; }
312 // 半透明描画時の優先度固定値を取得
313 constexpr f32 getSemiTransparencePriority(void) const { return _semiTransparencePriority; }
314 // 半透明描画時の優先度固定値を設定、値の範囲は0.0fから1.0f。1.0fで最後に描画される。
315 constexpr void setSemiTransparencePriority(f32 value) { _semiTransparencePriority = value; }
316 // 設定されたマトリクスとカメラから半透明描画優先度を求める
317 f32 getCurrentSemiTransparencePriority(u32 startIndex);
318
319protected:
321 GX_FORCE_INLINE void setShaderPass(const GxRenderMaterial* pMaterial, SHADER_PASS pass) { pMaterial->_drawShaderInfo._pShaderCode->setPass(static_cast<u32>(pass)); }
323 constexpr GX_HANDLE getShaderHandle(SHADER_HANDLE shaderHandle) const { return _handles[static_cast<u32>(shaderHandle)]; }
325 constexpr void setShaderHandle(SHADER_HANDLE shaderHandle, GX_HANDLE handle) { _handles[static_cast<u32>(shaderHandle)] = handle; }
326
328 //-----------------------------------------------------------
330 //-----------------------------------------------------------
332protected:
337 GxMatrixAffineGpu _prevRenderMatrixBuffer[PREV_RENDER_MATRIX_DEFAULT_COUNT];
342#if GX_DEVELOP
343 b32 _maskEnable;
344 u32 _polygonCount;
345 u32 _renderPolygonCountOpacity;
346 u32 _renderPolygonCountSemiTransparence;
347 u32 _renderPolygonCountShadow;
348 u32 _renderPolygonCountPolygonLine;
349
350 u32 _drawCallCountOpacity;
351 u32 _drawCallCountSemiTransparence;
352 u32 _drawCallCountShadow;
353 u32 _drawCallCountEnv;
354 u32 _drawCallCountPolygonLine;
355#endif //GX_DEVELOP
359
360 static GX_HANDLE _handles[static_cast<u32>(SHADER_HANDLE::MAX)];
361
363private:
364 static GxCriticalSection _shaderHandleCriticalSection;
365
367};
368
369GX_SHADER_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__)
GxClassBaseReference継承の禁止宣言(new以外の生成禁止 + コピー禁止)
Definition GxBase.h:244
@ MAX
定義数
u32 GX_HANDLE
ハンドル
Definition GxDefine.h:214
RENDER_VIEW
描画優先度(ビュー)
Definition GxRender.h:442
@ NORMAL
法線(VS入力,VS→PS)
@ SEMI_TRANSPARENCE
半透明パス
RENDER_SUB_VIEW
描画優先度(サブビュー)
Definition GxRender.h:485
@ SHADOW_1
シャドウマップ用
@ SHADOW_0
シャドウマップ用
@ SHADOW_2
シャドウマップ用
クリティカルセクションクラス
Definition GxThread.h:20
static constexpr u32 VALUE_4
4
Definition GxMath.h:121
GxShaderPackage::GxShaderCode * _pShaderCode
シェーダコード
Definition GxRenderMaterial.h:152
マテリアル構造体
Definition GxRenderMaterial.h:18
GxShaderInfo _drawShaderInfo
描画シェーダ情報
Definition GxRenderMaterial.h:587
モデルリソースクラス
Definition GxResModel.h:20
箱形状クラス
Definition GxShape.h:333
カメラ基礎クラス
Definition GxUnitCameraBase.h:20
ライト基礎クラス
Definition GxUnitLightBase.h:19
モデル基礎クラス
Definition GxUnitModelBase.h:19
モデルクラス
Definition GxUnitModel.h:19
b32 _enableObjectMotionBlur
オブジェクトモーションブラーの対象フラグ
Definition GxUnitModel.h:333
GX_FORCE_INLINE void setEnableShadow(b32 enable)
影の描画フラグ指定
Definition GxUnitModel.h:287
GX_FORCE_INLINE void setEnableObjectMotionBlur(b32 enable)
オブジェクトモーションブラー指定の設定
Definition GxUnitModel.h:277
static b32 _isUsableShaderHandle
上記シェーダがすでに読み込まれたかハンドル
Definition GxUnitModel.h:362
GX_FORCE_INLINE b32 isEnableShadow(void) const
影の描画フラグ取得
Definition GxUnitModel.h:285
u32 _pointShadowLightCount
ポイントシャドウライトの数
Definition GxUnitModel.h:340
INTERNAL_RENDER_PASS
ユニット内部の描画パス
Definition GxUnitModel.h:34
GxMatrixAffineGpu * _pPrevRenderMatrix
前フレームの描画マトリクス
Definition GxUnitModel.h:338
b32 _autoSetNormalReflectance
垂直反射率を屈折率から求める
Definition GxUnitModel.h:336
u32 _pointLightCount
ポイントライトの数
Definition GxUnitModel.h:339
INTERNAL_RENDER_PASS _internalRenderPass
ユニット内部の描画パス
Definition GxUnitModel.h:341
GX_FORCE_INLINE void setShaderPass(const GxRenderMaterial *pMaterial, SHADER_PASS pass)
シェーダーパスを設定
Definition GxUnitModel.h:321
b32 _enableShadow
影を描画するフラグ
Definition GxUnitModel.h:335
constexpr GX_HANDLE getShaderHandle(SHADER_HANDLE shaderHandle) const
シェーダーハンドルを取得
Definition GxUnitModel.h:323
b32 _enableSemiTransparencePriority
半透明描画時の優先度を固定する(仮)
Definition GxUnitModel.h:357
b32 _vertexLitFlag
頂点ライティングフラグ(仮)
Definition GxUnitModel.h:356
GX_FORCE_INLINE b32 isEnableEnvironmentMapElement(void) const
動的環境マップ作成時描画フラグ取得
Definition GxUnitModel.h:280
GX_FORCE_INLINE void setEnableEnvironmentMapElement(b32 enable)
動的環境マップ作成時描画フラグ指定
Definition GxUnitModel.h:282
constexpr void setShaderHandle(SHADER_HANDLE shaderHandle, GX_HANDLE handle)
シェーダーハンドルを設定
Definition GxUnitModel.h:325
SHADER_PASS
シェーダーパス定義
Definition GxUnitModel.h:47
f32 _semiTransparencePriority
半透明描画時の優先度(仮)
Definition GxUnitModel.h:358
b32 _enableEnvironmentMapElement
動的環境マップ作成時このUnitを描画するフラグ
Definition GxUnitModel.h:334
SHADER_HANDLE
シェーダーハンドル定義
Definition GxUnitModel.h:91
GX_FORCE_INLINE b32 isEnableObjectMotionBlur(void) const
オブジェクトモーションブラー指定の取得
Definition GxUnitModel.h:275
アフィン変換行列(GPU用)
Definition GxMatrix.h:874
モデルリソースメッシュグループ構造体
Definition GxResModel.h:211
GX_FORCE_INLINE void setPass(u32 pass)
パスの設定
Definition GxShaderPackage.h:717
3次元ベクトル
Definition GxVector.h:245
32bitブーリアン
Definition GxDefine.h:173