1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef API_3D_RENDER_DEFAULT_MATERIAL_CONSTANTS_H
17 #define API_3D_RENDER_DEFAULT_MATERIAL_CONSTANTS_H
18 
19 #include <cstdint>
20 
21 #include <3d/namespace.h>
22 #include <3d/shaders/common/3d_dm_structures_common.h>
23 
24 CORE3D_BEGIN_NAMESPACE()
25 /** \addtogroup group_render_defaultmaterialconstants
26  *  @{
27  */
28 /** Render node created resources will add the name of the render graph to the name presented here.
29  */
30 /** Default material lighting constants
31  * Scene constants -> prefix with unique scene render data store name when using
32  * Default render data store for scene can be found:
33  * renderNodeGraphData.renderNodeGraphDataStoreName.empty() ?
34         "RenderDataStoreDefaultScene" :
35         renderNodeGraphData.renderNodeGraphDataStoreName;
36  */
37 struct DefaultMaterialLightingConstants {
38     /** Max directional light count */
39     static constexpr uint32_t MAX_LIGHT_COUNT { 64 };
40     /** Max shadow count */
41     static constexpr uint32_t MAX_SHADOW_COUNT { 8u };
42 
43     /** Light data buffer name. Default material pipelines uses per camera ligh buffers */
44     static constexpr const BASE_NS::string_view LIGHT_DATA_BUFFER_NAME { "CORE3D_DM_LIGHT_DATA_BUFFER" };
45     /** Light cluster data buffer name. Default material pipelines uses per camera ligh buffers */
46     static constexpr const BASE_NS::string_view LIGHT_CLUSTER_DATA_BUFFER_NAME {
47         "CORE3D_DM_LIGHT_CLUSTER_DATA_BUFFER"
48     };
49 
50     /** Shadow atlas depth buffer name */
51     static constexpr const BASE_NS::string_view SHADOW_DEPTH_BUFFER_NAME { "CORE3D_DM_SHADOW_DEPTH_BUFFER" };
52     /** VSM shadow atlas color buffer name (VSM) */
53     static constexpr const BASE_NS::string_view SHADOW_VSM_COLOR_BUFFER_NAME { "CORE3D_DM_VSM_SHADOW_COLOR_BUFFER" };
54 };
55 
56 /** Default material constants
57  * Scene constants -> prefix with unique scene render data store name when using
58  */
59 struct DefaultMaterialMaterialConstants {
60     /** Material buffer name */
61     static constexpr const BASE_NS::string_view MATERIAL_DATA_BUFFER_NAME { "CORE3D_DM_DATA_BUFFER" };
62     /** Material transform buffer name */
63     static constexpr const BASE_NS::string_view MATERIAL_TRANSFORM_DATA_BUFFER_NAME {
64         "CORE3D_DM_TRANSFORM_DATA_BUFFER"
65     };
66     /** Material user data buffer name */
67     static constexpr const BASE_NS::string_view MATERIAL_USER_DATA_BUFFER_NAME { "CORE3D_DM_USER_DATA_BUFFER" };
68     /** Mesh buffer name */
69     static constexpr const BASE_NS::string_view MESH_DATA_BUFFER_NAME { "CORE3D_DM_MESH_DATA_BUFFER" };
70     /** Skin buffer name */
71     static constexpr const BASE_NS::string_view SKIN_DATA_BUFFER_NAME { "CORE3D_DM_SKIN_DATA_BUFFER" };
72 };
73 
74 /** Default material shader related constants. (Must be matched in relevant json and c-code files) */
75 struct DefaultMaterialShaderConstants {
76     /** Default opaque render slots. Forward opaque. */
77     static constexpr const BASE_NS::string_view RENDER_SLOT_FORWARD_OPAQUE { "CORE3D_RS_DM_FW_OPAQUE" };
78     /** Default translucent render slot. Forward translucent. */
79     static constexpr const BASE_NS::string_view RENDER_SLOT_FORWARD_TRANSLUCENT { "CORE3D_RS_DM_FW_TRANSLUCENT" };
80     /** Default deferred opaque render slot */
81     static constexpr const BASE_NS::string_view RENDER_SLOT_DEFERRED_OPAQUE { "CORE3D_RS_DM_DF_OPAQUE" };
82     /** Default render slot for depth-only rendering. Handles PCF shadows and states */
83     static constexpr const BASE_NS::string_view RENDER_SLOT_DEPTH { "CORE3D_RS_DM_DEPTH" };
84     /** VSM shadow render slot with color buffer target. Handles VSM shadows and states */
85     static constexpr const BASE_NS::string_view RENDER_SLOT_DEPTH_VSM { "CORE3D_RS_DM_DEPTH_VSM" };
86 
87     /** Default forward vertex input declaration */
88     static constexpr const BASE_NS::string_view VERTEX_INPUT_DECLARATION_FORWARD {
89         "3dvertexinputdeclarations://core3d_dm_fw.shadervid"
90     };
91     /** Default forward pipeline layout */
92     static constexpr const BASE_NS::string_view PIPELINE_LAYOUT_FORWARD { "3dpipelinelayouts://core3d_dm_fw.shaderpl" };
93 
94     /** Default depth vertex input declaration */
95     static constexpr const BASE_NS::string_view VERTEX_INPUT_DECLARATION_DEPTH {
96         "3dvertexinputdeclarations://core3d_dm_depth.shadervid"
97     };
98     /** Default depth pipeline layout */
99     static constexpr const BASE_NS::string_view PIPELINE_LAYOUT_DEPTH {
100         "3dpipelinelayouts://core3d_dm_depth.shaderpl"
101     };
102 
103     /** Default environment pipeline layout */
104     static constexpr const BASE_NS::string_view PIPELINE_LAYOUT_ENV { "3dpipelinelayouts://core3d_dm_env.shaderpl" };
105 
106     /** Default material forward shader with automatic render slot and graphics state setup */
107     static constexpr const BASE_NS::string_view OPAQUE_SHADER_NAME { "3dshaders://shader/core3d_dm_fw.shader" };
108     /** Default material forward shader graphics state with automatic render slot and graphics state setup */
109     static constexpr const BASE_NS::string_view SHADER_STATE_NAME { "3dshaderstates://core3d_dm.shadergs" };
110     /** Default material depth shader */
111     static constexpr const BASE_NS::string_view DEPTH_SHADER_NAME { "3dshaders://shader/core3d_dm_depth.shader" };
112     /** Default material forward env shader */
113     static constexpr const BASE_NS::string_view ENV_SHADER_NAME {
114         "3dshaders://shader/core3d_dm_fullscreen_env.shader"
115     };
116 };
117 
118 /** Default camera constants
119  * Scene constants -> prefix with unique scene render data store name when using
120  */
121 struct DefaultMaterialCameraConstants {
122     /** Max camera count. This includes scene and shadow cameras.  */
123     static constexpr const uint32_t MAX_CAMERA_COUNT { CORE_DEFAULT_MATERIAL_MAX_CAMERA_COUNT };
124     /** Max environment count.  */
125     static constexpr const uint32_t MAX_ENVIRONMENT_COUNT { CORE_DEFAULT_MATERIAL_MAX_ENVIRONMENT_COUNT };
126 
127     /** Camera data buffer name (this is usable in the whole pipeline / scene) */
128     static constexpr const BASE_NS::string_view CAMERA_DATA_BUFFER_NAME { "CORE3D_DM_CAM_DATA_BUF" };
129     /** Camera prefix for per camera data buffers */
130     static constexpr const BASE_NS::string_view CAMERA_GENERAL_BUFFER_PREFIX_NAME { "CORE3D_DM_CAM_GENERAL_BUF_" };
131     /** Camera prefix for per camera data buffers */
132     static constexpr const BASE_NS::string_view CAMERA_ENVIRONMENT_BUFFER_PREFIX_NAME { "CORE3D_DM_CAM_ENV_BUF_" };
133     /** Camera prefix for per camera data buffers */
134     static constexpr const BASE_NS::string_view CAMERA_FOG_BUFFER_PREFIX_NAME { "CORE3D_DM_CAM_FOG_BUF_" };
135     /** Camera prefix for per camera data buffers */
136     static constexpr const BASE_NS::string_view CAMERA_POST_PROCESS_BUFFER_PREFIX_NAME {
137         "CORE3D_DM_CAM_POST_PROCESS_BUF_"
138     };
139     /** Camera prefix for per light buffers */
140     static constexpr const BASE_NS::string_view CAMERA_LIGHT_BUFFER_PREFIX_NAME { "CORE3D_DM_CAM_LIGHT_BUF_" };
141     /** Camera prefix for per light cluster buffers */
142     static constexpr const BASE_NS::string_view CAMERA_LIGHT_CLUSTER_BUFFER_PREFIX_NAME {
143         "CORE3D_DM_CAM_LIGHT_CLUSTER_BUF_"
144     };
145 
146     /** Camera color buffer prefix (often combined with scene name + prefix name + to_hex(camera id))
147      * For example: RenderDataStoreDefaultSceneCORE3D_CAMERA_DEPTH_40000000D
148      */
149     static constexpr const BASE_NS::string_view CAMERA_COLOR_PREFIX_NAME { "CORE3D_CAMERA_COLOR_" };
150     /** Camera depth buffer prefix  (often combined with scene name + to_hex(camera id)) */
151     static constexpr const BASE_NS::string_view CAMERA_DEPTH_PREFIX_NAME { "CORE3D_CAMERA_DEPTH_" };
152 
153     /** Default camera post process name (often combined with default name + post process id) */
154     static constexpr const BASE_NS::string_view CAMERA_POST_PROCESS_PREFIX_NAME { "CORE3D_POST_PROCESS_CAM" };
155     /** Default pre-pass camera post process name (often combined with default name + post process id) */
156     static constexpr const BASE_NS::string_view CAMERA_PRE_PASS_POST_PROCESS_PREFIX_NAME {
157         "CORE3D_POST_PROCESS_PRE_PASS_CAM"
158     };
159     /** Default reflection camera post process name (often combined with default name + post process id) */
160     static constexpr const BASE_NS::string_view CAMERA_REFLECTION_POST_PROCESS_PREFIX_NAME {
161         "CORE3D_POST_PROCESS_REFLECTION_CAM"
162     };
163 
164     /** Default mip count for reflection plane */
165     static constexpr const uint32_t REFLECTION_PLANE_MIP_COUNT { 6u };
166 };
167 
168 /** Default material GPU resource constants */
169 struct DefaultMaterialGpuResourceConstants {
170     /** Default material base color, white srgb */
171     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_BASE_COLOR { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
172     /** Default material emissive, white srgb */
173     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_EMISSIVE { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
174     /** Default material normal */
175     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_NORMAL { "CORE3D_DM_NORMAL" };
176     /** Default material material map, white linear */
177     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_MATERIAL { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
178     /** Default material ambient occlusion, white */
179     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_AO { "CORE3D_DM_AO" };
180 
181     /** Default material clearcoat intensity, white */
182     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_CLEARCOAT { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
183     /** Default material clearcoat roughness, white */
184     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_CLEARCOAT_ROUGHNESS {
185         "CORE_DEFAULT_GPU_IMAGE_WHITE"
186     };
187     /** Default material clearcoat normal */
188     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_CLEARCOAT_NORMAL { "CORE3D_DM_NORMAL" };
189 
190     /** Default material clearcoat intensity, white */
191     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_SHEEN { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
192 
193     /** Default material specular, white srgb */
194     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_SPECULAR { "CORE_DEFAULT_GPU_IMAGE_WHITE" };
195 
196     /** Default material transmission, white */
197     static constexpr const BASE_NS::string_view CORE_DEFAULT_MATERIAL_TRANSMISSION { "CORE3D_DM_AO" };
198 
199     /** Default material radiance cubemap */
200     static constexpr const BASE_NS::string_view CORE_DEFAULT_RADIANCE_CUBEMAP { "CORE3D_DM_RADIANCE_CUBEMAP" };
201 
202     /** Default skybox */
203     static constexpr const BASE_NS::string_view CORE_DEFAULT_SKYBOX_CUBEMAP { "CORE3D_DM_SKYBOX_CUBEMAP" };
204 
205     /** Default radiance cubemap sampler */
206     static constexpr const BASE_NS::string_view CORE_DEFAULT_RADIANCE_CUBEMAP_SAMPLER {
207         "CORE3D_DM_RADIANCE_CUBEMAP_SAMPLER"
208     };
209     /** Default VSM shadow sampler */
210     static constexpr const BASE_NS::string_view CORE_DEFAULT_VSM_SHADOW_SAMPLER { "CORE3D_DM_VSM_SHADOW_SAMPLER" };
211     /** Default PCF shadow sampler */
212     static constexpr const BASE_NS::string_view CORE_DEFAULT_PCF_SHADOW_SAMPLER { "CORE3D_DM_PCF_SHADOW_SAMPLER" };
213 };
214 
215 /** Default material render node share constants */
216 struct DefaultMaterialRenderNodeConstants {
217     /** Render node default camera controller output name for depth */
218     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_OUTPUT { "output" };
219 
220     /** Render node default camera controller output name for depth */
221     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_DEPTH { "depth" };
222     /** Render node default camera controller output name for color */
223     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_COLOR { "color" };
224     /** Render node default camera controller output name for depth msaa */
225     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_DEPTH_MSAA { "depth_msaa" };
226     /** Render node default camera controller output name for color msaa */
227     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_COLOR_MSAA { "color_msaa" };
228     /** Render node default camera controller output name for history */
229     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_HISTORY { "history" };
230     /** Render node default camera controller output name for history to be outputted for next frame */
231     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_HISTORY_NEXT { "history_next" };
232 
233     /** Render node default camera controller output name for deferred packed velocity and normal */
234     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_VELOCITY_NORMAL { "velocity_normal" };
235     /** Render node default camera controller output name for deferred base color */
236     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_BASE_COLOR { "base_color" };
237     /** Render node default camera controller output name for deferred material */
238     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_MATERIAL { "material" };
239     /** Render node default camera controller output name for camera dynamic radiance cubemap */
240     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_RADIANCE_CUBEMAP { "radiance_cubemap" };
241 
242     /** Render node default camera controller output name for deferred custom buffers
243      * Is a prefix for the final name.
244      * With deferred targets the name is deferred_0 and so on.
245      */
246     static constexpr const BASE_NS::string_view CORE_DM_CAMERA_DEFERRED_PREFIX { "deferred_" };
247 };
248 /** @} */
249 CORE3D_END_NAMESPACE()
250 
251 #endif // API_3D_RENDER_DEFAULT_MATERIAL_CONSTANTS_H
252