329 Commits

Author SHA1 Message Date
726a8ec635 use circle instead of Square in Gizmo3DMove 2024-08-30 01:29:20 +08:00
cf2efd69b9 Added CreateCircle2D/3D,CreateCircle3DByIndexTriangles functions. 2024-08-30 01:28:49 +08:00
e35abf0051 Added PrimitiveCreater::hasIndex() 2024-08-30 01:28:20 +08:00
e02aaf812d Renamed to Square from plane 2024-08-30 00:38:40 +08:00
ca6d99b6fb gizmo's scale/move/rotate to use same Value. 2024-08-30 00:30:06 +08:00
3f37fec8a8 use hgl_cmp<Matrix4f> instead of IsNearlyEqual 2024-08-29 20:25:57 +08:00
7dc4bb9d76 [BUG FIXED] Fix Bug that to use matrix2f storage local to world matrix. 2024-08-29 13:46:19 +08:00
3fc9971cf7 clear debug code. 2024-08-29 13:45:28 +08:00
442e52e17c [BUG] gizmoMove rootNote's ScaleMatrix's Z is non-work. 2024-08-29 13:37:13 +08:00
8245d83309 TEST CORRECT....WHY? 2024-08-29 13:07:02 +08:00
a9526ce956 Updated to support Newly SceneOrient,compiled all OK! but Non test..next step is test samples. 2024-08-27 01:27:53 +08:00
410b94a127 [WIP] improving SceneOrient 2024-08-25 04:03:57 +08:00
f4e16276ff [WIP] refresh scene orient 2024-08-24 03:08:14 +08:00
8880df8862 preparing Change to new Transform 2024-08-23 02:00:59 +08:00
0a5fb750fa create BillboardSceneNode, but isn't final design. 2024-08-08 01:43:20 +08:00
3589376b79 Layouted SceneOrient.h 2024-08-07 01:12:58 +08:00
9443dd5942 to support GLM_FORCE_AVX2 2024-08-05 01:25:49 +08:00
c0e4c7fe7e updated CMakeModule 2024-08-04 23:55:56 +08:00
ee9bd06f35 Jolt use c++20 2024-08-04 23:55:41 +08:00
421f5f8134 Added source codes of JoltPhysics-5.0.0 2024-08-04 23:43:44 +08:00
5213651054 Used Transform instead of Matrix4f in SceneOrient, MaterialRenderList/RenderAssignBuffer supports updating the L2WMatrix of only the changed objects 2024-08-04 22:35:31 +08:00
3768507169 save full SceneNode in RenderNode,added length sort. 2024-08-02 23:17:07 +08:00
7f074c6c79 Added a white ring outside gizmo_rotate 2024-08-01 01:42:21 +08:00
2137725bd2 Improved Torus codes 2024-07-31 00:17:23 +08:00
f7a0e97e49 test Draw Gizmo Rotate+Move 2024-07-31 00:11:24 +08:00
d5234316ae implement duplication SceneNode 2024-07-31 00:11:04 +08:00
c3a1266da6 Correct draw Gizmo Rotate/Scale, OK!! 2024-07-30 23:54:25 +08:00
e18a6e7a4a improved gizmo3dmove 2024-07-30 13:55:44 +08:00
741e0e8ade OK!OK!OK! Draw Gizmo3DMove model was correct. 2024-07-30 01:01:29 +08:00
f2a6c61c25 [WIP] render gizmo_move, but model is incorrect. 2024-07-30 00:47:28 +08:00
28fcdb6216 preparing LerpLine example. 2024-07-30 00:11:04 +08:00
412ed6f3f2 [WIP] first version of gizmo move test,,can't RUN. 2024-07-29 14:01:10 +08:00
03f7237db3 move StaticMesh.cpp 2024-07-29 13:19:24 +08:00
f79410e434 [WIP] StaticMesh and GizmoMove 2024-07-28 23:34:04 +08:00
eef7f58575 updated texture_format_list.cpp 2024-07-27 20:52:58 +08:00
bd4fc34cbb renamed values's name. 2024-07-27 19:13:35 +08:00
0c669807d7 [WIP]preparing fix DrawText.cpp 2024-07-26 03:27:32 +08:00
8f0cd9f35b use AnsiString in shader 2024-07-26 03:25:09 +08:00
416b7bfcb3 support C++20 2024-07-26 03:24:44 +08:00
fdf073376c fixed BillboardTest.cpp, test run ok! 2024-07-24 23:15:16 +08:00
1a15b93e15 updated codes support new MaterialRenderList::Add 2024-07-20 13:15:12 +08:00
898d01ac62 Change MaterialRenderList::Add 2024-07-18 01:53:23 +08:00
d11b84222f Added IdentityLocalMatrix in SceneOrient 2024-07-17 23:56:10 +08:00
a04752b391 example update. 2024-07-17 01:39:13 +08:00
30bb77d437 removed Center/LocalCenter/WorldCenter from SceneNode. 2024-07-17 01:38:46 +08:00
8ebb3095a7 Added Position/Direction in SceneOrient 2024-07-17 01:38:30 +08:00
6571a27f41 added StaticMesh.cpp/.h in example, they should move to SceneGraph in future 2024-07-15 01:23:13 +08:00
5855b2eb5b use GetObjectFromList instead of GetListObject 2024-07-15 01:21:49 +08:00
ba7be3ff17 fix file's encode 2024-07-15 01:21:28 +08:00
006929e86f splite GizmoResource.h 2024-07-14 23:49:05 +08:00
25957d8d32 fixed RayPicking example 2024-07-10 02:00:18 +08:00
c29346887c added to init 2d gizmo resource. 2024-07-10 01:14:54 +08:00
69b9556ca1 moved GizmoColor/GizmoShape to Gizmo.h 2024-07-10 00:35:57 +08:00
390bd14c7c added AssetFileFormat.md 2024-07-05 01:19:26 +08:00
dcce45a5ce added doc/AssetFileFormat.md 2024-07-05 01:16:13 +08:00
1f7c8fa25b Added frustum_planes in CameraInfo, added FrustumCheck function in MFCamera.h 2024-07-02 23:43:25 +08:00
0ba4674126 removed MIPManager.h 2024-07-02 23:22:46 +08:00
94a0e03c44 [WIP] MIPManager 2024-07-02 00:51:59 +08:00
eb70cb1ea4 [WIP] Gizmo update codes; 2024-07-01 23:31:18 +08:00
7903ac32c1 Update half_float types in VertexAttribBuffer/VertexAttribDataAccess 2024-07-01 23:30:38 +08:00
ac03ae4e44 renamed to SAFE_CLEAR_OBJECT_ARRAY_OBJECT from SAFE_CLEAR_OBJECT_ARRAY 2024-07-01 23:29:59 +08:00
a5fe26b2f0 Fixed little bug in VertexAttribDataAccess, and then added half-float VADA 2024-07-01 21:40:23 +08:00
3a6ec1f589 Added codes of to create shape in GizmoResource.cpp 2024-07-01 13:37:47 +08:00
910a8fa51b Merge branch 'devel_28_Gizmo_Move' into devel_34_Gizmo 2024-07-01 08:43:15 +08:00
cfc3ac8250 Luminance change to ufloat8 instead of float in VertexLum material 2024-07-01 02:57:33 +08:00
9121ebd11b added newly type about VABMap/VADA 2024-07-01 02:56:26 +08:00
107251c9ad Added VIL in Pipeline, add comp VIL in CreateRenderable 2024-07-01 02:55:48 +08:00
04b77cadf9 Added GizmoResource.cpp 2024-06-26 01:51:13 +08:00
0137ef6e0c added M_Gizmo3D.cpp inline material. 2024-06-26 01:50:55 +08:00
fafe6c077b [WIP] Gizmo 2024-06-25 01:17:47 +08:00
09e9e71d59 adjust & layout codes. 2024-06-24 22:30:34 +08:00
a22e802c77 Layout codes 2024-06-21 13:09:20 +08:00
1b5d4aabb0 Optimized shader 2024-06-20 00:23:45 +08:00
af5988d96e optimized shader of billboard dynamic size 2024-06-20 00:21:53 +08:00
56b8798122 maybe finished, all examples test OK! 2024-06-20 00:16:29 +08:00
2f49e80122 [WIP] 2024-06-19 14:03:46 +08:00
806bf5dfdd [WIP] next step is ShaderCreateInfo::ProcOutput 2024-06-19 09:35:54 +08:00
90a4f1d49f finished BillboardFixedSize. next step is use ShaderVariable 2024-06-18 13:08:59 +08:00
3927b3c788 renamed values/struct. 2024-06-18 02:04:11 +08:00
6b9ac3220b removed ShaderResource 2024-06-18 01:50:03 +08:00
4251493415 added construct(VAType,count) function in ShaderVariableType 2024-06-18 01:31:54 +08:00
686372b60f added ShaderVariableType.h 2024-06-18 01:28:53 +08:00
150b27c6e6 updated Billboard,and added FixedSize billboard 2024-06-16 23:49:23 +08:00
c61e4dfdb8 Added Billboard2DWay.cpp and test OK! next step is fixed billboard pixel size. 2024-06-16 22:58:45 +08:00
23197e147c [WIP]preparing Billboard 2DWay sample 2024-06-14 09:13:49 +08:00
f1f0843bee [WIP] Billboard(the 2d way)
Two Modes:

1.fixed billboard size,the size in UBO
2.dynamic billboard size,the size in VAB

two modes to use GeometryShader, convert point/line data to quad data.
2024-06-13 13:56:48 +08:00
8d45c87cfd added camera_up/camera_right in CameraInfo 2024-06-13 01:30:30 +08:00
781e108aa3 added comments 2024-06-12 22:31:25 +08:00
1abe8770d7 removed Std3D/VertexLum2D.mtl 2024-06-12 09:55:50 +08:00
8f9ccc3aa1 removed Std3D/VertexLum2D.mtl 2024-06-12 09:55:08 +08:00
cd01c45980 Merge branch 'devel_31_VDMMergeRender' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_31_VDMMergeRender 2024-06-12 09:49:57 +08:00
941f5ee6ec fixed comment and layout comment. 2024-06-12 09:49:48 +08:00
66fbe5571e added comments 2024-06-12 08:56:01 +08:00
4fcdd42ce4 fixed RayPicking.cpp sample on newest sdk. 2024-06-12 08:53:54 +08:00
d83f04faab fixed a but that PrimitiveCreater::WriteVAB return error. 2024-06-12 08:53:20 +08:00
b71c912fd5 [WIP] RayPicking.cpp 2024-06-12 02:14:56 +08:00
2efb9c83bf added GetVABMap and GetIBMap in Primitive 2024-06-12 02:07:54 +08:00
7b0a185a45 Moved vab_map_list and ibo_map from PrimitiveCreater to PrimitiveData 2024-06-12 01:48:25 +08:00
0a025f0464 added VKBufferMap::Write function. 2024-06-12 01:46:19 +08:00
7f8fbbd3a0 improved VKBufferMap and added newly IBMap/VABMap 2024-06-12 00:23:09 +08:00
cd4733a491 PlaneGrid use 2d position format instead of 3d. 2024-06-02 20:15:56 +08:00
c1d54628d1 Added Std3D/VertexLum2D.mtl 2024-06-02 20:14:30 +08:00
0da0290fc6 resume vab_offset but don't use it in short time. 2024-06-02 15:27:03 +08:00
01bb4b2153 fixed VABMap 2024-06-02 12:40:17 +08:00
66ef3160e1 used newly VKBufferMap in PrimitiveCreater 2024-06-02 12:16:33 +08:00
16ae849809 added VKBufferMap.cpp/.h 2024-06-01 12:08:49 +08:00
8788b3dd6a Clear zero map_ptr_list in PrimitiveCreater 2024-06-01 12:08:26 +08:00
bba5a660a3 fixed PlaneGrid3D sample 2024-06-01 12:07:34 +08:00
aa853fbdfb fixed 3 samples that are texture_quad, texture_rect and texture_rect_array 2024-05-31 23:17:08 +08:00
c780662ff6 fixed draw without VDM 2024-05-31 23:07:05 +08:00
611a9fe61d fixed draw_triangle_in_NDC sample and other about codes. 2024-05-31 22:04:02 +08:00
90152ca74e add texture in BlinnPhongDirectionLight example. 2024-05-30 21:07:13 +08:00
22868dafab [Important] Indirect Draw Finished....test OK!! 2024-05-30 13:39:16 +08:00
6ce713aed5 finished to stat about IndirectDraw data in MaterialRenderList 2024-05-30 13:14:13 +08:00
ac0d1bee59 added VKIndirectCommandBuffer.cpp and other codes. 2024-05-30 01:58:32 +08:00
bf7c6bdeac preparing VKIndirectCommandBuffer.h 2024-05-30 01:14:27 +08:00
cc80fe7f39 add renderitem sort by vdm 2024-05-29 00:55:12 +08:00
55001843ea added vdm sort 2024-05-28 23:49:28 +08:00
8cdf88e2fd added VDM in Primitive/Renderable/PrimitiveDataBuffer 2024-05-28 23:33:15 +08:00
ca8e36687f OK! Can RUN! full OK!...next step is to create VDMRender in MaterialRenderList 2024-05-28 23:10:50 +08:00
86ff7517d9 [WIP] optimizing VDM Support 2024-05-28 02:21:33 +08:00
742fe201ad rename and layout codes. 2024-05-27 01:42:10 +08:00
8bb97ef2de added comments 2024-05-26 15:55:28 +08:00
9947d46ab8 changed many size/count type why to equal vkCmdDraw/vkCmdDrawIndexed 2024-05-26 15:04:44 +08:00
bf5e401566 [STRONG] merge VDM render OK!!! TEST OK! next step is to support VDM Render and non-VDM Render, recommend is two MaterialRenderList class. 2024-05-26 02:25:49 +08:00
0dcf004f4c renamed to VAB from VBO 2024-05-25 22:57:29 +08:00
8d3cd8d561 remove RenderablePrimitiveCreater.h, fixed auto_instance.cpp/auto_merge_material_instance.cpp examples, can RUN. 2024-05-25 22:47:26 +08:00
6740764f07 create DrawData that it split from VertexInputData 2024-05-25 22:08:01 +08:00
a5e76988c7 resume Assign instead of local2world and materialinstanceId in VertexInputStream 2024-05-25 17:58:39 +08:00
08a348392d added GetVDM() in PrimitiveData classes. 2024-05-25 13:48:15 +08:00
0dfb7220b5 finish BIG VBO.Test OK!,Can RUN!..next step is merge drawcall. 2024-05-25 04:11:38 +08:00
4a94d78c1f preparing PrimitiveCreater to support multi primitive 2024-05-25 03:14:26 +08:00
9a4e495027 coded PrimitiveDataVDM, next step is test. 2024-05-25 02:48:37 +08:00
6de3cf789a upgraded InlineGeometry, removed RenderResource::CreatePrimitive. 2024-05-25 01:48:15 +08:00
299d3bd019 newly Primitive/PrimitiveData/PrimitiveCreater, and test OK! can RUN! 2024-05-25 01:46:19 +08:00
78b1982849 output Vendor in PhysicalDeviceCapsOutput 2024-05-25 01:44:47 +08:00
8a0215aee6 supported newly IBMap,can RUN OK!!! 2024-05-23 14:00:23 +08:00
419e0e2574 override Map/Flush/Write functions in IndexBuffer/VAB 2024-05-23 13:59:48 +08:00
cfd67e1a42 [WIP] comments VDM, preparing double PrimitiveCreater 2024-05-23 13:15:47 +08:00
c49feac2e6 delete primitiveData at Destory(PrimitiveData *) 2024-05-23 12:46:45 +08:00
bf50333f5b Remove the excess # include 2024-05-23 02:28:09 +08:00
40ce978f85 newly PrimitiveData struct and Primitive class. Can't Run!!!
next step is to support PrimitiveVDM.
2024-05-23 02:19:40 +08:00
e27442a0b4 [WIP] update PrimitiveCreater/PrimitiveData, CAN'T RUN. 2024-05-22 01:21:05 +08:00
ecb47dae4d moved to VKPrimitiveData.cpp from VKPrimitiveData.h 2024-05-20 18:04:30 +08:00
6892a64393 VKPrimitiveData change to C version. next step is change to pure virtual struct. 2024-05-20 02:12:13 +08:00
3af753ee36 preparing resume PrimitiveData 2024-05-16 20:58:44 +08:00
f31437bf67 remove VABView 2024-05-14 21:09:19 +08:00
14fbbd6fa6 added VABView,preparing new VABViewStadnalone,VABViewVDM 2024-05-14 00:32:49 +08:00
4e6adcd765 added vab_map.Clear() in PrimitiveCreater::Finish() 2024-05-06 00:41:01 +08:00
ead4ba65c1 moved RenderResource to PrimitiveCreater::Finish() 2024-05-05 15:44:51 +08:00
310cc151fa fixed uint8 indextype 2024-05-05 15:12:14 +08:00
03491dbed8 Layout codes. 2024-05-05 04:37:04 +08:00
40094a7529 renamed to vab_map from vbo_map 2024-04-27 11:08:50 +08:00
6ad3b9edb7 to set few functions to private in VKPrimitive 2024-04-27 03:09:16 +08:00
21a63f4a9b improved PrimitiveData 2024-04-27 02:19:01 +08:00
11ebb841be improved IBAccess in VKPrimitive/VKRenderable/MaterialRenderList 2024-04-27 01:13:12 +08:00
ad330f3a42 renamed many values and function's name. 2024-04-27 01:07:44 +08:00
bbf94767fe using IBAccess=IndexBufferAccess 2024-04-27 00:05:25 +08:00
6dba761a80 added VKPrimitiveData.h 2024-04-26 01:17:47 +08:00
5391f0f4aa Temporarily deactivate the WorldBoundingBox 2024-04-26 01:17:30 +08:00
a1bf9336a3 Added RenderCmdBuffer::Draw(const VertexInputData *) 2024-04-26 00:41:53 +08:00
9c6c37c07a renamed to IndexBufferAccess from IndexBufferData 2024-04-26 00:32:11 +08:00
3bbbe18c40 use VAB instead of VBO 2024-04-24 01:44:01 +08:00
d8140ae64e use VAB instead of VBO 2024-04-24 01:38:55 +08:00
acb69d3bf5 use VBOAccessData instead of PrimitiveVertexBuffer, use VBOAccessMap instead of PVBMap 2024-04-23 03:32:25 +08:00
f0c47cd4f1 renamed values. 2024-04-21 01:28:45 +08:00
0b1a0cadae newly PrimitiveCreater and InlineGeometry, test two samples are OK! 2024-04-19 00:41:26 +08:00
8633a18e01 supported uint8_index_type 2024-04-19 00:40:51 +08:00
2bc6246dc0 few codes of PrimitiveCreater, but can't run. 2024-04-18 01:37:59 +08:00
0a752446b0 simply feature copy/check 2024-04-18 01:09:29 +08:00
c32f56fbe2 improved VulkanDeviceCreater::RequirementCheck 2024-04-18 00:56:29 +08:00
b100b4b9cb added sampleRateShading/fillModeNonSolid in VulkanHardwareRequirement 2024-04-18 00:56:02 +08:00
d20e9cf1e3 improved features support/check. 2024-04-18 00:36:52 +08:00
621e056315 preparing to support uint8 index 2024-04-17 20:22:31 +08:00
4fc74d38ba prepare support VDM for PrimitiveCreater 2024-04-17 01:38:35 +08:00
f00cb0b815 split VertexDataManager.h/.cpp 2024-04-17 01:20:52 +08:00
e1d45a7c83 added few feature in future. 2024-04-16 23:34:17 +08:00
c5b8dbe8f6 match new function's name for VertexInputLayout 2024-04-04 01:57:51 +08:00
172ee7bb7b added comments 2024-04-03 19:26:22 +08:00
d41530dad3 renamed to VBO instead of VAD in PrimitiveCreater 2024-04-03 09:13:06 +08:00
6efb50c977 added comments and layout codes. 2024-04-03 00:14:09 +08:00
f4493b09e5 use GetVBOAccessData instead of GetVBO in Primitive. 2024-04-03 00:12:39 +08:00
af8f62ddb4 move the VBOAccessData to VKVertexAttribBuffer.h from VK.h 2024-04-03 00:12:03 +08:00
fff7fd3af0 renamed to VBOAccessData from Primitive::VBOData and then move to VK.h 2024-04-02 23:51:57 +08:00
2fdd7e7bd5 removed name and binding from PrimitiveCreater:: 2024-04-02 23:39:59 +08:00
4ebc8a3260 removed Primitive::GetBuffer(..) function. 2024-04-02 23:36:34 +08:00
5892b075c3 renamed to AcquirePVB from CreatePVB 2024-04-02 23:24:39 +08:00
07a478a2ac adjust position of include 2024-04-02 22:53:13 +08:00
8c51d3a52b [very strong] deleted class VertexAttribData 2024-04-02 22:51:14 +08:00
c1183d351d moved CreateVertexAttribData(...) to PrimitiveCreater.cpp from VertexAttribData.cpp and then delete VertexAttribData.cpp 2024-04-02 22:25:06 +08:00
d4c1dd312e renamed to "vad" from "data" in PrimitiveVertexBuffer 2024-04-02 22:19:02 +08:00
3c22b48f3c moved CreateVAD() to protected 2024-04-02 22:15:44 +08:00
02169963de improved PrimitiveCreater::CreateIBO.. functions for template 2024-04-02 21:34:49 +08:00
ac81e4f8f0 first version of VertexDataManager.h 2024-04-02 21:14:34 +08:00
1d3bec4098 added VertexDataManager::Init(...) function. 2024-04-02 19:41:47 +08:00
3252d1581c removed mtl value from PrimitiveCreater 2024-04-02 15:34:05 +08:00
01bf8b3dd2 updated VertexDataManager 2024-04-01 23:32:18 +08:00
1c03e838e5 layout codes. 2024-03-29 12:58:58 +08:00
0f38f94139 split to two class they are RenderL2WBuffer and RenderMIBuffer from RenderAssignBuffer, two sample program RUN OK! 2024-03-26 01:51:59 +08:00
0639440a13 fixed sample program. 2024-03-26 01:33:17 +08:00
8492b886c9 Layout codes 2024-03-26 01:22:58 +08:00
a60ffbb7da first step OK that it's to resumed to use L2W in VertexInputStream. 2024-03-26 01:20:20 +08:00
b48ef1ac30 use HGL_MATH_LIB instead of HGL_GLM_LIB 2024-03-25 22:55:04 +08:00
c363a6fa51 upgraded to 3.5 from 3.0 that it's cmake version minimum required. 2024-03-19 22:00:26 +08:00
c873271f6e little codes 2024-03-18 13:30:06 +08:00
68ff8a472c few of code, but can RUN. 2024-03-16 14:08:55 +08:00
60ba3e4df2 improved safe. 2024-03-16 00:41:20 +08:00
35b7c9651f used 3 colors in BlinnPhongDirectionLight.cpp 2024-03-16 00:20:27 +08:00
89b9735f99 improved sample. 2024-03-15 01:38:47 +08:00
7f744d1207 updated test codes. 2024-03-13 00:13:58 +08:00
b9f5c69f85 optimized to get normal in AutoShader 2024-03-12 23:29:38 +08:00
c469fde84a adjusted order of codes in Std2DMaterialLoader.cpp and Std3DMaterialLoader.cpp 2024-03-12 23:29:06 +08:00
dd6b2f4fb3 add "hasInput(const char *name)" in ShaderDescriptorInfo and ShaderCreateInfoVertex classes. 2024-03-12 23:28:23 +08:00
ba8b44659b resume GetNormalMatrix/GetNormal in auto shader. 2024-03-12 23:04:12 +08:00
13b2ca0575 fixed Viewport UBO bug. 2024-03-12 22:54:33 +08:00
9d704eb33d updated comments. 2024-03-12 22:31:58 +08:00
86c3b65a42 fixed -normal bug in InlineGeometry.cpp 2024-03-12 21:53:41 +08:00
f6e61e70ce 更改了specular算法,但是有点问题。。。而且高光区有点象是VS算的一样,怀疑是NORMAL在VS算的原因。但fs没有GetLocalToWorld函数,需要尝试修复。 2024-03-12 00:42:32 +08:00
5347ac7091 specular OK in BlinnPhongDirectionLight sample. but direction error. 2024-03-10 22:45:38 +08:00
f56928d734 Fixed bug about SunLightPureColor.mtl 2024-03-10 01:00:42 +08:00
f3a59c1bb3 test sunlight UBO ok! 2024-03-10 00:35:35 +08:00
5188d4149c added Unknow and Static in DescriptorSetType 2024-03-09 23:35:56 +08:00
d4096735f5 adjusted order of codes in MaterialCreateInfo.h 2024-03-09 23:23:34 +08:00
4fafd938b1 new function, MaterialFileData load UBO OK! to make shader OK. 2024-03-09 22:26:45 +08:00
f0848541c2 added a newly AddUBO() in MaterialCreateInfo 2024-03-09 22:25:03 +08:00
cc9e756ece fixed Load of ubo codes. 2024-03-09 21:23:02 +08:00
cdedc81f9f save codes of UBO in AccumMemoryManager 2024-03-09 20:48:30 +08:00
c229259623 added comments 2024-03-09 19:49:44 +08:00
2c2f11f47e added little safe check of filename in MaterialFileLoader.cpp 2024-03-07 23:04:54 +08:00
c8b3ed0286 preparing blinnphong light sample. added codes of to load ubo. 2024-03-07 13:59:28 +08:00
2ce36ec26c fixed a bug in ShaderCreateInfoVertex.cpp, put "C-style string" in function that it's a bug. 2024-03-07 00:07:49 +08:00
5ba3c1790d removed standalone ".glsl" files ,merge to c++ codes. 2024-03-06 23:24:57 +08:00
3874d771d3 aligned codes, append CreateIBO8 functions in VKRenderResource.h 2024-03-06 22:51:07 +08:00
49eb8f42f0 updated DescriptorBinding::BindUBO, to support dynamic param. 2024-03-06 22:40:51 +08:00
c355f96f9b little codes 2024-03-06 13:54:05 +08:00
dc3d7b7792 removed BindingMapping 2024-03-06 00:29:17 +08:00
5f1c60a24a Improved VKDescriptorBindingManage 2024-03-06 00:26:23 +08:00
ff6a644e8f added BlinnPhong.h 2024-03-04 13:13:33 +08:00
b9e70426a1 removed sun.ubo, next step is UBO in C++ 2024-03-04 13:12:29 +08:00
a7af276a44 updated SunLightPureColor.mtl 2024-03-04 12:58:22 +08:00
8b82c6c25c support the new other codes. 2024-03-02 10:35:27 +08:00
a8d68c295d renamed many values. 2024-02-13 22:27:12 +08:00
f666d5b248 renamed values of BlinnPhongDirectionLight.cpp 2024-02-12 08:23:31 +08:00
55c27a883b init empty BlinnPhongDirectionLight example 2024-02-12 08:20:24 +08:00
6a7f8e7754 fixed access method 2024-02-03 19:53:19 +08:00
1dbf8ae5c7 renamed values. 2023-12-24 01:35:30 +08:00
8dbc1d899c added to Check ubolist in MaterialFileLoader.cpp 2023-12-05 02:24:09 +08:00
d010ee4278 I updated two sub-modules, Platform and Util. 2023-12-05 02:13:21 +08:00
4aeb28c571 added a parse in MaterialFileLoader.cpp that it's UBOParse 2023-12-05 02:08:18 +08:00
775e031422 added VK_LAYER_AMD_switchable_graphics in VKInstance.h/VKProperties.cpp 2023-12-05 02:07:25 +08:00
deefdf1416 used uint instead of int in Size of viewport 2023-11-10 04:24:10 +08:00
ba2d479f05 improved Gizmo3DMove.cpp 2023-11-02 18:51:02 +08:00
b16341c0f9 draw gizmo3d move, next step is mouse to pick the gizmo 2023-11-01 18:37:10 +08:00
d5eeb081e1 removed codes about RenderCmdBuffer::SetLineWidth 2023-11-01 18:36:20 +08:00
4bb66d2746 added "wide_lines" requirment in CreateRenderDevice and VulkanAppFramework 2023-11-01 11:00:55 +08:00
625a7387ae adjusted VulkanHardwareRequirement order in CreateRenderDevice functions. 2023-11-01 10:59:51 +08:00
c4deceebd9 first step for BlinnPhongPureColor 2023-10-31 17:59:12 +08:00
4ed0e281b2 first run MetricCellsGrid OK! 2023-10-13 19:22:11 +08:00
9369ad115b UBO ViewportInfo in All graphics shader. 2023-10-13 19:21:34 +08:00
7788459109 improved and fixed CreatePlane 2023-10-13 19:21:04 +08:00
a58589f01f moved AddBuffer to .h for RenderResource 2023-10-13 10:47:42 +08:00
240b6fb0e3 added UBO/SSBO/INBO debug output. 2023-10-13 10:42:21 +08:00
b72a924853 Merge branch 'devel_27_Default3DMaterial' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_27_Default3DMaterial 2023-10-13 09:55:20 +08:00
b781ff41a3 removed codes about VkDebugMaker 2023-10-13 02:01:57 +08:00
4ee6962d04 added lot of debug output based VkDebugUtils 2023-10-13 01:48:07 +08:00
7eff39b3b0 draw_triangle_use_UBO support u16 position format and u8 norm color format. 2023-10-12 15:00:39 +08:00
6b13c159d8 added comp operator in MaterialConfig 2023-10-12 14:59:39 +08:00
2f560a28a7 fixed all examples that can RUN OK! 2023-10-12 10:39:43 +08:00
8ba171efda added debug name. 2023-10-12 05:55:39 +08:00
317635877b optimized MaterialRenderList, removed last_vil(pipeline already include vil), don't create assign_buffer if material don't include assign 2023-10-12 02:24:58 +08:00
255c7859f1 optimized DescriptorSets::Update 2023-10-12 01:40:59 +08:00
ae85d3fc66 removed ReverseDirection from CameraMouseControl 2023-10-12 01:39:47 +08:00
a5830e18cb added ReserveDirection 2023-10-11 19:38:12 +08:00
ae88a65315 added newly CreateMaterialInstance that include MIData 2023-10-11 19:14:24 +08:00
77b0266cdc Used SceneAppFramework instead of CameraAppFramework in RayPicking.cpp 2023-10-11 19:06:18 +08:00
c99934fdf9 added RenderResource::LoadMaterial functions, it can't easy CreateMaterial from file. 2023-10-11 19:02:17 +08:00
aa6071a948 added newly files and adjust comments. 2023-10-11 18:50:06 +08:00
6f58475abd added SceneAppFramework, global_descriptor.Bind used auto-mode. 2023-10-11 18:49:29 +08:00
cfed14d746 renamed to require_list instead of require in MaterialFileData 2023-10-11 13:14:34 +08:00
27c409c7fd added To parse "require" of the MaterialBlock in MaterialFileLoader.cpp 2023-10-11 13:12:51 +08:00
bee48890cb optimized codes of MaterialFileLoader.cpp 2023-10-10 19:30:07 +08:00
a2669d2123 adjust class's name in MaterialFileLoader.cpp 2023-10-10 19:21:33 +08:00
737438aaed added Normal.glsl BlinnPhongPureColor.mtl 2023-10-10 19:14:10 +08:00
8a5711154f finished StdMaterialLoader, test all examples ok. 2023-10-10 14:49:33 +08:00
3dd308aff1 added sampler parse in MaterialFileLoader.cpp 2023-10-10 14:46:20 +08:00
bead8128b7 test ok that LoadPureColor2D material from file. 2023-10-10 10:57:29 +08:00
019e9964fa Merge branch 'devel_27_Default3DMaterial' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_27_Default3DMaterial 2023-10-10 09:49:59 +08:00
7ca81f38e8 Std2DMaterialLoader start ok,,but don't support Sampler2D in material file... 2023-10-10 02:48:02 +08:00
03750832c8 MaterialFileData added origin data. 2023-10-10 01:19:05 +08:00
018a72c09a created MaterialFileData and all material's data in the struct. 2023-10-10 00:24:41 +08:00
55fee1e5d7 renamed few class name; 2023-10-09 21:13:34 +08:00
c5dd359d18 Added Std2DMaterialLoader and Std3DMaterialLoader 2023-10-09 20:57:46 +08:00
85ec666989 used FragColor instead of Color in Fragment shader. 2023-10-09 20:56:56 +08:00
9a5cead33e moved Create to StdMaterial from Std2DMaterial and Std3DMaterial 2023-10-09 20:56:25 +08:00
695f1a22a8 used Block instead of State in MaterialFileLoader.cpp 2023-10-09 18:02:03 +08:00
237c1a469b writed GeometryShaderStateParse, need to test in furture. 2023-10-09 03:15:42 +08:00
5ede824522 MaterialTextParse completed VertexShader/FragmentShader parse. 2023-10-09 02:22:38 +08:00
46781b9627 used "VertexInput" state in .mtl file-format. 2023-10-09 02:21:56 +08:00
aaff0c23c9 improved CodeParse in MaterialFileLoader.cpp 2023-10-09 01:23:06 +08:00
3a3f9d10b7 Parse MaterialInstance filed in MaterialFileLoader.cpp 2023-10-09 01:12:27 +08:00
b6e391762b added MaterialInstanceStateParse 2023-10-08 20:38:54 +08:00
b262fdc645 added MaterialFileLoader.cpp 2023-10-08 20:00:46 +08:00
5e795c4a7f fragment shader output use "FragColor" instead of "Color". 2023-10-08 10:40:01 +08:00
0524c51feb Set Base-class StdMaterial to Std2DMaterial/Std3DMaterial 2023-10-08 10:04:58 +08:00
8dc9846ae8 Merge remote-tracking branch 'github/devel_27_Default3DMaterial' into devel_27_Default3DMaterial 2023-10-07 23:37:20 +08:00
1d866abb48 use List<const char *> instead of AnsiStringList in ShaderCreateInfo::function_list 2023-10-07 23:35:22 +08:00
ece7912f3c removed ShaderCreateInfoFragment::UseDefaultMain 2023-10-07 23:34:36 +08:00
4ef37a430e move Material2DCreateConfig/Material3DCreateConfig 2023-10-07 20:59:44 +08:00
1f91ec94e1 added Std2D/3D material files. 2023-10-07 20:09:16 +08:00
86123827cb moved glsl to standalone .glsl file. 2023-10-07 17:02:00 +08:00
19df201ab5 Added ShaderStage macro in ShaderGen 2023-10-07 16:14:34 +08:00
921d6d157f Update README.md 2023-10-06 23:05:29 +08:00
c0e4128365 Update README.md 2023-10-06 23:03:19 +08:00
8fe5e8dd55 Update README.md 2023-10-06 23:00:09 +08:00
3393a90127 prepare billboard 2023-10-06 22:25:39 +08:00
9b5157594f added MFGetNormal.h 2023-10-05 01:32:00 +08:00
10d4f2f04a fixed RayPicking.cpp, it can RUN ok! 2023-10-05 00:50:31 +08:00
a1e7b105f7 added GetViewportInfo/Buffer in VulkanAppFramework.h 2023-10-05 00:48:38 +08:00
67cf89fef1 improved RenderablePrimitiveCreater 2023-10-05 00:48:00 +08:00
e95cbb28a4 improved PlaneGrid 2023-09-29 02:59:10 +08:00
c9d6774bd3 added SetClearColor(COLOR::MozillaCharcoal) in VulkanApplicationFramework 2023-09-28 18:57:15 +08:00
78946994bb Added VertexLum3D material, test PlaneGrid3D OK! 2023-09-28 18:13:51 +08:00
1a63fa8c76 renamed a func in VertexAttribDataAccess1 2023-09-28 18:12:43 +08:00
db766f33ac fixed PlaneGrid3D example, it RUN OK!!! 2023-09-28 17:44:47 +08:00
3db94948c5 fixed a bug in PrimitiveCreater::Finish 2023-09-28 17:44:20 +08:00
cefea7229d added CreateUBODescriptor 2023-09-28 17:42:14 +08:00
45f50b3bc0 added GetPosition3DCamera/GetPosition3DL2WCamera and to support UBO Camera 2023-09-28 17:41:45 +08:00
dbea7764fb added GetPosition3D in Std3DMaterial 2023-09-28 15:03:34 +08:00
1101bcae9d updated codes with AABB in SceneNode 2023-09-28 15:02:57 +08:00
1197 changed files with 194638 additions and 3072 deletions

2
CMCore

Submodule CMCore updated: 416e96c169...0ac2a9431a

2
CMUtil

Submodule CMUtil updated: c0990c52eb...1e121c1b3e

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.5)
PROJECT(ULRE)
@@ -26,7 +26,7 @@ SET(ULRE CMCore
ULRE.Util
ULRE.ShaderGen
ULRE.SceneGraph
${HGL_GLM_LIB}
${HGL_MATH_LIB}
${RENDER_LIBRARY}
${Vulkan_LIBRARIES})

View File

@@ -1,25 +1,33 @@
# ULRE
experiment project - Ultra Lightweight Rendering Engine
ULRE is a project of experimental nature,Used to experiment with various rendering related techniques,And do some examples.
ULRE is a project of an experimental nature. Used to experiment with various rendering-related techniques And do some examples.
In the future, its compilicated version will be integrated into CMGameEngine.Used to replace the old rendering engine.
In the future, its complicated version will be integrated into CMGameEngine.Used to replace the old rendering engine.
Platform: Windows,Linux (WIP: Android,macOS,iOS)
Platform: Windows, Linux (WIP: Android, macOS, iOS)
Graphics API: Vulkan
Milestone:
On May 6 of 2023, a test was completed, and the entire scene was drawn with only one DrawCall. Although it still has a lot of unfinished work, it is still a very important milestone.
2. Texture2DArray was integrated into material instances.
Multiple render instances of the same model use different material instances and textures but are still merged into one render.
Although the changes this time are small, they are more significant.
1. a test was completed, and the entire scene was drawn with only one DrawCall.
Although it still has a lot of unfinished work, it is still a significant milestone.
#
ULRE是一个试验性质的工程用于试验各种渲染相关的技术以及做一些范例。在未来它的复杂化版本会被整合到CMGameEngine中用于替代旧的渲染引擎。
平台: Windows,Linux (开发中: Android,macOS,iOS)
平台: Windows, Linux (开发中: Android, macOS, iOS)
图形API: Vulkan
里程碑:
2023年5月6日完成了一个测试只用了一次DrawCall就绘制出了整个场景。虽然它还有很多未完成的工作但它依然是一个非常重要的里程碑。
2. Texture2DArray集成在材质实例中。同一个模型的多个渲染实例使用不同的材质实例以及不同的纹理
但它们依然被合并成一次渲染。这次的改变虽小,但意义更为重大。
1. 完成了一个测试只用了一次DrawCall就绘制出了整个场景。虽然它还有很多未完成的工作但它依然是一个非常重要的里程碑。

View File

@@ -0,0 +1,11 @@
mat4 GetJointMatrix()
{
// Joint数据分Joint ID和Joint Weight两部分
// Joint ID是一个uvec4在shader中为整数。在C++端可使用RGBA8UI或是RGBA16UI来传递。
// Joint Weight是权重在shader中为浮点。在C++端使用RGBA8或RGBA4来传递。
return joint.mats[JointID.x]*JointWeight.x+
joint.mats[JointID.y]*JointWeight.y+
joint.mats[JointID.z]*JointWeight.z+
joint.mats[JointID.w]*JointWeight.w;
}

View File

@@ -0,0 +1,9 @@
mat3 GetNormalMatrix()
{
return mat3(camera.view*GetLocalToWorld());
}
vec3 GetNormal(mat3 normal_matrix,vec3 normal)
{
return normalize(normal_matrix*normal);
}

View File

@@ -0,0 +1,38 @@
#Material
Name PureColor2D
Base Std2D
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec4 Color;
}
#Vertex
Code
{
void main()
{
HandoverMI();
gl_Position=GetPosition2D();
}
}
#Fragment
Output
{
vec4 FragColor
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=mi.Color;
}
}

View File

@@ -0,0 +1,39 @@
#Material
Name PureTexture2D
Base Std2D
#VertexInput
vec2 TexCoord
#Vertex
Output
{
vec2 TexCoord
}
Code
{
void main()
{
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@@ -0,0 +1,68 @@
#Material
Name RectTexture2D
Base Std2D
Prim SolidRectangles,WireRectangles
#VertexInput
vec4 TexCoord
#Vertex
Output
{
vec4 TexCoord
}
Code
{
void main()
{
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Geometry
in points
out triangle_strip,4
Output
{
vec2 TexCoord
}
Code
{
void main()
{
vec2 vlt=gl_in[0].gl_Position.xy;
vec2 vrb=gl_in[0].gl_Position.zw;
vec2 tlt=Input[0].TexCoord.xy;
vec2 trb=Input[0].TexCoord.zw;
gl_Position=vec4(vlt, vec2(0,1));Output.TexCoord=tlt; EmitVertex();
gl_Position=vec4(vlt.x, vrb.y, vec2(0,1));Output.TexCoord=vec2(tlt.x,trb.y); EmitVertex();
gl_Position=vec4(vrb.x, vlt.y, vec2(0,1));Output.TexCoord=vec2(trb.x,tlt.y); EmitVertex();
gl_Position=vec4(vrb, vec2(0,1));Output.TexCoord=trb; EmitVertex();
EndPrimitive();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@@ -0,0 +1,79 @@
#Material
Name RectTexture2DArray
Base Std2D
Prim SolidRectangles,WireRectangles
#MaterialInstance
Length 16
Stage Fragment
Code
{
uvec4 id;
}
#VertexInput
vec4 TexCoord
#Vertex
Output
{
vec4 TexCoord
}
Code
{
void main()
{
HandoverMI();
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Geometry
in points
out triangle_strip,4
Output
{
vec2 TexCoord
}
Code
{
void main()
{
vec2 vlt=gl_in[0].gl_Position.xy;
vec2 vrb=gl_in[0].gl_Position.zw;
vec2 tlt=Input[0].TexCoord.xy;
vec2 trb=Input[0].TexCoord.zw;
HandoverMI();gl_Position=vec4(vlt, vec2(0,1));Output.TexCoord=tlt; EmitVertex();
HandoverMI();gl_Position=vec4(vlt.x, vrb.y, vec2(0,1));Output.TexCoord=vec2(tlt.x,trb.y); EmitVertex();
HandoverMI();gl_Position=vec4(vrb.x, vlt.y, vec2(0,1));Output.TexCoord=vec2(trb.x,tlt.y); EmitVertex();
HandoverMI();gl_Position=vec4(vrb, vec2(0,1));Output.TexCoord=trb; EmitVertex();
EndPrimitive();
}
}
#Fragment
sampler2DArray TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=texture(TextureBaseColor,vec3(Input.TexCoord,mi.id.x));
}
}

View File

@@ -0,0 +1,37 @@
#Material
Name VertexColor2D
Base Std2D
#VertexInput
vec4 Color
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
Output.Color=Color;
gl_Position=GetPosition2D();
}
}
#Fragment
Output
{
vec4 FragColor
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

View File

@@ -0,0 +1,82 @@
#Material
Name BillboardFixedSize
Base Std3D/Billboard
#VertexInput
vec2 TexCoord
#MaterialInstance
Length 8
Stage Vertex
Code
{
uvec2 BillboardSize;
}
#Vertex
Output
{
vec2 BillboardSize
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
Output.BillboardSize=mi.BillboardSize/viewport.canvas_resolution;
gl_Position=GetPosition3D();
gl_Position/=gl_Position.w;
}
}
#Geometry
Output
{
vec2 TexCoord
}
Code
{
void main()
{
const vec2 BillboardVertex[4]=vec2[]
(
vec2(-0.5,-0.5),
vec2(-0.5, 0.5),
vec2( 0.5,-0.5),
vec2( 0.5, 0.5)
);
for(int i=0;i<4;i++)
{
gl_Position=gl_in[0].gl_Position;
gl_Position.xy+=BillboardVertex[i]*Input[0].BillboardSize;
Output.TexCoord=BillboardVertex[i]+vec2(0.5);
EmitVertex();
}
EndPrimitive();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@@ -0,0 +1,2 @@
vec4 direction;
vec4 color;

View File

@@ -0,0 +1,92 @@
#Material
Name BlinnPhong+HalfLambert shading model only color
Reference https://zhuanlan.zhihu.com/p/442023993
Base Std3D/BlinnPhong
//某些Require并不真的存在.ubo文件写成一行一个是为了方便未来改成带路径的
Require LocalToWorld
Require Camera
define HAVE_SPECULAR off //默认不定义HAVE_SPECULAR
UBO
{
File BlinnPhongSun.ubo //文件名,如果/开头表示从ShaderLibrary根目录开始没有则表示同一目录
Struct BlinnPhongSun //结构名称
Name sun //在代码中的变量名
Stage Fragment //会引用的shader
Set Global //Descriptor Set
}
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec3 Color;
float Gloss;
}
#VertexInput
vec3 Normal
#Vertex
Output
{
vec4 Position;
vec3 Normal;
}
Code
{
void main()
{
Output.Normal =GetNormal();
Output.Position =GetPosition3D();
HandoverMI();
gl_Position =Output.Position;
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
#define HAVE_SPECULAR
void main()
{
MaterialInstance mi=GetMI();
//点乘法线和光照
float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5;
//直接光颜色
vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb;
#ifndef HAVE_SPECULAR
FragColor=vec4(direct_color,1.0);
#else
vec3 spec_color=vec3(0.0);
if(intensity>0.0)
{
vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos));
float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,mi.Gloss)*sun.color.rgb;
}
FragColor=vec4(direct_color+spec_color,1.0);
#endif//HAVE_SPECULAR
}
}

View File

@@ -0,0 +1,100 @@
#Material
Name BlinnPhong+HalfLambert shading model only color
Reference https://zhuanlan.zhihu.com/p/442023993
Base Std3D/BlinnPhong
//某些Require并不真的存在.ubo文件写成一行一个是为了方便未来改成带路径的
Require LocalToWorld
Require Camera
define HAVE_SPECULAR off //默认不定义HAVE_SPECULAR
UBO
{
File BlinnPhongSun.ubo //文件名,如果/开头表示从ShaderLibrary根目录开始没有则表示同一目录
Struct BlinnPhongSun //结构名称
Name sun //在代码中的变量名
Stage Fragment //会引用的shader
Set Global //Descriptor Set
}
#MaterialInstance
Length 32
Stage Fragment
Code
{
vec4 Color;
uint tex_id;
}
#VertexInput
vec3 Normal
vec2 TexCoord
#Vertex
Output
{
vec4 Position;
vec3 Normal;
vec2 TexCoord
}
Code
{
void main()
{
Output.Normal =GetNormal();
Output.Position =GetPosition3D();
Output.TexCoord =TexCoord;
HandoverMI();
gl_Position =Output.Position;
}
}
#Fragment
sampler2DArray TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
#define HAVE_SPECULAR
void main()
{
MaterialInstance mi=GetMI();
vec4 texture_color=texture(TextureBaseColor,vec3(Input.TexCoord,mi.tex_id));
//点乘法线和光照
float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5;
//直接光颜色
vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb*texture_color.rgb;
#ifndef HAVE_SPECULAR
FragColor=vec4(direct_color,1.0);
#else
vec3 spec_color=vec3(0.0);
if(intensity>0.0)
{
vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos));
float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,8)*sun.color.rgb;
}
FragColor=vec4(direct_color+spec_color,1.0);
#endif//HAVE_SPECULAR
}
}

View File

@@ -0,0 +1,87 @@
#Material
Name MetricCellsGrid
Base Std3D
Reference https://www.shadertoy.com/view/wdSXzm
#VertexInput
vec2 TexCoord
#MaterialInstance
Length 120
Stage Fragment
Code
{
vec4 x_color;
vec4 y_color;
vec4 x_axis_color;
vec4 y_axis_color;
vec4 center_color;
vec2 lum; //x=0.1 sub cell line,y=0.2 big cell line
vec2 cell_step;
vec2 big_cell_step;
vec2 scale;
float axis_line_width;
float center_radius;
}
#Vertex
Output
{
vec2 TexCoord
}
Code
{
void main()
{
HandoverMI();
Output.TexCoord=TexCoord;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
float edge=viewport.inv_viewport_resolution.y;
float x=(Input.TexCoord.x-0.5)*mi.scale.x;
float y=(Input.TexCoord.y-0.5)*mi.scale.y;
vec4 color=vec4(0,0,0,1);
// ======= Lines + Bold lines
color.xyz += step(1.0 - 1.0 / mi.cell_step.x, fract(x / mi.cell_step.x )) * mi.x_color.rgb * mi.lum.x;
color.xyz += step(1.0 - 1.0 / mi.big_cell_step.x, fract(x / mi.big_cell_step.x)) * mi.x_color.rgb * mi.lum.y;
color.xyz += step(1.0 - 1.0 / mi.cell_step.y, fract(y / mi.cell_step.y )) * mi.y_color.rgb * mi.lum.x;
color.xyz += step(1.0 - 1.0 / mi.big_cell_step.y, fract(y / mi.big_cell_step.y)) * mi.y_color.rgb * mi.lum.y;
// ======= AXES
float xb = step(abs(x) - mi.axis_line_width, 0.0);
float yb = step(abs(y) - mi.axis_line_width, 0.0);
color.rgb = mix(color.rgb, mi.x_axis_color.rgb, (xb));
color.rgb = mix(color.rgb, mi.y_axis_color.rgb, (yb));
// ======= CENTER
float cb = length(vec2(x,y))-mi.center_radius;
color.rgb = mix(color.rgb, mi.center_color.rgb, cb>0.0?0.0:smoothstep(0,edge*mi.scale.y,abs(cb)));
FragColor=color;
}
}

View File

@@ -0,0 +1,38 @@
#Material
Name PureColor3D
Base Std3D
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec4 Color;
}
#Vertex
Code
{
void main()
{
HandoverMI();
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=mi.Color;
}
}

View File

@@ -0,0 +1,38 @@
#Material
Name VertexColor3D
Base Std3D
#VertexInput
vec4 Color
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
Output.Color=Color;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

View File

@@ -0,0 +1,47 @@
#Material
Name VertexLum3D
Base Std3D
#MaterialInstance
Length 16
Stage Vertex
Code
{
vec4 Color;
}
#VertexInput
float Luminance
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
Output.Color=Luminance*mi.Color;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

34
doc/AssetFileFormat.md Normal file
View File

@@ -0,0 +1,34 @@
# 为什么我们使用INI/TOML做为资产文件格式?
大部分的数据文件,我们会将其分为属性文本部分与二进制数据部分。
其中属性部分我们会使用INI/TOML方式编写。这样利于git/hg/svn等版本控制系统进行差异合并。
比如一个纹理贴图它的二进制部分首先是有它的“原始位图数据阵列”它的属性部分包含“宽、高、象素格式”这样的不可更改数据也包括“sRGB/Linear色彩空间、纹理分组、建议过滤方式、特定平台建议的压缩算法”等可调整数据。还有资产使用过程中产生的“引用资产列表”和“被引用资产列表”。
而这些可调整数据,我们可能是会随时修改的,甚至是不同的人可能会修改不同的部分。
如果我们将这些数据全部放入一个二进制文件中比如png/jpeg中。那么每修改一个小小的属性都需要向git/svn仓库提交整个二进制文件。这是相当愚蠢和不合理的。
而众所周知不管是免费的git/hg/svn还是收费的p4它们针对文本文件都会有一系列的差异化比较合并功能。而这个差异化自动合并都是基于文本行的。
所以,我们的所有资产文件,都会分裂成二进制数据文件和属性文本文件。而在这个属性文本文件中,对于每一项属性,是使用独立的行来保存数据的。
# Why do we use the INI/TOML as an asset file format?
For most files, we will split into the attributes text part and binary data part.
We will use the INI/TOML format to write the properties part. Because the format easily merges diff by git/hg/svn.
For example a texture. It's binary data includes "Raw bitmap data".
Its attributes part include "width, height, pixel format", they can't change.
Also, "sRGB/Linear colour space", "texture group", "recommend filter type" and "recommend compress format of special platform".
We may modify this data at any time. Even many people modify different parts at the same time.
If we use a binary file that it includes all data. for example, .png or .jpeg.
We need commit whole binary data after changed a few attributes. This behaviour is quite stupid and irrational.
Most people know this knowledge: Free git/hg/svn and commercial p4. They both include a merge-diff tool, which is text based.
so, we all asset files, they should split into the attributes text part and binary data part.
In this attribute's text file, a separate line is used to save data for each attribute.

BIN
doc/BlenderGizmo/Move.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
doc/BlenderGizmo/Rotate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

BIN
doc/BlenderGizmo/Scale.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
doc/Gizmo.odg Normal file

Binary file not shown.

View File

@@ -10,4 +10,6 @@
endmacro()
CreateProject(00.line line.cpp)
CreateProject(01.roundbox roundbox.cpp)
CreateProject(01.LerpLine LerpLine.cpp)
CreateProject(02.roundbox roundbox.cpp)

View File

@@ -0,0 +1,121 @@
// 主要用于测试几种2D插值算法
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/math/HalfFloat.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
constexpr uint32_t VERTEX_COUNT=3;
constexpr float position_data[VERTEX_COUNT*2]=
{
-1.0, 0.0,
1.0, 0.0,
};
constexpr VkFormat PositionFormat=VF_V2F;
constexpr float color_data[VERTEX_COUNT*4]=
{ 1,0,0,1,
0,1,0,1,
0,0,1,1
};
constexpr VkFormat ColorFormat=VF_V4F;
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitAutoMaterial()
{
mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"VertexColor2D",Prim::Lines);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg);
material_instance=db->CreateMaterialInstance(mci);
return material_instance;
}
bool InitPipeline()
{
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Lines);
return pipeline;
}
bool InitVBO()
{
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Triangle",VERTEX_COUNT);
if(!rpc.WriteVAB(VAN::Position, PositionFormat, position_data))return(false);
if(!rpc.WriteVAB(VAN::Color, ColorFormat, color_data ))return(false);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
return(render_obj);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitAutoMaterial())
return(false);
if(!InitPipeline())
return(false);
if(!InitVBO())
return(false);
if(!BuildCommandBuffer(render_obj))
return(false);
return(true);
}
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@@ -116,7 +116,7 @@ private:
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(VAN::Position, db->CreateVAB(VF_V2F,VERTEX_COUNT,position_data)))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
@@ -143,7 +143,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
cam.width=w;
cam.height=h;

View File

@@ -138,7 +138,7 @@ private:
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V4I16,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(VAN::Position, db->CreateVAB(VF_V4I16,VERTEX_COUNT,position_data)))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
@@ -165,7 +165,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
cam.width=w;
cam.height=h;

View File

@@ -0,0 +1,212 @@
// Billboard
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
using namespace hgl;
using namespace hgl::graph;
static float position_data[3]=
{
0,0,0
};
static float lumiance_data[2]={1,1};
static Color4f white_color(1,1,1,1);
static Color4f yellow_color(1,1,0,1);
class TestApp:public SceneAppFramework
{
Color4f color;
private:
Material * mtl_plane_grid =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * pipeline_plane_grid =nullptr;
Primitive * prim_plane_grid =nullptr;
MaterialInstance * mi_billboard =nullptr;
Pipeline * pipeline_billboard =nullptr;
Renderable * ro_billboard =nullptr;
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
private:
bool InitPlaneGridMP()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines);
cfg.local_to_world=true;
{
cfg.position_format=VAT_VEC2;
mtl_plane_grid=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_plane_grid)return(false);
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color);
if(!mi_plane_grid)return(false);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline_plane_grid)return(false);
}
return(true);
}
bool InitBillboardMP()
{
mtl::BillboardMaterialCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2D",Prim::Billboard);
{
cfg.fixed_size=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateBillboard2D(&cfg);
mi_billboard=db->CreateMaterialInstance(mci);
if(!mi_billboard)return(false);
pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,Prim::Billboard);
if(!pipeline_billboard)return(false);
}
return(true);
}
bool InitTexture()
{
texture=db->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"),true);
if(!texture)return(false);
sampler=db->CreateSampler();
if(!mi_billboard->GetMaterial()->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
Vector2u texture_size(texture->GetWidth(),texture->GetHeight());
mi_billboard->WriteMIData(texture_size);
return(true);
}
Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p)
{
Renderable *ri=db->CreateRenderable(r,mi,p);
if(!ri)
{
LOG_ERROR(OS_TEXT("Create Renderable failed."));
return(nullptr);
}
render_root.CreateSubNode(ri);
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
PrimitiveCreater pc(device,mi_plane_grid->GetVIL());
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(500,500);
pgci.sub_count.Set(5,5);
pgci.lum=128;
pgci.sub_lum=192;
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
}
{
PrimitiveCreater pc(device,mi_billboard->GetVIL());
pc.Init("Billboard",1);
if(!pc.WriteVAB(VAN::Position,VF_V3F,position_data))
return(false);
ro_billboard=db->CreateRenderable(&pc,mi_billboard,pipeline_billboard);
if(!ro_billboard)
return(false);
}
return(true);
}
bool InitScene()
{
Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
render_root.CreateSubNode(ro_billboard);
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
}
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitPlaneGridMP())
return(false);
if(!InitBillboardMP())
return(false);
if(!InitTexture())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1920,1080);
}

View File

@@ -14,3 +14,5 @@ CreateProject(01_draw_triangle_in_NDC draw_triangle_in_NDC.cpp)
CreateProject(02_draw_triangle_use_UBO draw_triangle_use_UBO.cpp)
CreateProject(03_auto_instance auto_instance.cpp)
CreateProject(04_auto_merge_material_instance auto_merge_material_instance.cpp)
CreateProject(05_Billboard BillboardTest.cpp)

View File

@@ -3,9 +3,9 @@
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/RenderList.h>
using namespace hgl;
@@ -16,6 +16,8 @@ constexpr uint32_t SCREEN_HEIGHT=1024;
constexpr uint32_t VERTEX_COUNT=3;
constexpr uint32_t TRIANGLE_NUMBER=12;
constexpr float position_data[VERTEX_COUNT*2]=
{
0.0, 0.0,
@@ -24,7 +26,8 @@ constexpr float position_data[VERTEX_COUNT*2]=
};
constexpr uint8 color_data[VERTEX_COUNT][4]=
{ {255,0,0,255},
{
{255,0,0,255},
{0,255,0,255},
{0,0,255,255}
};
@@ -71,18 +74,28 @@ private:
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
PrimitiveCreater rpc(device,material_instance->GetVIL());
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, VF_V4UN8, color_data ))return(false);
rpc.Init("Triangle",VERTEX_COUNT);
if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.WriteVAB(VAN::Color, VF_V4UN8, color_data ))return(false);
render_obj=rpc.Create(material_instance,pipeline);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
if(!render_obj)
return(false);
double rad;
Matrix4f mat;
for(uint i=0;i<12;i++)
render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj);
for(uint i=0;i<TRIANGLE_NUMBER;i++)
{
rad=deg2rad<double>((360/TRIANGLE_NUMBER)*i); //这里一定要加<float>或<float>否则结果用int保存会出现问题
mat=rotate(rad,Vector3f(0,0,1));
render_root.CreateSubNode(mat,render_obj);
}
render_root.RefreshMatrix();
@@ -116,7 +129,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -3,8 +3,7 @@
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/RenderList.h>
#include<hgl/color/Color.h>
@@ -25,6 +24,8 @@ constexpr float position_data[VERTEX_COUNT*2]=
constexpr uint DRAW_OBJECT_COUNT=12;
#define USE_MATERIAL_FILE true //是否使用材质文件
class TestApp:public VulkanApplicationFramework
{
private:
@@ -52,9 +53,12 @@ private:
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg);
#ifndef USE_MATERIAL_FILE
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg); //走程序内置材质创建函数
material=db->CreateMaterial(mci);
#else
material=db->LoadMaterial("Std2D/PureColor2D",&cfg); //走材质文件加载
#endif//USE_MATERIAL_FILE
if(!material)
return(false);
@@ -79,18 +83,28 @@ private:
bool InitVBOAndRenderList()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
PrimitiveCreater pc(device,material->GetDefaultVIL());
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!pc.Init("Triangle",VERTEX_COUNT))
return(false);
if(!pc.WriteVAB(VAN::Position, VF_V2F, position_data))
return(false);
Primitive *prim=pc.Create();
if(!prim)
return(false);
db->Add(prim);
for(uint i=0;i<DRAW_OBJECT_COUNT;i++)
{
render_obj[i].r=rpc.Create(render_obj[i].mi,pipeline);
render_obj[i].r=db->CreateRenderable(prim,render_obj[i].mi,pipeline);
if(!render_obj[i].r)
return(false);
render_root.CreateSubNode(rotate(deg2rad(360/DRAW_OBJECT_COUNT*i),Vector3f(0,0,1)),render_obj[i].r);
render_root.CreateSubNode(rotate(deg2rad<double>(double(360/DRAW_OBJECT_COUNT*i)),Vector3f(0,0,1)),render_obj[i].r);
}
render_root.RefreshMatrix();
@@ -125,7 +139,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -6,8 +6,8 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
@@ -108,16 +108,18 @@ private:
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Triangle",VERTEX_COUNT);
#ifdef USE_HALF_FLOAT_POSITION
Float32toFloat16(position_data_hf,position_data_float,VERTEX_COUNT*2);
#endif//USE_HALF_FLOAT_POSITION
if(!rpc.SetVBO(VAN::Position, PositionFormat, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, ColorFormat, color_data ))return(false);
if(!rpc.WriteVAB(VAN::Position, PositionFormat, position_data))return(false);
if(!rpc.WriteVAB(VAN::Color, ColorFormat, color_data ))return(false);
render_obj=rpc.Create(material_instance,pipeline);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
return(render_obj);
}
@@ -145,7 +147,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -4,29 +4,29 @@
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
constexpr uint32_t VERTEX_COUNT=3;
static float position_data[VERTEX_COUNT][2]=
static float position_data_float[VERTEX_COUNT][2]=
{
{0.5, 0.25},
{0.75, 0.75},
{0.25, 0.75}
};
constexpr float color_data[VERTEX_COUNT][4]=
static uint16 position_data_u16[VERTEX_COUNT][2]={};
constexpr uint8 color_data[VERTEX_COUNT*4]=
{
{1,0,0,1},
{0,1,0,1},
{0,0,1,1}
255,0,0,255,
0,255,0,255,
0,0,255,255
};
//#define USE_ZERO2ONE_COORD //使用左上角0,0右下角1,1的坐标系
@@ -46,23 +46,31 @@ private:
{
mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"VertexColor2D",Prim::Triangles);
VILConfig vil_config;
#ifdef USE_ZERO2ONE_COORD
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
#else
cfg.coordinate_system=CoordinateSystem2D::Ortho;
cfg.position_format =VAT_UVEC2; //这里指定shader中使用uvec2当做顶点输入格式
// ^
// + 这上下两种格式要配套,否则会出错
// v
vil_config.Add(VAN::Position,VF_V2U16); //这里指定VAB中使用RG16U当做顶点数据格式
#endif//USE_ZERO2ONE_COORD
vil_config.Add(VAN::Color,VF_V4UN8); //这里指定VAB中使用RGBA8UNorm当做颜色数据格式
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg);
material_instance=db->CreateMaterialInstance(mci);
material_instance=db->CreateMaterialInstance(mci,&vil_config);
if(!material_instance)
return(false);
db->global_descriptor.Bind(material_instance->GetMaterial());
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
@@ -71,32 +79,37 @@ private:
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
PrimitiveCreater rpc(device,material_instance->GetVIL());
#ifndef USE_ZERO2ONE_COORD //使用ortho坐标系
for(uint i=0;i<VERTEX_COUNT;i++)
{
position_data[i][0]*=SCREEN_WIDTH;
position_data[i][1]*=SCREEN_HEIGHT;
}
rpc.Init("Triangle",VERTEX_COUNT);
#ifdef USE_ZERO2ONE_COORD //使用0 to 1坐标系
if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data_float ))return(false);
#else //使用ortho坐标系
if(!rpc.WriteVAB(VAN::Position, VF_V2U16, position_data_u16 ))return(false);
#endif//USE_ZERO2ONE_COORD
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, VF_V4F, color_data ))return(false);
if(!rpc.WriteVAB(VAN::Color, VF_V4UN8, color_data ))return(false);
render_obj=rpc.Create(material_instance,pipeline);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
return(true);
}
public:
bool Init()
bool Init(uint w,uint h)
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
if(!VulkanApplicationFramework::Init(w,h))
return(false);
#ifndef USE_ZERO2ONE_COORD
for(uint i=0;i<VERTEX_COUNT;i++)
{
position_data_u16[i][0]=position_data_float[i][0]*w;
position_data_u16[i][1]=position_data_float[i][1]*h;
}
#endif//
if(!InitMaterial())
return(false);
@@ -109,7 +122,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
@@ -119,12 +132,5 @@ public:
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
RunApp<TestApp>(1280,720);
}

View File

@@ -4,6 +4,7 @@ SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h
add_subdirectory(Basic)
add_subdirectory(Texture)
add_subdirectory(LightBasic)
add_subdirectory(Gizmo)
add_subdirectory(Vulkan)
@@ -21,4 +22,3 @@ macro(CreateProject name)
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example")
endmacro()
CreateProject(MaterialCreaterTest MaterialCreaterTest.cpp)

View File

@@ -11,3 +11,4 @@ endmacro()
CreateProject(00.control_point_2d control_point_2d.cpp)
CreateProject(01.align_test align_test.cpp)
CreateProject(02.TextDrawTest DrawText.cpp)

View File

@@ -1,4 +1,4 @@
#include<hgl/type/StringList.h>
#include<hgl/io/LoadString.h>
#include<hgl/graph/font/TextRender.h>
#include"VulkanAppFramework.h"
@@ -8,7 +8,7 @@ using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH =1280;
constexpr uint32_t SCREEN_HEIGHT=SCREEN_WIDTH/16*9;
class TestApp:public VulkanApplicationFramework
class TestApp:public CameraAppFramework
{
private:
@@ -61,16 +61,21 @@ public:
if(!InitTextRenderable())
return(false);
BuildCommandBuffer(render_obj);
VulkanApplicationFramework::BuildCommandBuffer(render_obj);
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
VulkanApplicationFramework::BuildCommandBuffer(render_obj);
}
void BuildCommandBuffer(uint32_t index)
{
VulkanApplicationFramework::BuildCommandBuffer(index,render_obj);
}
};//class TestApp:public VulkanApplicationFramework

View File

@@ -0,0 +1,30 @@
// Blender axis
/**
* 0 1 2 3 4 5 6 7
* 0+---------->>>> X
* 1|
* 2|
* 3| +--+
* 4| +--+
* 5|
* 6V
* 7V
*
* 坐标轴参考Blender设计
*
* 单方向坐标轴长度为8
* 最终箭头长度为2
*
* 负责2D平移的方块尺寸为1位置在3-4
*
*/
/**
* 缩放工具
*/
class GizmoScale
{
public:
};//class GizmoScale

View File

@@ -10,4 +10,16 @@
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Gizmo")
endmacro()
CreateProject(PlaneGrid3D PlaneGrid3D.cpp)
CreateProject(01_PlaneGrid3D PlaneGrid3D.cpp)
CreateProject(02_RayPicking RayPicking.cpp)
CreateProject(03_MetricCellsGrid MetricCellsGrid.cpp)
CreateProject(04_Gizmo3DTest GizmoTest.cpp
Gizmo.h
GizmoResource.h
GizmoResource.cpp
Gizmo3DMove.cpp
Gizmo3DScale.cpp
Gizmo3DRotate.cpp)
#CreateProject(03_BlenderAxis BlenderAxis.cpp)

43
example/Gizmo/Gizmo.h Normal file
View File

@@ -0,0 +1,43 @@
#pragma once
#include<hgl/graph/VK.h>
VK_NAMESPACE_BEGIN
enum class GizmoColor:uint
{
Black=0,
White,
Red,
Green,
Blue,
Yellow,
ENUM_CLASS_RANGE(Black,Yellow)
};
enum class GizmoShape:uint
{
Square=0, //方块
Circle, //圆
Cube, //立方体
Sphere, //球
Cone, //圆锥
Cylinder, //圆柱
Torus, //圆环
ENUM_CLASS_RANGE(Square,Torus)
};
bool InitGizmoResource(RenderResource *);
void FreeGizmoResource();
Renderable *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color);
StaticMesh *GetGizmoMoveStaticMesh();
StaticMesh *GetGizmoScaleStaticMesh();
StaticMesh *GetGizmoRotateStaticMesh();
VK_NAMESPACE_END

View File

@@ -0,0 +1,151 @@
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
假设轴尺寸为10
箭头长度为2直径为2
双轴调节正方形长宽为1位置为5,5
中心球半径为1
*/
#include"GizmoResource.h"
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_move=nullptr;
}//namespace
StaticMesh *GetGizmoMoveStaticMesh()
{
return sm_gizmo_move;
}
void ClearGizmoMoveStaticMesh()
{
SAFE_CLEAR(sm_gizmo_move);
}
bool InitGizmoMoveStaticMesh()
{
Renderable *sphere=GetGizmoRenderable(GizmoShape::Sphere,GizmoColor::White);
Renderable *cylinder[3]
{
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue),
};
Renderable *cone[3]
{
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Blue),
};
Renderable *circle[3]=
{
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Blue)
};
if(!sphere)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cone[i])
return(false);
if(!circle[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
root_node->CreateSubNode(sphere);
{
Transform tm;
const Vector3f one_scale(1);
const Vector3f circle_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
root_node->CreateSubNode(tm,cylinder[2]); //Z 向上圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
root_node->CreateSubNode(tm,cone[2]); //Z 向上圆锥
tm.SetScale(circle_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
root_node->CreateSubNode(tm,circle[2]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
root_node->CreateSubNode(tm,cylinder[0]); //X 向右圆柱
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
root_node->CreateSubNode(tm,cone[0]); //X 向右圆锥
tm.SetScale(circle_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
root_node->CreateSubNode(tm,circle[0]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
root_node->CreateSubNode(tm,cylinder[1]); //Y 向前圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
root_node->CreateSubNode(tm,cone[1]); //Y 向前圆锥
tm.SetScale(circle_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
root_node->CreateSubNode(tm,circle[1]);
}
}
sm_gizmo_move=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_move)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@@ -0,0 +1,65 @@
#include"GizmoResource.h"
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_rotate=nullptr;
}//namespace
StaticMesh *GetGizmoRotateStaticMesh()
{
return sm_gizmo_rotate;
}
void ClearGizmoRotateStaticMesh()
{
SAFE_CLEAR(sm_gizmo_rotate);
}
bool InitGizmoRotateStaticMesh()
{
Renderable *torus[4]
{
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Blue),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White),
};
for(int i=0;i<4;i++)
{
if(!torus[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
{
Transform tm;
tm.SetScale(GIZMO_ARROW_LENGTH);
root_node->CreateSubNode(tm,torus[0]);
tm.SetRotation(AXIS::Z,90);
root_node->CreateSubNode(tm,torus[1]);
tm.SetRotation(AXIS::Y,90);
root_node->CreateSubNode(tm,torus[2]);
}
sm_gizmo_rotate=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_rotate)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@@ -0,0 +1,151 @@
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
假设轴尺寸为10
箭头长度为2直径为2
双轴调节正方形长宽为1位置为5,5
中心球半径为1
*/
#include"GizmoResource.h"
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_scale=nullptr;
}//namespace
StaticMesh *GetGizmoScaleStaticMesh()
{
return sm_gizmo_scale;
}
void ClearGizmoScaleStaticMesh()
{
SAFE_CLEAR(sm_gizmo_scale);
}
bool InitGizmoScaleStaticMesh()
{
Renderable *center_cube=GetGizmoRenderable(GizmoShape::Cube,GizmoColor::White);
Renderable *cylinder[3]
{
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue),
};
Renderable *cube[3]
{
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Blue),
};
Renderable *square[3]=
{
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Blue)
};
if(!center_cube)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cube[i])
return(false);
if(!square[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
root_node->CreateSubNode(scale(GIZMO_CENTER_SPHERE_RADIUS*2),center_cube);
{
Transform tm;
const Vector3f one_scale(1);
const Vector3f plane_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
root_node->CreateSubNode(tm,cylinder[2]); //Z 向上圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
root_node->CreateSubNode(tm,cube[2]); //Z 向上圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
root_node->CreateSubNode(tm,square[2]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
root_node->CreateSubNode(tm,cylinder[0]); //X 向右圆柱
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
root_node->CreateSubNode(tm,cube[0]); //X 向右圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
root_node->CreateSubNode(tm,square[0]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
root_node->CreateSubNode(tm,cylinder[1]); //Y 向前圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
root_node->CreateSubNode(tm,cube[1]); //Y 向前圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
root_node->CreateSubNode(tm,square[1]);
}
}
sm_gizmo_scale=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_scale)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@@ -0,0 +1,330 @@
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h>
#include"GizmoResource.h"
VK_NAMESPACE_BEGIN
bool InitGizmoMoveStaticMesh();
void ClearGizmoMoveStaticMesh();
bool InitGizmoScaleStaticMesh();
void ClearGizmoScaleStaticMesh();
bool InitGizmoRotateStaticMesh();
void ClearGizmoRotateStaticMesh();
namespace
{
static RenderResource * gizmo_rr=nullptr;
struct GizmoResource
{
Material * mtl;
MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)];
Pipeline * pipeline;
VertexDataManager * vdm;
PrimitiveCreater * prim_creater;
};
static GizmoResource gizmo_line{};
static GizmoResource gizmo_triangle{};
struct GizmoRenderable
{
Primitive *prim;
Renderable *renderable[size_t(GizmoColor::RANGE_SIZE)];
};
GizmoRenderable gizmo_rederable[size_t(GizmoShape::RANGE_SIZE)]{};
void InitGizmoRenderable(const GizmoShape &gs,Primitive *prim,Pipeline *p)
{
if(!prim)
return;
GizmoRenderable *gr=gizmo_rederable+size_t(gs);
gr->prim=prim;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
gr->renderable[i]=CreateRenderable(prim,gizmo_triangle.mi[i],p);
}
bool InitMI(GizmoResource *gr)
{
if(!gr||!gr->mtl)
return(false);
Color4f color;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
{
color=GetColor4f(gizmo_color[i],1.0);
gr->mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color);
if(!gr->mi[i])
return(false);
}
return(true);
}
bool InitGizmoResource2D(GPUDevice *device)
{
if(!gizmo_rr)
return(false);
RenderPass *render_pass=device->GetRenderPass();
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines);
cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.local_to_world=true;
cfg.position_format=VAT_VEC3;
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(&cfg);
if(!mci)
return(false);
gizmo_line.mtl=gizmo_rr->CreateMaterial(mci);
if(!gizmo_line.mtl)
return(false);
gizmo_line.mtl->Update();
}
{
gizmo_line.pipeline=render_pass->CreatePipeline(gizmo_line.mtl,InlinePipeline::Solid3D,Prim::Lines);
if(!gizmo_line.pipeline)
return(false);
}
if(!InitMI(&gizmo_line))
return(false);
{
gizmo_line.vdm=new VertexDataManager(device,gizmo_line.mtl->GetDefaultVIL());
if(!gizmo_line.vdm)
return(false);
if(!gizmo_line.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
return(false);
}
{
}
return(true);
}
bool InitGizmoResource3D(GPUDevice *device)
{
if(!gizmo_rr)
return(false);
RenderPass *render_pass=device->GetRenderPass();
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"Gizmo3D",Prim::Triangles);
cfg.local_to_world=true;
cfg.material_instance=true;
mtl::MaterialCreateInfo *mci=CreateMaterialGizmo3D(&cfg);
if(!mci)
return(false);
gizmo_triangle.mtl=gizmo_rr->CreateMaterial(mci);
if(!gizmo_triangle.mtl)
return(false);
gizmo_triangle.mtl->Update();
}
{
gizmo_triangle.pipeline=render_pass->CreatePipeline(gizmo_triangle.mtl,InlinePipeline::Solid3D,Prim::Triangles);
if(!gizmo_triangle.pipeline)
return(false);
}
if(!InitMI(&gizmo_triangle))
return(false);
{
gizmo_triangle.vdm=new VertexDataManager(device,gizmo_triangle.mtl->GetDefaultVIL());
if(!gizmo_triangle.vdm)
return(false);
if(!gizmo_triangle.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
return(false);
}
{
gizmo_triangle.prim_creater=new PrimitiveCreater(gizmo_triangle.vdm);
if(!gizmo_triangle.prim_creater)
return(false);
}
{
using namespace inline_geometry;
{
InitGizmoRenderable(GizmoShape::Square,CreatePlaneSqaure(gizmo_triangle.prim_creater),gizmo_triangle.pipeline);
}
{
CircleCreateInfo cci;
cci.center=Vector2f(0,0);
cci.radius=Vector2f(0.5,0.5);
cci.field_count=16;
cci.has_center=false;
InitGizmoRenderable(GizmoShape::Circle,CreateCircle3DByIndexTriangles(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
{
CubeCreateInfo cci;
cci.normal=true;
cci.tangent=false;
cci.tex_coord=false;
InitGizmoRenderable(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
{
InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,16),gizmo_triangle.pipeline);
}
{
ConeCreateInfo cci;
cci.radius =GIZMO_CONE_RADIUS; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=3; //圆锥高度分割数
InitGizmoRenderable(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
{
struct CylinderCreateInfo cci;
cci.halfExtend =1; //圆柱一半高度
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1; //圆柱半径
InitGizmoRenderable(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
{
struct TorusCreateInfo tci;
tci.innerRadius=0.975;
tci.outerRadius=1.0;
tci.numberSlices=64;
tci.numberStacks=8;
InitGizmoRenderable(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci),gizmo_triangle.pipeline);
}
ENUM_CLASS_FOR(GizmoShape,int,i)
{
if(!gizmo_rederable[i].prim)
return(false);
}
}
return(true);
}
}//namespace
bool InitGizmoResource(RenderResource *rr)
{
if(!rr)
return(false);
if(gizmo_rr)
return(false);
gizmo_rr=rr;
GPUDevice *device=gizmo_rr->GetDevice();
if(!InitGizmoResource3D(device))
return(false);
if(!InitGizmoResource2D(device))
return(false);
InitGizmoMoveStaticMesh();
InitGizmoScaleStaticMesh();
InitGizmoRotateStaticMesh();
return(true);
}
void FreeGizmoResource()
{
ClearGizmoRotateStaticMesh();
ClearGizmoScaleStaticMesh();
ClearGizmoMoveStaticMesh();
for(GizmoRenderable &gr:gizmo_rederable)
{
SAFE_CLEAR(gr.prim)
SAFE_CLEAR_OBJECT_ARRAY(gr.renderable)
}
SAFE_CLEAR(gizmo_triangle.prim_creater);
SAFE_CLEAR(gizmo_triangle.vdm);
SAFE_CLEAR(gizmo_line.prim_creater);
SAFE_CLEAR(gizmo_line.vdm);
}
Renderable *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color)
{
if(!gizmo_rr)
return(nullptr);
RANGE_CHECK_RETURN_NULLPTR(shape)
RANGE_CHECK_RETURN_NULLPTR(color)
return gizmo_rederable[size_t(shape)].renderable[size_t(color)];
}
StaticMesh *CreateGizmoStaticMesh(SceneNode *root_node)
{
if(!root_node)
return(nullptr);
if(root_node->IsEmpty())
return(nullptr);
return(new StaticMesh(root_node));
}
VK_NAMESPACE_END

View File

@@ -0,0 +1,42 @@
#pragma once
#include"Gizmo.h"
#include<hgl/color/Color.h>
VK_NAMESPACE_BEGIN
class SceneNode;
class PrimitiveCreater;
class StaticMesh;
constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]=
{
COLOR::MozillaCharcoal,
COLOR::BlanchedAlmond,
COLOR::BlenderAxisRed,
COLOR::BlenderAxisGreen,
COLOR::BlenderAxisBlue,
COLOR::BlenderYellow,
};
constexpr const float GIZMO_ARROW_LENGTH=10; ///<箭头整体长度
constexpr const float GIZMO_CENTER_SPHERE_RADIUS=1.0f; ///<中心球半径
constexpr const float GIZMO_CONE_LENGTH=1.0f; ///<圆锥高度
constexpr const float GIZMO_CONE_RADIUS=1.0f; ///<圆锥底部半径
constexpr const float GIZMO_CONE_OFFSET=GIZMO_ARROW_LENGTH-(GIZMO_CONE_LENGTH/2.0f); ///<圆锥偏移量
constexpr const float GIZMO_CYLINDER_RADIUS=0.25f; ///<圆柱半径
constexpr const float GIZMO_CYLINDER_LENGTH=GIZMO_ARROW_LENGTH-GIZMO_CENTER_SPHERE_RADIUS-GIZMO_CONE_LENGTH; ///<圆柱长度
constexpr const float GIZMO_CYLINDER_HALF_LENGTH=GIZMO_CYLINDER_LENGTH/2.0f; ///<圆柱一半长度
constexpr const float GIZMO_CYLINDER_OFFSET=GIZMO_CYLINDER_HALF_LENGTH+GIZMO_CENTER_SPHERE_RADIUS; ///<圆柱偏移量
constexpr const float GIZMO_TWO_AXIS_OFFSET=5.0F; ///<二轴调节点偏移量(方片或圆)
Renderable *GetGizmoRenderable(const GizmoShape &gs,const GizmoColor &);
StaticMesh *CreateGizmoStaticMesh(SceneNode *);
VK_NAMESPACE_END

165
example/Gizmo/GizmoTest.cpp Normal file
View File

@@ -0,0 +1,165 @@
#include"VulkanAppFramework.h"
#include"Gizmo.h"
#include<hgl/graph/Ray.h>
using namespace hgl;
using namespace hgl::graph;
const Vector3f GizmoPosition(0,0,0);
//
///**
//* 一种永远转向正面的场景节点
//*/
//class BillboardSceneNode:public SceneNode
//{
// CameraInfo *camera_info=nullptr;
// bool face_to_camera=false;
//
// ViewportInfo *viewport_info=nullptr;
// float fixed_scale=1.0;
//
//public:
//
// using SceneNode::SceneNode;
// virtual ~BillboardSceneNode()=default;
//
// virtual void SetCameraInfo (CameraInfo * ci ){camera_info =ci;}
// virtual void SetViewportInfo(ViewportInfo * vi ){viewport_info =vi;}
//
// virtual void SetFaceToCamera(bool ftc ){face_to_camera=ftc;}
// virtual void SetFixedScale (const float size){fixed_scale =size;}
//
// virtual bool RefreshTransform(const Transform &tf=IdentityTransform) override
// {
// if(!camera_info)
// {
// return SceneNode::RefreshTransform(tf);
// }
//
// if(face_to_camera)
// {
// LocalTransform.SetRotation(CalculateFacingRotationQuat(GetWorldPosition(),camera_info->view,AxisVector::X));
// }
//
// if(viewport_info)
// {
// const float screen_height=viewport_info->GetViewportHeight();
//
// const Vector4f pos=camera_info->Project(GetWorldPosition());
//
// LocalTransform.SetScale(pos.w*fixed_scale/screen_height);
// }
//
// return SceneNode::RefreshTransform(tf);
// }
//};//class BillboardSceneNode:public SceneNode
class TestApp:public SceneAppFramework
{
SceneNode root;
//BillboardSceneNode *rotate_white_torus=nullptr;
StaticMesh *sm_move=nullptr;
StaticMesh *sm_rotate=nullptr;
StaticMesh *sm_scale=nullptr;
Renderable *face_torus=nullptr;
private:
bool InitGizmo()
{
if(!InitGizmoResource(db))
return(false);
sm_move =GetGizmoMoveStaticMesh();
sm_rotate =GetGizmoRotateStaticMesh();
sm_scale =GetGizmoScaleStaticMesh();
face_torus =GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White);
return(true);
}
void InitGizmoSceneTree()
{
camera_control->Refresh();
CameraInfo *ci=camera_control->GetCameraInfo();
root.Clear();
root.CreateSubNode(sm_move->GetScene());
root.CreateSubNode(sm_rotate->GetScene());
//root.CreateSubNode(sm_scale->GetScene());
//{
// Transform tm;
// tm.SetScale(7.5);
// rotate_white_torus=new BillboardSceneNode(tm,face_torus);
// rotate_white_torus->SetCameraInfo(ci);
// rotate_white_torus->SetFaceToCamera(true);
// root.AddSubNode(rotate_white_torus);
//}
root.RefreshMatrix();
render_list->SetCamera(ci);
render_list->Expend(&root);
}
public:
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitGizmo())
return(false);
InitGizmoSceneTree();
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
return(true);
}
~TestApp()
{
FreeGizmoResource();
}
void BuildCommandBuffer(uint32 index) override
{
camera_control->Refresh();
const CameraInfo *ci=camera_control->GetCameraInfo();
const ViewportInfo *vi=GetViewportInfo();
const float screen_height=vi->GetViewportHeight();
const Vector4f pos=ci->Project(GizmoPosition);
//{
// Transform tm;
// tm.SetScale(pos.w*16.0f/screen_height);
// root.SetLocalTransform(tm);
//}
root.RefreshMatrix();
render_list->UpdateLocalToWorld();
SceneAppFramework::BuildCommandBuffer(index);
}
};//class TestApp:public SceneAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1024,1024);
}

View File

@@ -0,0 +1,147 @@
// Metric Cells Grid
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
struct MetricCellsGridData
{
Color4f x_color;
Color4f y_color;
Color4f x_axis_color;
Color4f y_axis_color;
Color4f center_color;
Vector2f lum;
Vector2f cell_step;
Vector2f big_cell_step;
Vector2f scale;
float axis_line_width;
float center_radius;
};
constexpr const size_t MCG_SIZE=sizeof(MetricCellsGridData);
constexpr const float PLANE_SIZE=1024;
class TestApp:public SceneAppFramework
{
private:
MetricCellsGridData mcg_data;
Material * material =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane =nullptr;
MaterialInstance * material_instance =nullptr;
private:
bool InitMDP()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"MetricCellsGrid",Prim::Fan);
cfg.local_to_world=true;
material=db->LoadMaterial("Std3D/MetricCellsGrid",&cfg);
if(!material)return(false);
{
mcg_data.x_color=Color4f(1,1,1,1);
mcg_data.y_color=Color4f(1,1,1,1);
mcg_data.x_axis_color=GetColor4f(COLOR::BlenderAxisRed, 1.0);
mcg_data.y_axis_color=GetColor4f(COLOR::BlenderAxisGreen, 1.0);
mcg_data.center_color=Color4f(1,1,0,1);
mcg_data.lum =Vector2f(0.1,0.2);
mcg_data.cell_step =Vector2f(8,8);
mcg_data.big_cell_step =Vector2f(32,32);
mcg_data.scale =Vector2f(PLANE_SIZE,PLANE_SIZE);
mcg_data.axis_line_width=1.0;
mcg_data.center_radius =4.0;
}
material_instance=db->CreateMaterialInstance(material,nullptr,&mcg_data);
pipeline=CreatePipeline(material,InlinePipeline::Solid3D,Prim::Fan);
return pipeline;
}
bool CreateRenderObject()
{
PrimitiveCreater pc(device,material->GetDefaultVIL());
ro_plane=inline_geometry::CreatePlaneSqaure(&pc);
if(ro_plane)
db->Add(ro_plane);
return ro_plane;
}
Renderable *Add(MaterialInstance *mi,const Matrix4f &mat)
{
Renderable *ri=db->CreateRenderable(ro_plane,mi,pipeline);
if(!ri)
return(nullptr);
render_root.CreateSubNode(mat,ri);
return ri;
}
bool InitScene()
{
Add(material_instance,scale(PLANE_SIZE,PLANE_SIZE,1));
camera->pos=Vector3f(PLANE_SIZE/4,PLANE_SIZE/2,PLANE_SIZE/4);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
// camera_control->SetReserveDirection(true,true); //反转x,y
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
bool Init(uint width,uint height) override
{
if(!SceneAppFramework::Init(width,height))
return(false);
if(!InitMDP())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1280,720);
}

View File

@@ -1,4 +1,4 @@
// 4.Geometry3D
// PlaneGrid3D
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
@@ -6,102 +6,100 @@
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKVertexInputConfig.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
class TestApp:public CameraAppFramework
class TestApp:public SceneAppFramework
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
SceneNode render_root;
RenderList * render_list =nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane_grid[3]{};
Primitive * prim_plane_grid =nullptr;
MaterialInstance * material_instance[3]{};
private:
bool InitMDP()
{
material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines);
cfg.local_to_world=true;
cfg.position_format=VAT_VEC2;
material=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!material)return(false);
material_instance=db->CreateMaterialInstance(material);
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline)
return(false);
VILConfig vil_config;
return(true);
vil_config.Add(VAN::Luminance,VF_V1UN8);
Color4f GridColor;
COLOR ce=COLOR::BlenderAxisRed;
for(uint i=0;i<3;i++)
{
GridColor=GetColor4f(ce,1.0);
material_instance[i]=db->CreateMaterialInstance(material,&vil_config,&GridColor);
ce=COLOR((int)ce+1);
}
pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D,Prim::Lines);
return pipeline;
}
Renderable *Add(Primitive *r,const Matrix4f &mat)
bool CreateRenderObject()
{
Renderable *ri=db->CreateRenderable(r,material_instance,pipeline);
using namespace inline_geometry;
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(32,32);
pgci.sub_count.Set(8,8);
pgci.lum=180;
pgci.sub_lum=255;
PrimitiveCreater pc(device,material_instance[0]->GetVIL());
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
return prim_plane_grid;
}
Renderable *Add(MaterialInstance *mi,const Matrix4f &mat)
{
Renderable *ri=db->CreateRenderable(prim_plane_grid,mi,pipeline);
if(!ri)
return(nullptr);
render_root.CreateSubNode(mat,ri);
return ri;
}
void CreateRenderObject()
{
using namespace inline_geometry;
struct PlaneGridCreateInfo pgci;
pgci.coord[0]=Vector3f(-100,-100,0);
pgci.coord[1]=Vector3f( 100,-100,0);
pgci.coord[2]=Vector3f( 100, 100,0);
pgci.coord[3]=Vector3f(-100, 100,0);
pgci.step.x=32;
pgci.step.y=32;
pgci.side_step.x=8;
pgci.side_step.y=8;
pgci.color.Set(0.5,0,0,1);
pgci.side_color.Set(1,0,0,1);
const VIL *vil=material_instance->GetVIL();
ro_plane_grid[0]=CreatePlaneGrid(db,vil,&pgci);
pgci.color.Set(0,0.5,0,1);
pgci.side_color.Set(0,1,0,1);
ro_plane_grid[1]=CreatePlaneGrid(db,vil,&pgci);
pgci.color.Set(0,0,0.5,1);
pgci.side_color.Set(0,0,1,1);
ro_plane_grid[2]=CreatePlaneGrid(db,vil,&pgci);
}
bool InitScene()
{
Add(ro_plane_grid[0],Matrix4f(1.0f));
Add(ro_plane_grid[1],rotate(HGL_RAD_90,0,1,0));
Add(ro_plane_grid[2],rotate(HGL_RAD_90,1,0,0));
Add(material_instance[0],Matrix4f(1.0f));
Add(material_instance[1],rotate(HGL_RAD_90,0,1,0));
Add(material_instance[2],rotate(HGL_RAD_90,1,0,0));
camera->pos=Vector3f(200,200,200);
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
// camera_control->SetReserveDirection(true,true); //反转x,y
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
render_list->Expend(&render_root);
return(true);
}
@@ -110,51 +108,28 @@ public:
~TestApp()
{
SAFE_CLEAR(render_list);
SAFE_CLEAR(prim_plane_grid);
}
bool Init()
bool Init(uint width,uint height) override
{
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
if(!SceneAppFramework::Init(width,height))
return(false);
render_list=new RenderList(device);
if(!InitMDP())
return(false);
CreateRenderObject();
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32 index)
{
render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
void Resize(int w,int h)override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
return RunApp<TestApp>(1280,720);
}

View File

@@ -0,0 +1,204 @@
// RayPicking
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
using namespace hgl;
using namespace hgl::graph;
static float position_data[2][3]=
{
{100,100,100},
{0,0,0}
};
static float lumiance_data[2]={1,1};
static Color4f white_color(1,1,1,1);
static Color4f yellow_color(1,1,0,1);
class TestApp:public SceneAppFramework
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
Material * mtl_plane_grid =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * pipeline_plane_grid =nullptr;
Primitive * prim_plane_grid =nullptr;
Material * mtl_line =nullptr;
MaterialInstance * mi_line =nullptr;
Pipeline * pipeline_line =nullptr;
Primitive * prim_line =nullptr;
VABMap * prim_line_vab_map =nullptr;
Ray ray;
private:
bool InitMaterialAndPipeline()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance2D",Prim::Lines);
cfg.local_to_world=true;
{
cfg.mtl_name="VertexLuminance2D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.position_format=VAT_VEC2;
mtl_plane_grid=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_plane_grid)return(false);
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color);
if(!mi_plane_grid)return(false);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline_plane_grid)return(false);
}
{
cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.position_format=VAT_VEC3;
mtl_line=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_line)return(false);
mi_line=db->CreateMaterialInstance(mtl_line,nullptr,&yellow_color);
if(!mi_line)return(false);
pipeline_line=CreatePipeline(mtl_line,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline_line)
return(false);
}
return(true);
}
Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p)
{
Renderable *ri=db->CreateRenderable(r,mi,p);
if(!ri)
{
LOG_ERROR(OS_TEXT("Create Renderable failed."));
return(nullptr);
}
render_root.CreateSubNode(ri);
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
PrimitiveCreater pc(device,mi_plane_grid->GetVIL());
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(32,32);
pgci.sub_count.Set(8,8);
pgci.lum=128;
pgci.sub_lum=196;
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
}
{
PrimitiveCreater pc(device,mtl_line->GetDefaultVIL());
if(!pc.Init("Line",2))
return(false);
if(!pc.WriteVAB(VAN::Position, VF_V3F,position_data))return(false);
if(!pc.WriteVAB(VAN::Luminance,VF_V1F,lumiance_data))return(false);
prim_line=pc.Create();
prim_line_vab_map=prim_line->GetVABMap(VAN::Position);
}
return(true);
}
bool InitScene()
{
Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
Add(prim_line,mi_line,pipeline_line);
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
SAFE_CLEAR(prim_line);
}
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitMaterialAndPipeline())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32 index) override
{
const CameraInfo *ci=GetCameraInfo();
const ViewportInfo *vi=GetViewportInfo();
ray.Set(GetMouseCoord(),ci,vi); //设置射线查询的屏幕坐标点
const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标
prim_line_vab_map->Write(&pos, //更新VAB上这个点的位置
1); //这里的1代表的数据数量,不是字节数
SceneAppFramework::BuildCommandBuffer(index);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1280,720);
}

View File

@@ -0,0 +1,333 @@
// BlinnPhong direction light
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/mtl/BlinnPhong.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/PrimitiveCreater.h>
using namespace hgl;
using namespace hgl::graph;
static float lumiance_data[2]={1,1};
static Color4f white_color(1,1,1,1);
static mtl::blinnphong::SunLight sun_light=
{
Vector4f(1,1,1,0), //direction
Vector4f(1,0.95,0.9,1) //color
};
constexpr const COLOR AxisColor[4]=
{
//COLOR::Red, //X轴颜色
//COLOR::Green, //Y轴颜色
//COLOR::Blue, //Z轴颜色
COLOR::White, //全局颜色
COLOR::GhostWhite,
COLOR::BlanchedAlmond,
COLOR::AntiqueWhite
};
constexpr const os_char *tex_filename[]=
{
OS_TEXT("eucalyptus-cross-versailles.Tex2D"),
OS_TEXT("tints-ashton-green-stretcher.Tex2D"),
OS_TEXT("worn-clay-cobble-in-desert-stretcher.Tex2D"),
OS_TEXT("plain-grey-sheer.Tex2D"),
};
constexpr const size_t TexCount=sizeof(tex_filename)/sizeof(os_char *);
class TestApp:public SceneAppFramework
{
private: //plane grid
Material * mtl_vertex_lum =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * p_line =nullptr;
Primitive * prim_plane_grid =nullptr;
private:
DeviceBuffer * ubo_sun =nullptr;
Texture2DArray * texture =nullptr;
Sampler * sampler =nullptr;
private: //sphere
Material * mtl_blinnphong =nullptr;
PrimitiveCreater * pc_blinnphong =nullptr;
VertexDataManager * vdm_blinnphong =nullptr;
MaterialInstance * mi_blinnphong[4]{};
Pipeline * p_blinnphong =nullptr;
Primitive * prim_sphere =nullptr;
Primitive * prim_cone =nullptr;
Primitive * prim_cylinder =nullptr;
private:
bool InitTexture()
{
texture=db->CreateTexture2DArray( "SeamlessBackground",
256,256, ///<纹理尺寸
TexCount, ///<纹理层数
PF_BC1_RGBUN, ///<纹理格式
false); ///<是否自动产生mipmaps
if(!texture)return(false);
OSString filename;
for(uint i=0;i<TexCount;i++)
{
filename=filesystem::MergeFilename(OS_TEXT("res/image/seamless"),tex_filename[i]);
if(!db->LoadTexture2DToArray(texture,i,filename))
return(false);
}
return(true);
}
bool InitVertexLumMP()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines);
cfg.local_to_world=true;
mtl_vertex_lum=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_vertex_lum)return(false);
mi_plane_grid=db->CreateMaterialInstance(mtl_vertex_lum,nullptr,&white_color);
if(!mi_plane_grid)return(false);
p_line=CreatePipeline(mtl_vertex_lum,InlinePipeline::Solid3D,Prim::Lines);
if(!p_line)
return(false);
return(true);
}
bool CreateBlinnPhongUBO()
{
ubo_sun=db->CreateUBO("sun",sizeof(sun_light),&sun_light);
if(!ubo_sun)return(false);
return(true);
}
bool InitBlinnPhongSunLightMP()
{
mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"BlinnPhong3D",Prim::Triangles);
cfg.local_to_world=true;
cfg.material_instance=true;
mtl_blinnphong=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColorTexture",&cfg);
if(!mtl_blinnphong)return(false);
mtl_blinnphong->BindUBO(DescriptorSetType::Global,"sun",ubo_sun);
mtl_blinnphong->Update();
sampler=db->CreateSampler();
if(!mtl_blinnphong->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
struct MIData
{
Color4f color;
uint32 tex_id[4];
}mi_data;
constexpr const uint MIDataStride=sizeof(MIData);
for(uint i=0;i<4;i++)
{
mi_data.color=GetColor4f(AxisColor[i],4);
mi_data.tex_id[0]=i;
mi_blinnphong[i]=db->CreateMaterialInstance(mtl_blinnphong, //材质
nullptr, //顶点输入配置,这里使用nullptr即代表会使用默认配置那么结果将等同于上面的mtl_blinnphong->GetDefaultVIL()
&mi_data); //材质实例参数
if(!mi_blinnphong[i])return(false);
}
p_blinnphong=CreatePipeline(mtl_blinnphong,InlinePipeline::Solid3D,Prim::Triangles);
if(!p_blinnphong)
return(false);
return(true);
}
bool InitVDMAndPC()
{
vdm_blinnphong=new VertexDataManager(device,mtl_blinnphong->GetDefaultVIL());
if(!vdm_blinnphong->Init( 1024*1024, //VAB最大容量
1024*1024, //索引最大容量
IndexType::U16)) //索引类型
{
delete vdm_blinnphong;
vdm_blinnphong=nullptr;
return(false);
}
pc_blinnphong=new PrimitiveCreater(vdm_blinnphong);
//pc_blinnphong=new PrimitiveCreater(device,mtl_blinnphong->GetDefaultVIL());
return(true);
}
bool CreateRenderObject()
{
using namespace inline_geometry;
//Plane Grid
//{
// struct PlaneGridCreateInfo pgci;
// pgci.grid_size.Set(32,32);
// pgci.sub_count.Set(8,8);
// pgci.lum=0.5;
// pgci.sub_lum=0.75;
// prim_plane_grid=CreatePlaneGrid(pc_blinnphong,mtl_vertex_lum->GetDefaultVIL(),&pgci);
//}
//Sphere
prim_sphere=CreateSphere(pc_blinnphong,16);
//Cone
{
struct ConeCreateInfo cci;
cci.radius =1; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=8; //圆锥高度分割数
prim_cone=CreateCone(pc_blinnphong,&cci);
}
//Cyliner
{
struct CylinderCreateInfo cci;
cci.halfExtend =1.25; //圆柱一半高度
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1.25f; //圆柱半径
prim_cylinder=CreateCylinder(pc_blinnphong,&cci);
}
return(true);
}
Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p,const Matrix4f &mat=Identity4f)
{
if(!r)
return(nullptr);
if(!mi)
return(nullptr);
if(!p)
return(nullptr);
Renderable *ri=db->CreateRenderable(r,mi,p);
if(!ri)
{
LOG_ERROR("Create Renderable failed! Primitive: "+r->GetName());
return(nullptr);
}
render_root.CreateSubNode(mat,ri);
return ri;
}
bool InitScene()
{
//Add(prim_plane_grid,mi_plane_grid,p_line,Identity4f);
Add(prim_sphere, mi_blinnphong[0],p_blinnphong,translate(Vector3f(0,0,2)));
Add(prim_cone, mi_blinnphong[1],p_blinnphong);
Add(prim_cylinder, mi_blinnphong[2],p_blinnphong,translate(Vector3f(0,0,-5)));
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitTexture())
return(false);
//if(!InitVertexLumMP())
// return(false);
if(!CreateBlinnPhongUBO())
return(false);
if(!InitBlinnPhongSunLightMP())
return(false);
if(!InitVDMAndPC())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
~TestApp()
{
SAFE_CLEAR(prim_cone)
SAFE_CLEAR(prim_cylinder)
SAFE_CLEAR(prim_sphere)
SAFE_CLEAR(prim_plane_grid)
SAFE_CLEAR(pc_blinnphong)
SAFE_CLEAR(vdm_blinnphong)
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1280,720);
}

View File

@@ -0,0 +1,13 @@
macro(CreateProject name)
add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK})
target_link_libraries(${name} ${ULRE})
IF(MSVC)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
set_property(TARGET ${name} PROPERTY VS_DPI_AWARE "PerMonitor")
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Light Basic")
endmacro()
CreateProject(01_BlinnPhongDirectionLight BlinnPhongDirectionLight.cpp)

View File

@@ -1,126 +0,0 @@
#include<hgl/shadergen/MaterialCreateInfo.h>
using namespace hgl;
using namespace hgl::graph;
using namespace hgl::shadergen;
bool PureColor2DMaterial()
{
MaterialCreateInfo mc("PureColor2D",1,false); //一个新材质1个RT输出默认使用Vertex/Fragment shader
//vertex部分
{
ShaderCreateInfoVertex *vsc=mc.GetVS(); //获取vertex shader creater
//以下代码会被展开为
/*
layout(location=?) in vec3 Position; //位置属性
*/
vsc->AddInput("vec2","Position"); //添加一个vec3类型的position属性输入
vsc->SetShaderCodes(R"(
void main()
{
gl_Position=vec4(Position,0,1);
})");
}
//添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性
//该代码会被展开为
/*
struct ColorMaterial
{
vec4 color;
};
*/
mc.AddStruct("ColorMaterial","vec4 color;");
//添加一个UBO该代码会被展开为
/*
layout(set=?,binding=?) uniform ColorMaterial mtl;
*/
mc.AddUBO( VK_SHADER_STAGE_FRAGMENT_BIT, //这个UBO出现在fragment shader
DescriptorSetType::PerMaterial, //它属于材质合集
"ColorMaterial", //UBO名称为ColorMaterial
"mtl"); //UBO变量名称为mtl
//fragment部分
{
ShaderCreateInfoFragment *fsc=mc.GetFS(); //获取fragment shader creater
//以下代码会被展开为
/*
layout(location=?) out vec4 Color; //颜色输出
*/
fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出
fsc->SetShaderCodes(R"(
void main()
{
Color=mtl.color;
})");
}
mc.CreateShader();
return(true);
}
bool VertexColor2DMaterial()
{
MaterialCreateInfo mc("VertexColor2D",1,false);
//vertex部分
{
ShaderCreateInfoVertex *vsc=mc.GetVS();
vsc->AddInput("vec2","Position");
vsc->AddInput("vec4","Color");
vsc->AddOutput("vec4","Color");
vsc->SetShaderCodes(R"(
void main()
{
Output.Color=Color;
gl_Position=vec4(Position,0,1);
})");
}
//fragment部分
{
ShaderCreateInfoFragment *fsc=mc.GetFS();
fsc->AddOutput("vec4","Color");
fsc->SetShaderCodes(R"(
void main()
{
Color=Input.Color;
})");
}
mc.CreateShader();
return(true);
}
namespace glsl_compiler
{
bool Init();
void Close();
}//namespace glsl_compiler
int main()
{
if(!glsl_compiler::Init())
return -1;
PureColor2DMaterial();
VertexColor2DMaterial();
glsl_compiler::Close();
return 0;
}

View File

@@ -9,32 +9,6 @@ using namespace hgl::graph;
VK_NAMESPACE_USING;
constexpr char *texture_compress_name[]=
{
"NONE",
"S3TC",
"PVRTC",
"ETC1",
"ETC2",
"EAC",
"ATC",
"ASTC",
"YUV"
};
constexpr char *data_type_name[]
{
"NONE",
"UNORM",
"SNORM",
"USCALED",
"SSCALED",
"UINT",
"SINT",
"UFLOAT",
"SFLOAT",
"SRGB"
};//
VulkanInstance *InitVulkanInstance()
{
@@ -92,14 +66,14 @@ int main(int,char **)
std::cout<<"Format [ID:"<<std::setw(10)<<vf->format<<"]["<<std::setw(16)<<vf->name<<"]";
if(vf->depth!=VulkanBaseType::NONE)
std::cout<<"[ Depth:"<<std::setw(8)<<data_type_name[size_t(vf->depth)]<<"]";
std::cout<<"[ Depth:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->depth)]<<"]";
if(vf->stencil!=VulkanBaseType::NONE)
std::cout<<"[Stencil:"<<std::setw(8)<<data_type_name[size_t(vf->stencil)]<<"]";
std::cout<<"[Stencil:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->stencil)]<<"]";
if((vf->depth==VulkanBaseType::NONE)
&&(vf->stencil==VulkanBaseType::NONE))
std::cout<<"[ Color:"<<std::setw(8)<<data_type_name[size_t(vf->color)]<<"]";
std::cout<<"[ Color:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->color)]<<"]";
{
const VkFormatProperties fp=physical_device->GetFormatProperties(vf->format);
@@ -114,7 +88,7 @@ int main(int,char **)
}
if(vf->compress_type!=TextureCompressType::NONE)
std::cout<<" use "<<texture_compress_name[size_t(vf->compress_type)]<<" compress.";
std::cout<<" use "<<TextureCompressTypeName[size_t(vf->compress_type)]<<" compress.";
else
std::cout<<std::setw(4)<<vf->bytes<<" bytes/pixel.";

View File

@@ -4,8 +4,8 @@
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
using namespace hgl;
@@ -56,9 +56,7 @@ private:
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureTexture2D(&cfg);
material=db->CreateMaterial(mci);
material=db->LoadMaterial("Std2D/PureTexture2D",&cfg);
if(!material)
return(false);
@@ -75,7 +73,7 @@ private:
sampler=db->CreateSampler();
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::Color, ///<采样器名称
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
@@ -87,12 +85,14 @@ private:
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Quad",VERTEX_COUNT);
if(!rpc.SetVBO(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.SetVBO(VAN::TexCoord, VF_V2F, tex_coord_data))return(false);
if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord, VF_V2F, tex_coord_data))return(false);
render_obj=rpc.Create(material_instance,pipeline);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
return(render_obj);
}
@@ -114,7 +114,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -4,8 +4,8 @@
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
using namespace hgl;
@@ -52,9 +52,7 @@ private:
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateRectTexture2D(&cfg);
material=db->CreateMaterial(mci);
material=db->LoadMaterial("Std2D/RectTexture2D",&cfg);
if(!material)
return(false);
@@ -71,7 +69,7 @@ private:
sampler=db->CreateSampler();
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::Color, ///<采样器名称
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
@@ -83,12 +81,14 @@ private:
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,1);
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Rectangle",1);
if(!rpc.SetVBO(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.SetVBO(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
if(!rpc.WriteVAB(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
render_obj=rpc.Create(material_instance,pipeline);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
return(render_obj);
}
@@ -110,7 +110,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -4,8 +4,8 @@
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/Material2DCreateConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
#include<hgl/filesystem/Filename.h>
@@ -56,6 +56,7 @@ private:
Pipeline * pipeline =nullptr;
DeviceBuffer * tex_id_ubo =nullptr;
Primitive * prim_rectangle =nullptr;
struct
{
@@ -67,7 +68,8 @@ private:
bool InitTexture()
{
texture=db->CreateTexture2DArray( 512,512, ///<纹理尺寸
texture=db->CreateTexture2DArray( "freepik icons",
512,512, ///<纹理尺寸
TexCount, ///<纹理层数
PF_BC1_RGBAUN, ///<纹理格式
false); ///<是否自动产生mipmaps
@@ -94,9 +96,7 @@ private:
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
cfg.local_to_world=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateRectTexture2DArray(&cfg);
material=db->CreateMaterial(mci);
material=db->LoadMaterial("Std2D/RectTexture2DArray",&cfg);
if(!material)
return(false);
@@ -109,7 +109,7 @@ private:
sampler=db->CreateSampler();
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::Color, ///<采样器名称
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
@@ -129,18 +129,22 @@ private:
bool InitVBOAndRenderList()
{
RenderablePrimitiveCreater rpc(db,1);
PrimitiveCreater rpc(device,material->GetDefaultVIL());
rpc.Init("Rectangle",1);
position_data[2]=1.0f/float(TexCount);
if(!rpc.SetVBO(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.SetVBO(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
if(!rpc.WriteVAB(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
prim_rectangle=rpc.Create();
Vector3f offset(1.0f/float(TexCount),0,0);
for(uint32_t i=0;i<TexCount;i++)
{
render_obj[i].r=rpc.Create(render_obj[i].mi,pipeline);
render_obj[i].r=db->CreateRenderable(prim_rectangle,render_obj[i].mi,pipeline);
if(!render_obj[i].r)
return(false);
@@ -161,6 +165,7 @@ public:
~TestApp()
{
SAFE_CLEAR(prim_rectangle);
SAFE_CLEAR(render_list);
}
@@ -185,7 +190,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);

View File

@@ -1,191 +0,0 @@
// 18.RayPicking
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
static float position_data[2][3]=
{
{100,100,100},
{0,0,0}
};
static float color_data[2][4]=
{
{1,1,0,1},
{1,1,0,1}
};
class TestApp:public CameraAppFramework
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
SceneNode render_root;
RenderList * render_list =nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane_grid =nullptr;
Primitive * ro_line =nullptr;
VBO * vbo_pos =nullptr;
Ray ray;
private:
bool InitMDP()
{
material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
if(!material)return(false);
material_instance=db->CreateMaterialInstance(material);
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline)
return(false);
return(true);
}
Renderable *Add(Primitive *r,const Matrix4f &mat)
{
Renderable *ri=db->CreateRenderable(r,material_instance,pipeline);
render_root.CreateSubNode(mat,ri);
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
struct PlaneGridCreateInfo pgci;
pgci.coord[0]=Vector3f(-100,-100,0);
pgci.coord[1]=Vector3f( 100,-100,0);
pgci.coord[2]=Vector3f( 100, 100,0);
pgci.coord[3]=Vector3f(-100, 100,0);
pgci.step.x=32;
pgci.step.y=32;
pgci.side_step.x=8;
pgci.side_step.y=8;
pgci.color.Set(0.25,0,0,1);
pgci.side_color.Set(1,0,0,1);
const VIL *vil=material_instance->GetVIL();
ro_plane_grid=CreatePlaneGrid(db,vil,&pgci);
}
{
ro_line=db->CreatePrimitive(2);
if(!ro_line)return(false);
if(!ro_line->Set(VAN::Position, vbo_pos=db->CreateVBO(VF_V3F,2,position_data )))return(false);
if(!ro_line->Set(VAN::Color, db->CreateVBO(VF_V4F,2,color_data )))return(false);
}
return(true);
}
bool InitScene()
{
Add(ro_plane_grid,Matrix4f(1.0f));
Add(ro_line,Matrix4f(1.0f));
camera->pos=Vector3f(100,100,50);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
render_list=new RenderList(device);
if(!InitMDP())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32 index)
{
const CameraInfo &ci=GetCameraInfo();
ray.Set(GetMouseCoord(),&ci); //设置射线查询的屏幕坐标点
const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标
vbo_pos->Write(&pos,3*sizeof(float)); //更新VBO上这个点的位置
render_root.RefreshMatrix();
render_list->Expend(ci,&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
void Resize(int w,int h)override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@@ -19,6 +19,9 @@
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VKRenderResource.h>
#ifdef _DEBUG
#include<hgl/graph/VKDeviceAttribute.h>
#endif//_DEBUG
#include<hgl/graph/RenderList.h>
#include<hgl/graph/mtl/UBOCommon.h>
#include<hgl/color/Color.h>
@@ -73,6 +76,14 @@ protected:
public:
virtual void BindRenderResource(RenderResource *rr)
{
if(!rr)
return;
rr->static_descriptor.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info);
}
virtual ~VulkanApplicationFramework()
{
CloseShaderCompiler();
@@ -80,21 +91,21 @@ public:
win->Unjoin(this);
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
SAFE_CLEAR(device);
SAFE_CLEAR(win);
SAFE_CLEAR(inst);
}
virtual bool Init(int w,int h)
virtual bool Init(uint w,uint h)
{
logger::InitLogger(OS_TEXT("VulkanTest"));
if(!InitShaderCompiler())
return(false);
clear_color.Set(0,0,0,1);
SetClearColor(COLOR::MozillaCharcoal);
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
@@ -126,10 +137,16 @@ public:
return(false);
}
device=CreateRenderDevice(inst,win);
{
VulkanHardwareRequirement vh_req;
if(!device)
return(false);
vh_req.wideLines=VulkanHardwareRequirement::SupportLevel::Want;
device=CreateRenderDevice(inst,win,&vh_req);
if(!device)
return(false);
}
device_render_pass=device->GetRenderPass();
@@ -142,20 +159,30 @@ public:
{
vp_info.Set(w,h);
ubo_vp_info=db->CreateUBO(sizeof(ViewportInfo),&vp_info);
db->global_descriptor.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info);
ubo_vp_info=db->CreateUBO("Viewport",sizeof(ViewportInfo),&vp_info);
}
BindRenderResource(db);
return(true);
}
virtual void Resize(int w,int h)
virtual void Resize(uint w,uint h)
{
vp_info.Set(w,h);
ubo_vp_info->Write(&vp_info);
}
ViewportInfo *GetViewportInfo()
{
return &vp_info;
}
DeviceBuffer *GetViewportInfoBuffer()
{
return ubo_vp_info;
}
void SetClearColor(const Color4f &cc)
{
clear_color=cc;
@@ -178,7 +205,7 @@ public:
void InitCommandBuffer()
{
if(cmd_buf)
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
sc_render_target=device->GetSwapchainRT();
@@ -189,7 +216,7 @@ public:
cmd_buf=hgl_zero_new<RenderCmdBuffer *>(swap_chain_count);
for(int32_t i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateRenderCommandBuffer();
cmd_buf[i]=device->CreateRenderCommandBuffer(device->GetPhysicalDevice()->GetDeviceName()+AnsiString(":RenderCmdBuffer_")+AnsiString::numberOf(i));
}
}
@@ -197,21 +224,14 @@ public:
{
if(!ri)return(false);
const VertexInputData *vid=ri->GetVertexInputData();
cb->Begin();
cb->BindFramebuffer(rp,fb);
cb->SetClearColor(0,clear_color);
cb->BeginRenderPass();
cb->BindPipeline(ri->GetPipeline());
cb->BindDescriptorSets(ri->GetMaterial());
cb->BindVBO(ri);
if (vid->index_buffer->buffer)
cb->DrawIndexed(vid->index_buffer->buffer->GetCount());
else
cb->Draw(vid->vertex_count);
cb->BindDataBuffer(ri->GetDataBuffer());
cb->Draw(ri->GetDataBuffer(),ri->GetRenderData());
cb->EndRenderPass();
cb->End();
@@ -277,7 +297,22 @@ public:
}
template<typename ...ARGS>
Pipeline *CreatePipeline(ARGS...args){return device_render_pass->CreatePipeline(args...);}
Pipeline *CreatePipeline(ARGS...args)
{
Pipeline *p=device_render_pass->CreatePipeline(args...);
if(!p)
return(nullptr);
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
du->SetPipeline(*p,"Pipeline:"+p->GetName());
#endif//_DEBUG
return p;
}
public:
@@ -368,7 +403,7 @@ class CameraMouseControl:public MouseEvent
Vector2f mouse_pos;
Vector2f mouse_last_pos;
protected:
protected:
bool OnPressed(int x,int y,MouseButton) override
{
@@ -426,6 +461,7 @@ public:
{
camera=wc;
cur_time=0;
last_time=0;
}
const Vector2f &GetMouseCoord()const{return mouse_pos;}
@@ -438,7 +474,6 @@ public:
class CameraAppFramework:public VulkanApplicationFramework
{
protected:
Camera * camera =nullptr;
@@ -454,6 +489,15 @@ protected:
public:
virtual void BindRenderResource(RenderResource *rr) override
{
if(!rr)return;
VulkanApplicationFramework::BindRenderResource(rr);
rr->global_descriptor.AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info);
}
virtual ~CameraAppFramework()
{
SAFE_CLEAR(ckc);
@@ -461,17 +505,23 @@ public:
SAFE_CLEAR(camera);
}
virtual bool Init(int w,int h)
virtual bool Init(uint w,uint h) override
{
if(!VulkanApplicationFramework::Init(w,h))
return(false);
InitCamera(w,h);
BindRenderResource(db);
return(true);
}
virtual void InitCamera(int w,int h)
{
camera=new Camera;
camera->pos=Vector3f(10,10,10);
camera_control=new FirstPersonCameraControl(&vp_info,camera);
camera_control->Refresh(); //更新矩阵计算
@@ -482,25 +532,21 @@ public:
win->Join(ckc);
win->Join(cmc);
camera=new Camera;
camera->pos=Vector3f(10,10,10);
RefreshCameraInfo(&camera_control->GetCameraInfo(),&vp_info,camera);
RefreshCameraInfo(camera_control->GetCameraInfo(),&vp_info,camera);
ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&camera_control->GetCameraInfo());
ubo_camera_info=db->CreateUBO("CameraInfo",sizeof(CameraInfo),camera_control->GetCameraInfo());
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
vp_info.Set(w,h);
camera_control->Refresh();
ubo_camera_info->Write(&camera_control->GetCameraInfo());
ubo_camera_info->Write(camera_control->GetCameraInfo());
}
const CameraInfo &GetCameraInfo()
CameraInfo *GetCameraInfo()
{
return camera_control->GetCameraInfo();
}
@@ -510,18 +556,13 @@ public:
return ubo_camera_info;
}
bool BindCameraUBO(Material *mtl)
{
return mtl->BindUBO(DescriptorSetType::Global,"g_camera",ubo_camera_info);
}
virtual void BuildCommandBuffer(uint32_t index)=0;
virtual void Draw()override
{
camera_control->Refresh(); //更新相机矩阵
ubo_camera_info->Write(&camera_control->GetCameraInfo()); //写入缓冲区
ubo_camera_info->Write(camera_control->GetCameraInfo()); //写入缓冲区
const uint32_t index=AcquireNextImage();
@@ -532,4 +573,55 @@ public:
ckc->Update();
cmc->Update();
}
};//class CameraAppFramework
};//class CameraAppFramework
class SceneAppFramework:public CameraAppFramework
{
protected:
SceneNode render_root;
RenderList * render_list =nullptr;
public:
SceneAppFramework()=default;
virtual ~SceneAppFramework()
{
SAFE_CLEAR(render_list);
}
virtual bool Init(uint width,uint height) override
{
if(!CameraAppFramework::Init(width,height))
return(false);
render_list=new RenderList(device);
return(true);
}
virtual void BuildCommandBuffer(uint32 index) override
{
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
virtual void Resize(uint w,uint h) override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class SceneAppFramework:public CameraAppFramework
template<typename T> int RunApp(uint w,uint h)
{
T app;
if(!app.Init(w,h))
return(-1);
while(app.Run());
return 0;
}

View File

@@ -7,7 +7,7 @@ namespace hgl
namespace graph
{
/**
* 2Dλͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2D位图加载类
*/
class Bitmap2DLoader:public Texture2DLoader
{
@@ -20,7 +20,7 @@ namespace hgl
Bitmap2DLoader():Texture2DLoader(){}
~Bitmap2DLoader();
void *OnBegin(uint32 total_bytes) override;
void *OnBegin(uint32 total_bytes,const VkFormat &) override;
bool OnEnd() override {return(false);}
BitmapData *GetBitmap();

View File

@@ -4,12 +4,15 @@
#include<hgl/graph/VK.h>
#include<hgl/math/Vector.h>
#include<hgl/type/RectScope.h>
#include<hgl/type/Size2.h>
#include<hgl/color/Color4f.h>
#include<hgl/graph/AABB.h>
namespace hgl
{
namespace graph
{
class PrimitiveCreater;
namespace inline_geometry
{
/**
@@ -20,12 +23,12 @@ namespace hgl
RectScope2f scope;
};//struct RectangleCreateInfo
Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci);
Primitive *CreateRectangle(PrimitiveCreater *pc,const RectangleCreateInfo *rci);
/**
* 创建延迟渲染用全屏平面
*/
Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil);
Primitive *CreateGBufferCompositionRectangle(PrimitiveCreater *pc);
/**
* 圆角矩形创建信息(扇形/线圈)
@@ -36,7 +39,7 @@ namespace hgl
uint32_t round_per; ///<圆角精度
};//struct RoundRectangleCreateInfo:public RectangleCreateInfo
Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci);
Primitive *CreateRoundRectangle(PrimitiveCreater *pc,const RoundRectangleCreateInfo *rci);
/**
* 圆形创建信息
@@ -45,9 +48,9 @@ namespace hgl
{
Vector2f center; ///<圆心坐标
Vector2f radius; ///<半径
uint field_count=8; ///<分段
uint field_count=8; ///<分段数
bool has_color =false;
bool has_center; ///<是否有圆心点
Vector4f center_color; ///<圆心颜色
Vector4f border_color; ///<边缘颜色
@@ -56,44 +59,43 @@ namespace hgl
/**
* 创建一个2D圆形(扇形/线圈)
*/
Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci);
Primitive *CreateCircle2D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 平面网格创建信息
* 创建一个使用三角形绘制的3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3DByIndexTriangles(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 平面网格创建信息<br>
* 会创建一个在XY平面上居中的网格单个格子尺寸为1。
*/
struct PlaneGridCreateInfo
{
Vector3f coord[4];
Vector2u step;
Size2u grid_size; ///<格子数量
Vector2u side_step; //到边界的步数
Size2u sub_count; ///<细分格子数量
Color4f color; //一般线条颜色
Color4f side_color; //边界线条颜色
uint8 lum; ///<一般线条亮度
uint8 sub_lum; ///<细分及边界线条亮度
};//struct PlaneGridCreateInfo
/**
* 创建一个平面网格(线条)
*/
Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci);
Primitive *CreatePlaneGrid2D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci); //创建一个平面网格(线条)
struct PlaneCreateInfo
{
Vector2f tile;
public:
PlaneCreateInfo()
{
tile.x=1.0f;
tile.y=1.0f;
}
};//struct PlaneCreateInfo
Primitive *CreatePlaneGrid3D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci);
/**
* 创建一个平面(三角形)
* 创建一个平面正方形(三角形)
*/
Primitive *CreatePlane(RenderResource *db,const VIL *vil,const PlaneCreateInfo *pci);
Primitive *CreatePlaneSqaure(PrimitiveCreater *pc);
struct CubeCreateInfo
{
@@ -129,7 +131,7 @@ namespace hgl
/**
* 创建一个立方体(三角形)
*/
Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci);
Primitive *CreateCube(PrimitiveCreater *pc,const CubeCreateInfo *cci);
struct BoundingBoxCreateInfo
{
@@ -160,17 +162,17 @@ namespace hgl
/**
* 创建一个绑定盒(线条)
*/
Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci);
Primitive *CreateBoundingBox(PrimitiveCreater *pc,const BoundingBoxCreateInfo *cci);
/**
* 创建一个球心坐标为0,0,0半径为1的球体(三角形)
*/
Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices);
Primitive *CreateSphere(PrimitiveCreater *,const uint numberSlices);
/**
* 创建一个穹顶(三角形)
*/
Primitive *CreateDome(RenderResource *db,const VIL *vil, const uint numberSlices);
Primitive *CreateDome(PrimitiveCreater *pc, const uint numberSlices);
struct TorusCreateInfo
{
@@ -186,7 +188,7 @@ namespace hgl
/**
* 创建一个圆环(三角形)
*/
Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci);
Primitive *CreateTorus(PrimitiveCreater *pc,const TorusCreateInfo *tci);
struct CylinderCreateInfo
{
@@ -198,7 +200,7 @@ namespace hgl
/**
* 创建一个圆柱(三角形)
*/
Primitive *CreateCylinder(RenderResource *db,const VIL *vil,const CylinderCreateInfo *cci);
Primitive *CreateCylinder(PrimitiveCreater *,const CylinderCreateInfo *cci);
struct ConeCreateInfo
{
@@ -211,7 +213,7 @@ namespace hgl
/**
* 创建一个圆锥(三角形)
*/
Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci);
Primitive *CreateCone(PrimitiveCreater *,const ConeCreateInfo *cci);
struct AxisCreateInfo
{
@@ -232,7 +234,7 @@ namespace hgl
/**
* 创建一个坐标线(线条)
*/
Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci);
Primitive *CreateAxis(PrimitiveCreater *pc,const AxisCreateInfo *aci);
}//namespace inline_geometry
}//namespace graph
};//namespace hgl

View File

@@ -2,7 +2,7 @@
#define HGL_GRAPH_LIGHT_INCLUDE
#include<hgl/math/Math.h>
#include<hgl/type/Color4f.h>
#include<hgl/color/Color4f.h>
namespace hgl
{
namespace graph

View File

@@ -1,9 +1,13 @@
#pragma once
#include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKVBOList.h>
#include<hgl/graph/VKVABList.h>
#include<hgl/type/SortedSets.h>
#include<hgl/graph/VKIndirectCommandBuffer.h>
VK_NAMESPACE_BEGIN
class RenderAssignBuffer;
class SceneNode;
struct CameraInfo;
/**
* 同一材质的对象渲染列表
@@ -13,55 +17,74 @@ class MaterialRenderList
GPUDevice *device;
RenderCmdBuffer *cmd_buf;
Material *mtl;
Material *material;
CameraInfo *camera_info;
RenderNodeList rn_list;
RenderNodePointerList rn_update_l2w_list;
private:
RenderAssignBuffer *assign_buffer;
struct RenderItem
{
uint32_t first;
uint32_t count;
uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB)
uint32_t instance_count;
Pipeline * pipeline;
MaterialInstance * mi;
const VertexInputData * vid;
Pipeline * pipeline;
MaterialInstance * mi;
const PrimitiveDataBuffer * pdb;
const PrimitiveRenderData * prd;
public:
void Set(Renderable *);
};
MaterialInstanceSets mi_set;
IndirectDrawBuffer *icb_draw;
IndirectDrawIndexedBuffer *icb_draw_indexed;
void ReallocICB();
void WriteICB(VkDrawIndirectCommand *,RenderItem *ri);
void WriteICB(VkDrawIndexedIndirectCommand *,RenderItem *ri);
DataArray<RenderItem> ri_array;
uint ri_count;
void StatMI();
void Stat();
protected:
VBOList * vbo_list;
VABList * vab_list;
const VIL * last_vil;
Pipeline * last_pipeline;
const VertexInputData * last_vid;
uint last_index;
Pipeline * last_pipeline;
const PrimitiveDataBuffer * last_data_buffer;
const VDM * last_vdm;
const PrimitiveRenderData * last_render_data;
void Bind(MaterialInstance *);
bool Bind(const VertexInputData *,const uint);
int first_indirect_draw_index=-1;
uint indirect_draw_count=0;
bool BindVAB(const PrimitiveDataBuffer *,const uint);
void ProcIndirectRender();
void Render(RenderItem *);
public:
MaterialRenderList(GPUDevice *d,Material *m);
MaterialRenderList(GPUDevice *d,bool l2w,Material *m);
~MaterialRenderList();
void Add(Renderable *ri,const Matrix4f &mat);
void Add(SceneNode *);
void SetCameraInfo(CameraInfo *ci)
{
camera_info=ci;
}
void Clear()
{
@@ -71,5 +94,7 @@ public:
void End();
void Render(RenderCmdBuffer *);
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
};//class MaterialRenderList
VK_NAMESPACE_END

View File

@@ -9,10 +9,13 @@ public:
MaterialRenderMap()=default;
virtual ~MaterialRenderMap()=default;
void Begin()
void Begin(CameraInfo *ci)
{
for(auto *it:data_list)
{
it->value->SetCameraInfo(ci);
it->value->Clear();
}
}
void End()
@@ -28,5 +31,11 @@ public:
for(auto *it:data_list)
it->value->Render(rcb);
}
void UpdateLocalToWorld()
{
for(auto *it:data_list)
it->value->UpdateLocalToWorld();
}
};//class MaterialRenderMap
VK_NAMESPACE_END

View File

@@ -1,85 +1,81 @@
#ifndef HGL_GRAPH_PRIMITIVE_CREATER_INCLUDE
#define HGL_GRAPH_PRIMITIVE_CREATER_INCLUDE
#pragma once
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VertexAttribDataAccess.h>
#include<hgl/graph/VKBufferMap.h>
#include<hgl/graph/VKShaderModule.h>
namespace hgl
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/VKIndexBuffer.h>
VK_NAMESPACE_BEGIN
/**
* 可绘制原始图形创建器
*/
class PrimitiveCreater
{
namespace graph
{
/**
* 可绘制图元创建器
*/
class PrimitiveCreater
{
struct PrimitiveVertexBuffer
{
AnsiString name;
uint binding;
VAD * data =nullptr;
VBO * vbo =nullptr;
protected:
public:
GPUDevice * device;
VertexDataManager * vdm;
~PrimitiveVertexBuffer()
{
SAFE_CLEAR(data);
}
};//struct PrimitiveVertexBuffer
const VIL * vil;
using PVBMap=ObjectMap<AnsiString,PrimitiveVertexBuffer>;
protected:
protected:
AnsiString prim_name;
PrimitiveData * prim_data;
RenderResource *db;
Material *mtl;
uint32_t vertices_number; ///<顶点数量
const VIL *vil;
bool has_index; ///<是否有索引
uint32_t index_number; ///<索引数量
IndexType index_type; ///<索引类型
IndexBuffer * ibo; ///<索引缓冲区
protected:
protected:
const int InitVAB(const AnsiString &name,const VkFormat format,const void *data); ///<取得顶点属性索引
uint32 vertices_number;
public:
IndexBuffer * ibo;
PVBMap vbo_map;
PrimitiveCreater(GPUDevice *,const VIL *);
PrimitiveCreater(VertexDataManager *);
virtual ~PrimitiveCreater();
public:
/**
* 初始化一个原始图形创建
* @parama name 原始图形名称
* @parama vertices_count 顶点数量
* @parama index_count 索引数量
* @parama it 索引类型(注当使用VDM时此值无效)
*/
bool Init(const AnsiString &name,
const uint32_t vertices_count,
const uint32_t index_count=0,IndexType it=IndexType::AUTO);
PrimitiveCreater(RenderResource *sdb,const VIL *);
virtual ~PrimitiveCreater()=default;
void Clear(); ///<清除创建器数据
virtual bool Init(const uint32 vertices_count); ///<初始化,参数为顶点数量
public: //顶点缓冲区
VAD * CreateVAD(const AnsiString &name); ///<创建一个顶点属性缓冲区
const uint32_t GetVertexCount()const{ return vertices_number; } ///<取得顶点数量
template<typename T>
T * AccessVAD(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器
{
const VkFormat format=vil->GetVulkanFormat(name);
VABMap * GetVABMap (const AnsiString &name,const VkFormat format=VK_FORMAT_UNDEFINED);
if(format!=T::GetVulkanFormat())
return(nullptr);
bool WriteVAB (const AnsiString &name,const VkFormat format,const void *data); ///<直接写入顶点属性数据
VAD *vad=this->CreateVAD(name);
public: //索引缓冲区
if(!vad)
return(nullptr);
const bool hasIndex()const{return vdm?has_index:index_number>0;} ///<是否有索引缓冲区
const IndexType GetIndexType()const{return index_type;} ///<取得索引类型
const uint32_t GetIndexCount()const{return index_number;} ///<取得索引数量
T *access=T::Create(vad);
IBMap * GetIBMap();
access->Begin();
bool WriteIBO(const void *data,const uint32_t count);
return access;
}
template<typename T>
bool WriteIBO(const T *data){return WriteIBO(data,index_number);}
bool WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes); ///<直接写入顶点属性数据
public: //创建可渲染对象
uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区
uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区
virtual Primitive * Finish(); ///<结束并创建可渲染对象
};//class PrimitiveCreater
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_PRIMITIVE_CREATER_INCLUDE
Primitive * Create(); ///<创建一个可渲染对象,并清除创建器数据
};//class PrimitiveCreater
VK_NAMESPACE_END

View File

@@ -20,6 +20,8 @@ namespace hgl
GPUDevice * device;
CameraInfo * camera_info; ///<相机信息
uint renderable_count; ///<可渲染对象数量
MaterialRenderMap mrl_map; ///<按材质分类的渲染列表
@@ -30,13 +32,16 @@ namespace hgl
public:
RenderList(GPUDevice *);
virtual ~RenderList();
virtual ~RenderList()=default;
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual void Clear(); ///<彻底清理
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
virtual void Clear(); ///<彻底清理
};//class RenderList
}//namespace graph
}//namespace hgl

View File

@@ -8,20 +8,22 @@ namespace hgl
namespace graph
{
class Renderable;
class Material;
class MaterialInstance;
class GPUDevice;
struct VertexInputData;
struct IndexBufferData;
class SceneNode;
struct RenderNode
{
Matrix4f local_to_world;
SceneNode *scene_node;
Renderable *ri;
uint32 l2w_version;
uint32 l2w_index;
Vector3f world_position;
float to_camera_distance;
};
using RenderNodeList=List<RenderNode>;
using RenderNodePointerList=List<RenderNode *>;
using MaterialInstanceSets=SortedSets<MaterialInstance *>; ///<材质实例集合
}//namespace graph

View File

@@ -3,7 +3,6 @@
#include<hgl/type/ObjectList.h>
#include<hgl/graph/SceneOrient.h>
#include<hgl/graph/VK.h>
#include<hgl/graph/AABB.h>
namespace hgl
{
@@ -20,11 +19,7 @@ namespace hgl
AABB BoundingBox; ///<绑定盒
AABB LocalBoundingBox; ///<本地坐标绑定盒
AABB WorldBoundingBox; ///<世界坐标绑定盒
Vector4f Center; ///<中心点
Vector4f LocalCenter; ///<本地坐标中心点
Vector4f WorldCenter; ///<世界坐标中心点
//AABB WorldBoundingBox; ///<世界坐标绑定盒
Renderable *render_obj=nullptr; ///<可渲染实例
@@ -35,21 +30,44 @@ namespace hgl
public:
SceneNode()=default;
SceneNode(SceneNode *);
SceneNode( Renderable *ri ) {render_obj=ri;}
SceneNode(const Matrix4f &mat ):SceneOrient(mat) {}
SceneNode(const Matrix4f &mat, Renderable *ri ):SceneOrient(mat) {render_obj=ri;}
virtual ~SceneNode()=default;
void Clear()
void Clear() override
{
SceneOrient::Clear();
BoundingBox.SetZero();
LocalBoundingBox.SetZero();
SubNode.Clear();
render_obj=nullptr;
}
const bool IsEmpty()const
{
if(render_obj)return(false);
if(SubNode.GetCount())return(false);
return(true);
}
Renderable *GetRenderable(){return render_obj;}
void SetRenderable(Renderable *);
SceneNode *AddSubNode(SceneNode *sn)
{
if(!sn)
return(nullptr);
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode()
{
SceneNode *sn=new SceneNode();
@@ -60,6 +78,9 @@ namespace hgl
SceneNode *CreateSubNode(Renderable *ri)
{
if(!ri)
return(nullptr);
SceneNode *sn=new SceneNode(ri);
SubNode.Add(sn);
@@ -76,26 +97,48 @@ namespace hgl
SceneNode *CreateSubNode(const Matrix4f &mat,Renderable *ri)
{
if(!ri)
return(nullptr);
SceneNode *sn=new SceneNode(mat,ri);
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode(SceneNode *node)
{
if(!node)
return(nullptr);
SceneNode *sn=new SceneNode(node);
SubNode.Add(sn);
return node;
}
SceneNode *CreateSubNode(const Matrix4f &mat,SceneNode *node)
{
if(!node)
return(nullptr);
SceneNode *sn=new SceneNode(mat);
sn->CreateSubNode(node);
SubNode.Add(sn);
return sn;
}
public: //坐标相关方法
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒
virtual void RefreshMatrix (const Matrix4f *mat=nullptr); ///<刷新世界变换矩阵
virtual void RefreshMatrix () override; ///<刷新世界变换
virtual void RefreshBoundingBox (); ///<刷新绑定盒
virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒
virtual const AABB & GetLocalBoundingBox ()const{return LocalBoundingBox;} ///<取得本地坐标绑定盒
virtual const AABB & GetWorldBoundingBox ()const{return WorldBoundingBox;} ///<取得世界坐标绑定盒
virtual const Vector4f & GetCenter ()const{return Center;} ///<取得中心点
virtual const Vector4f & GetLocalCenter ()const{return LocalCenter;} ///<取得本地坐标中心点
virtual const Vector4f & GetWorldCenter ()const{return WorldCenter;} ///<取得世界坐标中心点
// virtual const AABB & GetWorldBoundingBox ()const{return WorldBoundingBox;} ///<取得世界坐标绑定盒
};//class SceneNode
}//namespace graph
}//namespace hgl

View File

@@ -1,47 +1,157 @@
#ifndef HGL_GRAPH_SCENE_ORIENT_INCLUDE
#define HGL_GRAPH_SCENE_ORIENT_INCLUDE
//#include<hgl/type/List.h>
#include<hgl/math/Math.h>
#include<hgl/graph/VK.h>
//#include<hgl/graph/Transform.h>
#include<hgl/math/Transform.h>
namespace hgl
{
namespace graph
{
/**
* 方向定位数据基类
*/
class SceneOrient ///场景定位类
class SceneMatrix :public VersionData<Matrix4f>
{
protected:
//ObjectList<Transform> TransformList;
Matrix4f parent_matrix;
Matrix4f local_matrix;
TransformManager transform_manager;
Matrix4f transform_matrix;
Matrix4f LocalMatrix; ///<当前矩阵
Matrix4f LocalToWorldMatrix; ///<当前到世界矩阵
protected:
Matrix4f InverseLocalMatrix; ///<反向当前矩阵
Matrix4f InverseLocalToWorldMatrix; ///<反向当前到世界矩阵
Matrix4f inverse_local_to_world_matrix; ///<世界到本地矩阵
Matrix4f inverse_transpose_local_to_world_matrix; ///<世界到本地矩阵的转置矩阵
void MakeNewestData(Matrix4f &local_to_world_matrix) override ///<生成最新的数据(需要派生类重载)
{
transform_manager.GetMatrix(transform_matrix);
local_to_world_matrix=parent_matrix*local_matrix*transform_matrix;
inverse_local_to_world_matrix =inverse(local_to_world_matrix);
inverse_transpose_local_to_world_matrix=transpose(inverse_local_to_world_matrix);
}
public:
SceneOrient();
SceneOrient(const Matrix4f &mat);
void Clear()
{
parent_matrix=Identity4f;
local_matrix=Identity4f;
transform_matrix=Identity4f;
UpdateVersion();
}
const Matrix4f &GetLocalMatrix()const{return local_matrix;} ///<取得本地矩阵
const Matrix4f &GetLocalToWorldMatrix(){return GetNewestVersionData();} ///<取得本地到世界矩阵
const Matrix4f &GetInverseLocalToWorldMatrix(){UpdateNewestData();return inverse_local_to_world_matrix;} ///<取得世界到本地矩阵
const Matrix4f &GetInverseTransposeLocalToWorldMatrix() ///<取得世界到本地矩阵的转置矩阵
{
UpdateNewestData();
return inverse_transpose_local_to_world_matrix;
}
TransformManager &GetTransform() { return transform_manager; } ///<取得变换管理器
public:
SceneMatrix():VersionData(Identity4f)
{
Clear();
}
SceneMatrix(SceneMatrix &so):VersionData(so.GetLocalToWorldMatrix())
{
parent_matrix=so.parent_matrix;
local_matrix=so.local_matrix;
transform_manager=so.transform_manager;
transform_matrix=so.transform_matrix;
inverse_local_to_world_matrix=so.inverse_local_to_world_matrix;
inverse_transpose_local_to_world_matrix=so.inverse_transpose_local_to_world_matrix;
UpdateVersion();
}
SceneMatrix(const Matrix4f &mat):VersionData(Identity4f)
{
SetLocalMatrix(mat);
UpdateVersion();
}
void SetLocalMatrix(const Matrix4f &mat)
{
//if (IsNearlyEqual(local_matrix,mat))
if(!hgl_cmp(local_matrix,mat))
return;
local_matrix=mat;
UpdateVersion();
}
void SetParentMatrix(const Matrix4f &pm)
{
//if (IsNearlyEqual(parent_matrix,pm))
if(!hgl_cmp(parent_matrix,pm))
return;
parent_matrix=pm;
UpdateVersion();
}
};//class SceneMatrix
/**
* 方向定位数据基类<br>
* 用于描述一个物体在3D空间中的位置、旋转、缩放等信息。<br>
* 构成说明:<br>
* <ul>
* <li>LocalMatrix 一般用于描述当前节点相对上一级的变换矩阵</li>
* <li>LocalToWorldMatrix 最终用于描述当前节点相对于世界的变换矩阵,在渲染时使用</li>
*
* <li>transform_manager 用于管理当前节点所有的变换情况如果本节点不存在额外变换数量为0。</li>
* </ul>
*
* LocalToWorldMatrix=ParnetMatrix * LocalMatrix * TraansformMatrix<br>
*/
class SceneOrient ///场景定位类
{
protected:
SceneMatrix scene_matrix;
Vector3f WorldPosition;
public:
SceneOrient()=default;
SceneOrient(const SceneOrient &);
SceneOrient(const Matrix4f &);
virtual ~SceneOrient()=default;
Matrix4f & SetLocalMatrix (const Matrix4f &); ///<设定当前节点矩阵
Matrix4f & SetLocalToWorldMatrix (const Matrix4f &); ///<设定当前节点到世界矩阵
virtual void Clear()
{
scene_matrix.Clear();
WorldPosition=ZeroVector3f;
}
const Matrix4f & GetLocalMatrix ()const {return LocalMatrix;}
const Matrix4f & GetLocalToWorldMatrix ()const {return LocalToWorldMatrix;}
const Matrix4f & GetInverseLocalMatrix ()const {return InverseLocalMatrix;}
const Matrix4f & GetInverseLocalToWorldMatrix()const {return InverseLocalToWorldMatrix;}
void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵
void SetParentMatrix (const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵
public:
virtual void RefreshLocalToWorldMatrix (const Matrix4f *); ///<刷新到世界空间矩阵
const uint32 GetLocalToWorldMatrixVersion()const { return scene_matrix.GetNewestVersion(); } ///<取得版本号
const Vector3f & GetWorldPosition() const { return WorldPosition; } ///<取得世界坐标
const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵
TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器
const Matrix4f & GetLocalToWorldMatrix () {return scene_matrix.GetLocalToWorldMatrix();} ///<取得本地到世界矩阵
const Matrix4f & GetInverseLocalToWorldMatrix () {return scene_matrix.GetInverseLocalToWorldMatrix();}
const Matrix4f & GetInverseTransposeLocalToWorldMatrix () {return scene_matrix.GetInverseTransposeLocalToWorldMatrix();}
public:
virtual void RefreshMatrix();
};//class SceneOrient
}//namespace graph
}//namespace hgl

View File

@@ -0,0 +1,25 @@
#pragma once
#include<hgl/graph/VKRenderable.h>
#include<hgl/type/SortedSets.h>
#include<hgl/graph/SceneNode.h>
VK_NAMESPACE_BEGIN
class StaticMesh
{
protected:
SceneNode *root_node;
public:
StaticMesh(SceneNode *);
virtual ~StaticMesh();
// static StaticMesh *CreateNewObject(RenderResource *,SceneNode *);
public:
SceneNode *GetScene(){return root_node;}
};//class StaticMesh
VK_NAMESPACE_END

View File

@@ -85,10 +85,16 @@ namespace hgl
protected:
virtual void *OnBegin(uint32)=0;
virtual void *OnBegin(uint32,const VkFormat &)=0;
virtual bool OnEnd()=0;
virtual void OnError(){}
public:
const TextureFileHeader & GetFileHeader ()const{return file_header;}
const VkFormat & GetTextureFormat()const{return format;}
const uint32 GetZeroMipmapBytes()const{return mipmap_zero_total_bytes;}
public:
TextureLoader()

View File

@@ -25,8 +25,8 @@ constexpr size_t VK_DESCRIPTOR_TYPE_END_RANGE=VK_DESCRIPTOR_TYPE_INPUT_ATTACHMEN
constexpr size_t VK_DESCRIPTOR_TYPE_RANGE_SIZE=VK_DESCRIPTOR_TYPE_END_RANGE-VK_DESCRIPTOR_TYPE_BEGIN_RANGE+1;
#endif//VK_DESCRIPTOR_TYPE_RANGE_SIZE
using CharPointerList=hgl::List<const char *>;
using BindingMapping=Map<uint32_t,int>;
using BindingMap =Map<AnsiString,int>;
using BindingMapArray =BindingMap[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
class VulkanInstance;
class GPUPhysicalDevice;
@@ -54,16 +54,16 @@ class DeviceMemory;
class DeviceBuffer;
struct DeviceBufferData;
struct PrimitiveDataBuffer;
struct PrimitiveRenderData;
class VertexAttribBuffer;
using VBO=VertexAttribBuffer;
using VAB=VertexAttribBuffer;
class IndexBuffer;
struct IndexBufferData
{
IndexBuffer *buffer=nullptr;
VkDeviceSize offset=0;
};
class VABMap;
class IBMap;
class GPUCmdBuffer;
class RenderCmdBuffer;
@@ -78,7 +78,7 @@ class Semaphore;
struct PipelineLayoutData;
class DescriptorSet;
struct ShaderAttribute;
struct VertexInputAttribute;
class ShaderResource;
class ShaderModule;
@@ -97,15 +97,26 @@ class VILConfig;
class VertexInput;
struct VertexInputFormat;
using VIF=VertexInputFormat;
class VertexInputLayout;
using VIL=VertexInputLayout;
class PrimitiveData;
class Primitive;
class Renderable;
class VertexDataManager;
using VDM=VertexDataManager;
class IndirectDrawBuffer;
class IndirectDrawIndexedBuffer;
class IndirectDispatchBuffer;
class RenderResource;
class StaticMesh;
enum class SharingMode
{
Exclusive = 0,
@@ -137,26 +148,25 @@ inline const uint32_t GetMipLevel(const VkExtent3D &ext)
/**
* 索引类型,等同于VkIndexType
*/
enum IndexType:uint
enum IndexType:int
{
AUTO=-1,
U16=0,
U32,
U8=VK_INDEX_TYPE_UINT8_EXT,
ERR=VK_INDEX_TYPE_MAX_ENUM
};
/**
* max-lengths:
*
256 bytes: nvidia,arm
128 bytes: amd,intel,powervr,adreno
*/
struct PushConstant
inline const bool IsIndexType(const IndexType it)
{
Matrix4f local_to_world;
Matrix4f normal;
};
return it>=U16&&it<=U8;
}
constexpr uint32_t MAX_PUSH_CONSTANT_BYTES=sizeof(PushConstant);
//Push Constant max-lengths:
//
// 256 bytes: nvidia,arm
// 128 bytes: amd,intel,powervr,adreno
inline void copy(VkExtent3D &e3d,const VkExtent2D &e2d,const uint32 depth=1)
{

View File

@@ -23,6 +23,7 @@ private:
friend class GPUDevice;
friend class VertexAttribBuffer;
friend class IndexBuffer;
template<typename T> friend class IndirectCommandBuffer;
DeviceBuffer(VkDevice d,const DeviceBufferData &b)
{
@@ -36,16 +37,17 @@ public:
VkBuffer GetBuffer ()const{return buf.buffer;}
DeviceMemory * GetMemory ()const{return buf.memory;}
VkDeviceMemory GetVkMemory ()const{return buf.memory->operator VkDeviceMemory();}
const VkDescriptorBufferInfo * GetBufferInfo ()const{return &buf.info;}
void * Map () {return buf.memory->Map();}
virtual void * Map (VkDeviceSize start,VkDeviceSize size) {return buf.memory->Map(start,size);}
void Unmap () {return buf.memory->Unmap();}
void Flush (VkDeviceSize start,VkDeviceSize size) {return buf.memory->Flush(start,size);}
void Flush (VkDeviceSize size) {return buf.memory->Flush(size);}
virtual void Flush (VkDeviceSize start,VkDeviceSize size) {return buf.memory->Flush(start,size);}
virtual void Flush (VkDeviceSize size) {return buf.memory->Flush(size);}
bool Write (const void *ptr,uint32_t start,uint32_t size) {return buf.memory->Write(ptr,start,size);}
bool Write (const void *ptr,uint32_t size) {return buf.memory->Write(ptr,0,size);}
virtual bool Write (const void *ptr,uint32_t start,uint32_t size) {return buf.memory->Write(ptr,start,size);}
virtual bool Write (const void *ptr,uint32_t size) {return buf.memory->Write(ptr,0,size);}
bool Write (const void *ptr) {return buf.memory->Write(ptr);}
};//class DeviceBuffer
VK_NAMESPACE_END

100
inc/hgl/graph/VKBufferMap.h Normal file
View File

@@ -0,0 +1,100 @@
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/graph/VertexAttribDataAccess.h>
VK_NAMESPACE_BEGIN
template<typename T> class VKBufferMap
{
protected:
T *buffer;
int32_t offset;
uint32_t stride;
uint32_t count;
void *map_ptr;
public:
VKBufferMap()
{
buffer=nullptr;
offset=0;
stride=count=0;
}
virtual ~VKBufferMap()
{
Unmap();
}
void Set(T *buf,const int32_t off,const uint32_t s,const uint32_t c)
{
buffer=buf;
offset=off;
stride=s;
count=c;
map_ptr=nullptr;
}
const int32_t GetOffset ()const{ return offset;}
const uint32_t GetStride ()const{ return stride;}
const uint32_t GetCount ()const{ return count; }
const bool IsValid()const{ return buffer; }
void Clear()
{
Unmap();
buffer=nullptr;
offset=0;
stride=count=0;
}
void *Map()
{
if(map_ptr)
return(map_ptr);
if(!buffer)
return(nullptr);
map_ptr=buffer->Map(offset,count);
return map_ptr;
}
void Unmap()
{
if(buffer&&map_ptr)
{
buffer->Unmap();
map_ptr=nullptr;
}
}
bool Write(const void *data,const uint32_t c)
{
if(!data||c==0||c>count)return(false);
if(!map_ptr)
{
if(!buffer)
return(false);
/*
* 注这里的不管是offset还是c都会走VAB/IndexBuffer的虚拟版本。
* 其中的数据均为单元数据长度而非字节数。
*
* 如果需要传字节数就需要buffer->DeviceBuffer::Write()这样操作
*/
return buffer->Write(data,offset,c);
}
memcpy(map_ptr,data,stride*c);
return(true);
}
};//class VKBufferMap
VK_NAMESPACE_END

View File

@@ -2,7 +2,7 @@
#define HGL_GRAPH_VULKAN_COMMAND_BUFFER_INCLUDE
#include<hgl/graph/VK.h>
#include<hgl/graph/VKVBOList.h>
#include<hgl/graph/VKVABList.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKDescriptorSet.h>
#include<hgl/color/Color4f.h>
@@ -28,11 +28,11 @@ public:
bool End(){return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS);}
#ifdef _DEBUG
void SetDebugName(const UTF8String &);
void BeginRegion(const UTF8String &,const Color4f &);
void SetDebugName(const AnsiString &);
void BeginRegion(const AnsiString &,const Color4f &);
void EndRegion();
#else
void BeginRegion(const UTF8String &,const Color4f &){}
void BeginRegion(const AnsiString &,const Color4f &){}
void EndRegion(){}
#endif//_DEBUG
};//class GPUCmdBuffer
@@ -43,9 +43,7 @@ class RenderCmdBuffer:public GPUCmdBuffer
VkClearValue *clear_values;
VkRect2D render_area;
VkViewport viewport;
float default_line_width;
Framebuffer *fbo;
RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout;
@@ -156,31 +154,33 @@ public:
void PushConstants(const void *data,const uint32_t size) {vkCmdPushConstants(cmd_buf,pipeline_layout,VK_SHADER_STAGE_VERTEX_BIT,0, size,data);}
void PushConstants(const void *data,const uint32_t offset,const uint32_t size) {vkCmdPushConstants(cmd_buf,pipeline_layout,VK_SHADER_STAGE_VERTEX_BIT,offset, size,data);}
void BindVBO(const uint32_t first,const uint32_t count,const VkBuffer *vbo,const VkDeviceSize *offsets)
void BindVAB(const uint32_t first,const uint32_t count,const VkBuffer *vab,const VkDeviceSize *offsets)
{
vkCmdBindVertexBuffers(cmd_buf,first,count,vbo,offsets);
vkCmdBindVertexBuffers(cmd_buf,first,count,vab,offsets);
}
bool BindVBO(VBOList *vbo_list)
bool BindVAB(VABList *vab_list)
{
if(!vbo_list)return(false);
if(!vab_list)return(false);
if(!vbo_list->IsFull())return(false);
if(!vab_list->IsFull())return(false);
vkCmdBindVertexBuffers(cmd_buf,0,vbo_list->binding_count,vbo_list->buffer_list,vbo_list->buffer_offset);
vkCmdBindVertexBuffers(cmd_buf,
0, //first binding
vab_list->vab_count, //binding count
vab_list->vab_list, //buffers
vab_list->vab_offset); //buffer offsets
return(true);
}
void BindIBO(const IndexBufferData *);
void BindIBO(IndexBuffer *,const VkDeviceSize byte_offset=0);
bool BindVBO(Renderable *);
bool BindDataBuffer(const PrimitiveDataBuffer *);
void SetViewport (uint32_t first,uint32_t count,const VkViewport *vp) {vkCmdSetViewport(cmd_buf,first,count,vp);}
void SetScissor (uint32_t first,uint32_t count,const VkRect2D *sci) {vkCmdSetScissor(cmd_buf,first,count,sci);}
void SetLineWidth (float line_width) {vkCmdSetLineWidth(cmd_buf,line_width);}
void SetDepthBias (float constant_factor,float clamp,float slope_factor) {vkCmdSetDepthBias(cmd_buf,constant_factor,clamp,slope_factor);}
void SetDepthBounds (float min_db,float max_db) {vkCmdSetDepthBounds(cmd_buf,min_db,max_db);}
void SetBlendConstants (const float constants[4]) {vkCmdSetBlendConstants(cmd_buf,constants);}
@@ -195,15 +195,26 @@ public: //draw
void DrawIndexed (const uint32_t index_count ) {vkCmdDrawIndexed(cmd_buf,index_count,1,0,0,0);}
void Draw (const uint32_t vertex_count,const uint32_t instance_count) {vkCmdDraw(cmd_buf,vertex_count,instance_count,0,0);}
void DrawIndexed (const uint32_t index_count ,const uint32_t instance_count) {vkCmdDrawIndexed(cmd_buf,index_count,instance_count,0,0,0);}
void DrawIndexed (const uint32_t index_count ,const uint32_t instance_count,const uint32_t firstIndex,const int32_t vertexOffset,const uint32_t firstInstance)
{
vkCmdDrawIndexed(cmd_buf,
index_count,
instance_count,
firstIndex,
vertexOffset,
firstInstance);
}
template<typename ...ARGS> void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
template<typename ...ARGS> void DrawIndexed (ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);}
// template<typename ...ARGS> void Draw (ARGS...args) {vkCmdDraw(cmd_buf,args...);}
// template<typename ...ARGS> void DrawIndexed (ARGS...args) {vkCmdDrawIndexed(cmd_buf,args...);}
void DrawIndirect (VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand ));
void DrawIndexedIndirect(VkBuffer,VkDeviceSize, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand ));
void DrawIndirect (VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndirectCommand )){return DrawIndirect( buf,0,drawCount,stride);}
void DrawIndexedIndirect(VkBuffer buf, uint32_t drawCount,uint32_t stride=sizeof(VkDrawIndexedIndirectCommand )){return DrawIndexedIndirect( buf,0,drawCount,stride);}
void Draw (const PrimitiveDataBuffer *prb,const PrimitiveRenderData *prd,const uint32_t instance_count=1,const uint32_t first_instance=0);
public: //dynamic state
};//class RenderCmdBuffer:public GPUCmdBuffer

View File

@@ -1,86 +0,0 @@
#ifndef HGL_GRAPH_VULKAN_DEBUG_MAKER_INCLUDE
#define HGL_GRAPH_VULKAN_DEBUG_MAKER_INCLUDE
#include<hgl/graph/VK.h>
#include<hgl/color/Color4f.h>
VK_NAMESPACE_BEGIN
struct DebugMakerFunction
{
PFN_vkDebugMarkerSetObjectTagEXT SetObjectTag;
PFN_vkDebugMarkerSetObjectNameEXT SetObjectName;
PFN_vkCmdDebugMarkerBeginEXT Begin;
PFN_vkCmdDebugMarkerEndEXT End;
PFN_vkCmdDebugMarkerInsertEXT Insert;
};//struct DebugMakerFunction
class DebugMaker
{
VkDevice device;
DebugMakerFunction dmf;
protected:
void SetObjectName(uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name);
void SetObjectTag(uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag);
private:
friend DebugMaker *CreateDebugMaker(VkDevice device);
DebugMaker(VkDevice dev,const DebugMakerFunction &f)
{
device=dev;
dmf=f;
}
public:
void Begin(VkCommandBuffer cmdbuffer, const char * pMarkerName, const Color4f &color);
void Insert(VkCommandBuffer cmdbuffer, const char *markerName, const Color4f &color);
void End(VkCommandBuffer cmdBuffer);
#define DEBUG_MAKER_SET_FUNC(type,MNAME) void Set##type(Vk##type obj,const char *name){SetObjectName((uint64_t)obj,VK_DEBUG_REPORT_OBJECT_TYPE_##MNAME##_EXT,name);}
DEBUG_MAKER_SET_FUNC(Instance, INSTANCE)
DEBUG_MAKER_SET_FUNC(PhysicalDevice, PHYSICAL_DEVICE)
DEBUG_MAKER_SET_FUNC(Device, DEVICE)
DEBUG_MAKER_SET_FUNC(Queue, QUEUE)
DEBUG_MAKER_SET_FUNC(Semaphore, SEMAPHORE)
DEBUG_MAKER_SET_FUNC(CommandBuffer, COMMAND_BUFFER)
DEBUG_MAKER_SET_FUNC(Fence, FENCE)
DEBUG_MAKER_SET_FUNC(DeviceMemory, DEVICE_MEMORY)
DEBUG_MAKER_SET_FUNC(Buffer, BUFFER)
DEBUG_MAKER_SET_FUNC(Image, IMAGE)
DEBUG_MAKER_SET_FUNC(Event, EVENT)
DEBUG_MAKER_SET_FUNC(QueryPool, QUERY_POOL)
DEBUG_MAKER_SET_FUNC(BufferView, BUFFER_VIEW)
DEBUG_MAKER_SET_FUNC(ShaderModule, SHADER_MODULE)
DEBUG_MAKER_SET_FUNC(PipelineCache, PIPELINE_CACHE)
DEBUG_MAKER_SET_FUNC(PipelineLayout, PIPELINE_LAYOUT)
DEBUG_MAKER_SET_FUNC(RenderPass, RENDER_PASS)
DEBUG_MAKER_SET_FUNC(Pipeline, PIPELINE)
DEBUG_MAKER_SET_FUNC(DescriptorSetLayout, DESCRIPTOR_SET_LAYOUT)
DEBUG_MAKER_SET_FUNC(Sampler, SAMPLER)
DEBUG_MAKER_SET_FUNC(DescriptorPool, DESCRIPTOR_POOL)
DEBUG_MAKER_SET_FUNC(DescriptorSet, DESCRIPTOR_SET)
DEBUG_MAKER_SET_FUNC(Framebuffer, FRAMEBUFFER)
DEBUG_MAKER_SET_FUNC(CommandPool, COMMAND_POOL)
DEBUG_MAKER_SET_FUNC(SurfaceKHR, SURFACE_KHR)
DEBUG_MAKER_SET_FUNC(SwapchainKHR, SWAPCHAIN_KHR)
DEBUG_MAKER_SET_FUNC(DebugReportCallbackEXT, DEBUG_REPORT_CALLBACK_EXT)
DEBUG_MAKER_SET_FUNC(DisplayKHR, DISPLAY_KHR)
DEBUG_MAKER_SET_FUNC(DisplayModeKHR, DISPLAY_MODE_KHR)
DEBUG_MAKER_SET_FUNC(ValidationCacheEXT, VALIDATION_CACHE_EXT)
DEBUG_MAKER_SET_FUNC(SamplerYcbcrConversion, SAMPLER_YCBCR_CONVERSION)
DEBUG_MAKER_SET_FUNC(DescriptorUpdateTemplate, DESCRIPTOR_UPDATE_TEMPLATE)
DEBUG_MAKER_SET_FUNC(CuModuleNVX, CU_MODULE_NVX)
DEBUG_MAKER_SET_FUNC(CuFunctionNVX, CU_FUNCTION_NVX)
DEBUG_MAKER_SET_FUNC(AccelerationStructureKHR, ACCELERATION_STRUCTURE_KHR)
DEBUG_MAKER_SET_FUNC(AccelerationStructureNV, ACCELERATION_STRUCTURE_NV)
#undef DEBUG_MAKER_SET_FUNC
};//class DebugMaker
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_DEBUG_MAKER_INCLUDE

View File

@@ -1,8 +1,9 @@
#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#ifndef HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#define HGL_GRAPH_DESCRIPTOR_BINDING_MANAGE_INCLUDE
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/graph/VK.h>
#include<hgl/graph/VKDescriptorSetType.h>
namespace hgl
{
@@ -11,10 +12,15 @@ namespace hgl
class DeviceBuffer;
class Texture;
class Material;
class MaterialParameters;
/**
* 描述符绑定器<Br>
* 一般用于注册通用数据,为材质进行自动绑定。
*/
class DescriptorBinding
{
DescriptorSetType set_type;
DescriptorSetType set_type; ///<描述符合集类型
Map<AnsiString,DeviceBuffer *> ubo_map;
Map<AnsiString,DeviceBuffer *> ssbo_map;
@@ -39,7 +45,7 @@ namespace hgl
{
if(name.IsEmpty())return(nullptr);
return GetListObject(ubo_map,name);
return GetObjectFromList(ubo_map,name);
}
void RemoveUBO(DeviceBuffer *buf)
@@ -61,7 +67,7 @@ namespace hgl
{
if(name.IsEmpty())return(nullptr);
return GetListObject(ssbo_map,name);
return GetObjectFromList(ssbo_map,name);
}
void RemoveSSBO(DeviceBuffer *buf)
@@ -83,7 +89,7 @@ namespace hgl
{
if(name.IsEmpty())return(nullptr);
return GetListObject(texture_map,name);
return GetObjectFromList(texture_map,name);
}
void RemoveTexture(Texture *tex)
@@ -93,6 +99,12 @@ namespace hgl
texture_map.DeleteByValue(tex);
}
private:
void BindUBO(MaterialParameters *,const BindingMap &,bool dynamic);
public:
bool Bind(Material *);
};//class DescriptorBinding
}//namespace graph

View File

@@ -11,12 +11,12 @@ class DeviceBuffer;
class DescriptorSet
{
VkDevice device;
int binding_count;
int vab_count;
VkDescriptorSet desc_set;
VkPipelineLayout pipeline_layout;
ObjectList<VkDescriptorBufferInfo> buffer_list;
ObjectList<VkDescriptorBufferInfo> vab_list;
ObjectList<VkDescriptorImageInfo> image_list;
List<VkWriteDescriptorSet> wds_list;
@@ -29,7 +29,7 @@ public:
DescriptorSet(VkDevice dev,const int bc,VkPipelineLayout pl,VkDescriptorSet ds)
{
device =dev;
binding_count =bc;
vab_count =bc;
desc_set =ds;
pipeline_layout =pl;
@@ -38,11 +38,11 @@ public:
~DescriptorSet()=default;
const uint32_t GetCount ()const{return binding_count;}
const uint32_t GetCount ()const{return vab_count;}
const VkDescriptorSet GetDescriptorSet ()const{return desc_set;}
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
const bool IsReady ()const{return wds_list.GetCount()==binding_count;}
const bool IsReady ()const{return wds_list.GetCount()==vab_count;}
void Clear();

View File

@@ -13,7 +13,6 @@
#include<hgl/graph/VKDeviceAttribute.h>
#include<hgl/graph/VKSwapchain.h>
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VertexAttribData.h>
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKArrayBuffer.h>
#include<hgl/graph/VKDescriptorSetType.h>
@@ -23,6 +22,9 @@ class TileData;
class TileFont;
class FontSource;
class GPUArrayBuffer;
class IndirectDrawBuffer;
class IndirectDrawIndexedBuffer;
class IndirectDispatchBuffer;
struct CopyBufferToImageInfo;
@@ -47,7 +49,7 @@ private:
private:
VkCommandBuffer CreateCommandBuffer();
VkCommandBuffer CreateCommandBuffer(const AnsiString &);
bool CreateSwapchainFBO(Swapchain *);
@@ -85,6 +87,8 @@ public:
void WaitIdle ()const {vkDeviceWaitIdle(attr->device);}
DebugUtils * GetDebugUtils (){return attr->debug_utils;}
public:
bool Resize (const VkExtent2D &);
@@ -113,9 +117,11 @@ public: //Buffer相关
DeviceBuffer * CreateBuffer(VkBufferUsageFlags buf_usage, VkDeviceSize size,const void *data, SharingMode sm=SharingMode::Exclusive){return CreateBuffer(buf_usage,size,size,data,sm);}
DeviceBuffer * CreateBuffer(VkBufferUsageFlags buf_usage, VkDeviceSize size, SharingMode sm=SharingMode::Exclusive){return CreateBuffer(buf_usage,size,size,nullptr,sm);}
VBO * CreateVBO (VkFormat format, uint32_t count,const void *data, SharingMode sm=SharingMode::Exclusive);
VBO * CreateVBO (VkFormat format, uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateVBO(format,count,nullptr,sm);}
VBO * CreateVBO (const VAD *vad, SharingMode sm=SharingMode::Exclusive){return CreateVBO(vad->GetFormat(),vad->GetCount(),vad->GetData(),sm);}
VAB * CreateVAB (VkFormat format, uint32_t count,const void *data, SharingMode sm=SharingMode::Exclusive);
VAB * CreateVAB (VkFormat format, uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateVAB(format,count,nullptr,sm);}
const IndexType ChooseIndexType (const VkDeviceSize &vertex_count)const; ///<求一个合适的索引类型
const bool CheckIndexType (const IndexType,const VkDeviceSize &vertex_count)const; ///<检测一个索引类型是否合适
IndexBuffer * CreateIBO (IndexType type, uint32_t count,const void * data, SharingMode sm=SharingMode::Exclusive);
IndexBuffer * CreateIBO8 ( uint32_t count,const void * data, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U8, count,(void *)data,sm);}
@@ -146,6 +152,14 @@ public: //Buffer相关
GPUArrayBuffer *CreateArrayInUBO(const VkDeviceSize &uint_size);
GPUArrayBuffer *CreateArrayInSSBO(const VkDeviceSize &uint_size);
public: //间接绘制
bool CreateIndirectCommandBuffer(DeviceBufferData *,const uint32_t cmd_count,const uint32_t cmd_size,SharingMode sm=SharingMode::Exclusive);
IndirectDrawBuffer * CreateIndirectDrawBuffer( const uint32_t cmd_count,SharingMode sm=SharingMode::Exclusive);
IndirectDrawIndexedBuffer * CreateIndirectDrawIndexedBuffer(const uint32_t cmd_count,SharingMode sm=SharingMode::Exclusive);
IndirectDispatchBuffer * CreateIndirectDispatchBuffer( const uint32_t cmd_count,SharingMode sm=SharingMode::Exclusive);
public: //Image
VkImage CreateImage (VkImageCreateInfo *);
@@ -212,8 +226,8 @@ public: //shader & material
public: //Command Buffer 相关
RenderCmdBuffer * CreateRenderCommandBuffer();
TextureCmdBuffer *CreateTextureCommandBuffer();
RenderCmdBuffer * CreateRenderCommandBuffer(const AnsiString &);
TextureCmdBuffer *CreateTextureCommandBuffer(const AnsiString &);
public:

View File

@@ -4,7 +4,6 @@
#include<hgl/graph/VKTexture.h>
#ifdef _DEBUG
#include<hgl/graph/VKDebugMaker.h>
#include<hgl/graph/VKDebugUtils.h>
#endif//_DEBUG
@@ -40,6 +39,9 @@ struct GPUDeviceAttribute
VkSurfaceTransformFlagBitsKHR preTransform;
VkCompositeAlphaFlagBitsKHR compositeAlpha =VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
bool uint8_index_type=false;
bool uint32_index_type=false;
VkDevice device =VK_NULL_HANDLE;
VkCommandPool cmd_pool =VK_NULL_HANDLE;
@@ -48,7 +50,6 @@ struct GPUDeviceAttribute
VkPipelineCache pipeline_cache =VK_NULL_HANDLE;
#ifdef _DEBUG
DebugMaker * debug_maker =nullptr;
DebugUtils * debug_utils =nullptr;
#endif//_DEBUG

View File

@@ -4,41 +4,54 @@
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
struct VulkanHardwareRequirement
{
uint min_1d_image_size;
uint min_2d_image_size;
uint min_3d_image_size;
uint min_cube_image_size;
uint min_array_image_layers;
enum class SupportLevel
{
DontCare=0, ///<不介意
Want, ///<希望支持
Must, ///<必须支持
};
uint min_vertex_input_attribute; ///<最小顶点输入属性数量需求
uint min_color_attachments; ///<最小颜色输出成份数量需求
//这里使用这种大小写是为了和VulkanSDK中的定义保持一致cpp中使用宏比较和复制时只使用一个名字即可
uint min_push_constant_size; ///<最小push constant大小
uint min_ubo_range; ///<最小ubo range需求
uint min_ssbo_range; ///<最小ssbo range需求
uint maxImageDimension1D;
uint maxImageDimension2D;
uint maxImageDimension3D;
uint maxImageDimensionCube;
uint maxImageArrayLayers;
uint min_draw_indirect_count; ///<最小间接绘制次数需求
uint maxVertexInputAttributes; ///<最大顶点输入属性数量需求
uint maxColorAttachments; ///<最大颜色输出成份数量需求
bool geometry_shader; ///<要求支持几何着色器
bool tessellation_shader; ///<要求支持细分着色器
// bool compute_shader; ///<要求支持计算着色器
uint maxPushConstantsSize; ///<最大push constant大小
uint maxUniformBufferRange; ///<最大ubo range需求
uint maxStorageBufferRange; ///<最大ssbo range需求
bool multi_draw_indirect; ///<要求支持MultiDrawIndirect
uint maxDrawIndirectCount; ///<最大间接绘制次数需求
bool wide_lines; ///<要求支持宽线条
bool line_rasterization; ///<要支持线条特性(这功能mac/ios平台不支持)
bool large_points; ///<要求支持绘制大点
SupportLevel geometryShader; ///<要求支持几何着色器
SupportLevel tessellationShader; ///<要求支持细分着色器
bool texture_cube_array; ///<要求支持立方体数组纹理
SupportLevel sampleRateShading; ///<要求支持采样率着色
bool uint8_draw_index; ///<要求支持8位索引
bool uint32_draw_index; ///<要求支持32位索引(不建议使用)
SupportLevel multiDrawIndirect; ///<要求支持MultiDrawIndirect
SupportLevel fillModeNonSolid; ///<要求支持非实体填充模式
SupportLevel wideLines; ///<要求支持宽线条
SupportLevel lineRasterization; ///<要支持线条特性(这功能mac/ios平台不支持)
SupportLevel largePoints; ///<要求支持绘制大点
SupportLevel imageCubeArray; ///<要求支持立方体数组纹理
SupportLevel fullDrawIndexUint8; ///<要求支持8位索引
SupportLevel fullDrawIndexUint32; ///<要求支持32位索引
struct
{
bool bc,etc2,astc_ldr,astc_hdr,pvrtc; ///<要求支持的压缩纹理格式
SupportLevel BC,ETC2,ASTC_LDR,ASTC_HDR,PVRTC; ///<要求支持的压缩纹理格式
}texture_compression;
//dynamic_state VK_EXT_extended_dynamic_state
@@ -47,7 +60,7 @@ struct VulkanHardwareRequirement
// primitive topology
// viewport
// scissor
// bind vbo
// bind vab
// depth test
// depth write
// depth compare op
@@ -78,12 +91,12 @@ struct VulkanHardwareRequirement
// line stipple
// depth clip -1 to 1
// shading rate image enable
bool dynamic_state[3]; ///<要求支持动态状态
SupportLevel dynamicState[3]; ///<要求支持动态状态
// 1.3 特性
bool dynamic_rendering; ///<要求支持动态渲染
SupportLevel dynamicRendering; ///<要求支持动态渲染
uint32_t descriptor_pool; ///<描述符池大小(默认1024)
uint32_t descriptor_pool; ///<描述符池大小(默认1024)
public:
@@ -93,7 +106,10 @@ public:
descriptor_pool=1024;
geometry_shader=true;
geometryShader=SupportLevel::Want;
fullDrawIndexUint8=SupportLevel::Want;
fullDrawIndexUint32=SupportLevel::Want;
}
};
@@ -247,10 +263,10 @@ public:
VulkanDeviceCreater(VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req,
const PreferFormats *spf_color,
const PreferColorSpaces *spf_color_space,
const PreferFormats *spf_depth,
const VulkanHardwareRequirement *req);
const PreferFormats *spf_depth);
virtual bool ChoosePhysicalDevice();
@@ -267,12 +283,12 @@ public:
inline GPUDevice *CreateRenderDevice( VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr,
const PreferFormats * spf_color =&PreferSDR,
const PreferColorSpaces * spf_color_space =&PreferNonlinear,
const PreferFormats * spf_depth =&PreferDepth,
const VulkanHardwareRequirement *req=nullptr)
const PreferFormats * spf_depth =&PreferDepth)
{
VulkanDeviceCreater vdc(vi,win,spf_color,spf_color_space,spf_depth,req);
VulkanDeviceCreater vdc(vi,win,req,spf_color,spf_color_space,spf_depth);
return vdc.Create();
}
@@ -281,34 +297,34 @@ inline GPUDevice *CreateRenderDeviceLDR(VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr)
{
return CreateRenderDevice(vi,win,&PreferLDR,&PreferNonlinear,&PreferDepth,req);
return CreateRenderDevice(vi,win,req,&PreferLDR,&PreferNonlinear,&PreferDepth);
}
inline GPUDevice *CreateRenderDeviceSDR(VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr)
{
return CreateRenderDevice(vi,win,&PreferSDR,&PreferNonlinear,&PreferDepth,req);
return CreateRenderDevice(vi,win,req,&PreferSDR,&PreferNonlinear,&PreferDepth);
}
inline GPUDevice *CreateRenderDeviceHDR16( VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr)
{
return CreateRenderDevice(vi,win,&PreferHDR16,&PreferLinear,&PreferDepth,req);
return CreateRenderDevice(vi,win,req,&PreferHDR16,&PreferLinear,&PreferDepth);
}
inline GPUDevice *CreateRenderDeviceHDR32( VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr)
{
return CreateRenderDevice(vi,win,&PreferHDR32,&PreferLinear,&PreferDepth,req);
return CreateRenderDevice(vi,win,req,&PreferHDR32,&PreferLinear,&PreferDepth);
}
inline GPUDevice *CreateRenderDeviceHDR(VulkanInstance *vi,
Window *win,
const VulkanHardwareRequirement *req=nullptr)
{
return CreateRenderDevice(vi,win,&PreferHDR,&PreferLinear,&PreferDepth,req);
return CreateRenderDevice(vi,win,req,&PreferHDR,&PreferLinear,&PreferDepth);
}
VK_NAMESPACE_END

View File

@@ -1,34 +1,98 @@
#ifndef HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE
#define HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE
#pragma once
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKBufferMap.h>
namespace hgl
VK_NAMESPACE_BEGIN
class IndexBuffer:public DeviceBuffer
{
namespace graph
IndexType index_type;
uint stride;
uint32_t count;
private:
friend class GPUDevice;
IndexBuffer(VkDevice d,const DeviceBufferData &vb,IndexType it,uint32_t _count):DeviceBuffer(d,vb)
{
class IndexBuffer:public DeviceBuffer
{
IndexType index_type;
uint32_t count;
index_type=it;
count=_count;
private:
if(index_type==IndexType::U16)stride=2;else
if(index_type==IndexType::U32)stride=4;else
if(index_type==IndexType::U8)stride=1;else
stride=0;
}
friend class GPUDevice;
public:
IndexBuffer(VkDevice d,const DeviceBufferData &vb,IndexType it,uint32_t _count):DeviceBuffer(d,vb)
{
index_type=it;
count=_count;
}
~IndexBuffer()=default;
public:
const IndexType GetType ()const{return index_type;}
const uint GetStride ()const{return stride;}
const uint32 GetCount ()const{return count;}
~IndexBuffer()=default;
public:
const IndexType GetType ()const{return index_type;}
const uint32 GetCount()const{return count;}
};//class IndexBuffer:public DeviceBuffer
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_VULKAN_INDEX_BUFFER_INCLUDE
void * Map (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Map(start*stride,size*stride);}
void Flush (VkDeviceSize start,VkDeviceSize size) override {return DeviceBuffer::Flush(start*stride,size*stride); }
void Flush (VkDeviceSize size) override {return DeviceBuffer::Flush(size*stride);}
bool Write (const void *ptr,uint32_t start,uint32_t size) override {return DeviceBuffer::Write(ptr,start*stride,size*stride);}
bool Write (const void *ptr,uint32_t size) override {return DeviceBuffer::Write(ptr,0,size*stride);}
};//class IndexBuffer:public DeviceBuffer
class IBMap:public VKBufferMap<IndexBuffer>
{
public:
using VKBufferMap<IndexBuffer>::VKBufferMap;
virtual ~IBMap()=default;
const IndexType GetType()const{return buffer->GetType();}
void SetIBO(IndexBuffer *ib,const int32_t index_offset,const uint32_t count)
{
VKBufferMap<IndexBuffer>::Set(ib,index_offset,ib->GetStride(),count);
}
};//class IBMap
/**
* 索引缓冲区数据访问映射
*/
template<typename T> class IBTypeMap
{
IBMap *ib_map;
T *map_ptr;
public:
IBTypeMap(IBMap *ibm)
{
ib_map=ibm;
if(ib_map&&ib_map->GetStride()==sizeof(T))
map_ptr=(T *)(ib_map->Map());
else
map_ptr=nullptr;
}
~IBTypeMap()
{
if(map_ptr)
ib_map->Unmap();
}
const bool IsValid()const{ return map_ptr; }
operator T *(){ return map_ptr; }
T *operator->(){ return map_ptr; }
};//template<typename T> class IBTypeMap
using IBMapU8 =IBTypeMap<uint8>;
using IBMapU16=IBTypeMap<uint16>;
using IBMapU32=IBTypeMap<uint32>;
VK_NAMESPACE_END

View File

@@ -0,0 +1,96 @@
#pragma once
#include<hgl/graph/VKBuffer.h>
VK_NAMESPACE_BEGIN
template<typename T>
class IndirectCommandBuffer:public DeviceBuffer
{
protected:
uint32_t max_count;
public:
const uint32_t GetMaxCount ()const{ return max_count; } ///<取得最大指令数
const uint32_t GetCommandLength()const{ return sizeof(T); } ///<取得单个指令的长度字节数
const VkDeviceSize GetTotalBytes ()const{ return sizeof(T)*max_count; } ///<取得缓冲区总计字节数
private:
friend class GPUDevice;
IndirectCommandBuffer(VkDevice d,const DeviceBufferData &vb,const uint32_t mc):DeviceBuffer(d,vb)
{
max_count=mc;
}
public:
virtual ~IndirectCommandBuffer()=default;
void * Map (VkDeviceSize start,VkDeviceSize size) override{return DeviceBuffer::Map(start*sizeof(T),size*sizeof(T));}
T * MapCmd (VkDeviceSize start,VkDeviceSize size) {return (T *)Map(start,size);}
T * MapCmd () {return (T *)Map(0,max_count);}
void Flush (VkDeviceSize start,VkDeviceSize size) override{return DeviceBuffer::Flush(start*sizeof(T),size*sizeof(T));}
void Flush (VkDeviceSize size) override{return DeviceBuffer::Flush(size*sizeof(T));}
bool Write (const void *ptr,uint32_t start,uint32_t size) override{return DeviceBuffer::Write(ptr,start*sizeof(T),size*sizeof(T));}
bool Write (const void *ptr,uint32_t size) override{return DeviceBuffer::Write(ptr,0,size*sizeof(T));}
bool WriteCmd(const T *ptr,uint32_t start,uint32_t size) {return DeviceBuffer::Write(ptr,start*sizeof(T),size*sizeof(T));}
bool WriteCmd(const T *ptr,uint32_t size) {return DeviceBuffer::Write(ptr,0,size*sizeof(T));}
};//class IndirectCommandBuffer:public DeviceBuffer
class IndirectDrawBuffer:public IndirectCommandBuffer<VkDrawIndirectCommand>
{
friend class GPUDevice;
public:
using IndirectCommandBuffer<VkDrawIndirectCommand>::IndirectCommandBuffer;
void Draw(VkCommandBuffer cmd_buf,uint32_t cmd_offset,uint32_t draw_count) const
{
vkCmdDrawIndirect(cmd_buf,
buf.buffer,
cmd_offset*sizeof(VkDrawIndirectCommand),
draw_count,
sizeof(VkDrawIndirectCommand));
}
};//class IndirectDrawBuffer:public IndirectCommandBuffer<VkDrawIndirectCommand>
class IndirectDrawIndexedBuffer:public IndirectCommandBuffer<VkDrawIndexedIndirectCommand>
{
friend class GPUDevice;
public:
using IndirectCommandBuffer<VkDrawIndexedIndirectCommand>::IndirectCommandBuffer;
void DrawIndexed(VkCommandBuffer cmd_buf,uint32_t cmd_offset,uint32_t draw_count) const
{
vkCmdDrawIndexedIndirect(cmd_buf,
buf.buffer,
cmd_offset*sizeof(VkDrawIndexedIndirectCommand),
draw_count,
sizeof(VkDrawIndexedIndirectCommand));
}
};//class IndirectDrawIndexedBuffer:public IndirectCommandBuffer<VkDrawIndexedIndirectCommand>
class IndirectDispatchBuffer:public IndirectCommandBuffer<VkDispatchIndirectCommand>
{
friend class GPUDevice;
public:
using IndirectCommandBuffer<VkDispatchIndirectCommand>::IndirectCommandBuffer;
void Dispatch(VkCommandBuffer cmd_buf,uint32_t offset) const
{
vkCmdDispatchIndirect(cmd_buf,buf.buffer,offset);
}
};//class IndirectDispatchBuffer:public IndirectCommandBuffer<VkDispatchIndirectCommand>
VK_NAMESPACE_END

View File

@@ -28,6 +28,11 @@ VK_NAMESPACE_BEGIN
VK_BOOL1BIT(profiles)
}khronos;
struct
{
VK_BOOL1BIT(switchable_graphics)
}amd;
struct
{
VK_BOOL1BIT(optimus)
@@ -85,11 +90,11 @@ VK_NAMESPACE_BEGIN
}
template<typename T>
T *GetDeviceProc(const char *name)
T *GetDeviceProc(VkDevice *dev,const char *name)
{
if(!GetDeviceProcAddr)return(nullptr);
return reinterpret_cast<T>(GetDeviceProcAddr(name));
return reinterpret_cast<T>(GetDeviceProcAddr(dev,name));
}
void DestroySurface(VkSurfaceKHR);

View File

@@ -49,15 +49,15 @@ public:
virtual ~Material();
const UTF8String & GetName ()const{return name;}
const AnsiString & GetName ()const{return name;}
const VertexInput * GetVertexInput ()const{return vertex_input;}
const ShaderStageCreateInfoList & GetStageList ()const{return shader_stage_list;}
const MaterialDescriptorManager * GetDescriptorSets ()const{return desc_manager;}
// const MaterialDescriptorManager * GetDescriptorManager ()const{return desc_manager;}
const VkPipelineLayout GetPipelineLayout ()const;
const PipelineLayoutData * GetPipelineLayoutData ()const{return pipeline_layout_data;}
// const PipelineLayoutData * GetPipelineLayoutData ()const{return pipeline_layout_data;}
public:
@@ -81,6 +81,8 @@ public:
bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
bool BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler);
void Update();
public:
const bool HasMI ()const{return mi_data_bytes>0;}

View File

@@ -5,12 +5,9 @@
#include<hgl/graph/VKShaderDescriptorSet.h>
VK_NAMESPACE_BEGIN
using BindingMap=Map<AnsiString,int>;
using BindingMapArray=BindingMap[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
class MaterialDescriptorManager
{
UTF8String mtl_name;
AnsiString mtl_name;
BindingMapArray binding_map[DESCRIPTOR_SET_TYPE_COUNT];
@@ -22,11 +19,11 @@ private:
public:
MaterialDescriptorManager(const UTF8String &,ShaderDescriptor *,const uint);
MaterialDescriptorManager(const UTF8String &,const ShaderDescriptorSetArray &);
MaterialDescriptorManager(const AnsiString &,ShaderDescriptor *,const uint);
MaterialDescriptorManager(const AnsiString &,const ShaderDescriptorSetArray &);
~MaterialDescriptorManager();
const UTF8String &GetMaterialName()const{return mtl_name;}
const AnsiString &GetMaterialName()const{return mtl_name;}
const uint GetBindCount(const DescriptorSetType &set_type)const
{

View File

@@ -35,6 +35,8 @@ public:
void Free() override {/* DON'T RUN ANY OPERATION.*/}
void Flush(const VkDeviceSize);
bool Write(const void *source,const uint64 offset,const uint64 size) override;
};//class VKMemoryAllocator:public AbstractMemoryAllocator
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MEMORY_ALLOCATOR_INCLUDE

View File

@@ -27,6 +27,7 @@ class GPUPhysicalDevice
private:
bool support_u8_index=false;
bool dynamic_state=false;
public:
@@ -141,8 +142,13 @@ public:
public:
const VkBool32 SupportGeometryShader ()const{return features.geometryShader;}
const VkBool32 SupportTessellationShader ()const{return features.tessellationShader;}
const VkBool32 SupportCubeMapArray ()const{return features.imageCubeArray;}
const VkBool32 SupportU32Index ()const{return features.fullDrawIndexUint32;}
const VkBool32 SupportU8Index ()const{return support_u8_index;}
// support != open, so please don't direct use GetFeatures().
// open any features in CreateDevice()&SetDeviceFeatures() functions.
const bool SupportMDI ()const

View File

@@ -9,7 +9,12 @@ VK_NAMESPACE_BEGIN
class Pipeline
{
VkDevice device;
AnsiString name;
VkPipeline pipeline;
const VIL *vil;
PipelineData *data;
bool alpha_test;
@@ -19,10 +24,13 @@ private:
friend class RenderPass;
Pipeline(VkDevice dev,VkPipeline p,PipelineData *pd)
Pipeline(const AnsiString &n,VkDevice dev,VkPipeline p,const VIL *v,PipelineData *pd)
{
name=n;
device=dev;
pipeline=p;
vil=v;
data=pd;
alpha_test=false;
@@ -33,8 +41,11 @@ public:
virtual ~Pipeline();
const AnsiString &GetName()const{return name;}
operator VkPipeline(){return pipeline;}
const VIL *GetVIL()const{return vil;}
const PipelineData *GetData()const{return data;}
const bool IsAlphaTest()const{return data->alpha_test>0;}

View File

@@ -1,78 +1,53 @@
#ifndef HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE
#define HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE
#pragma once
#include<hgl/graph/VKIndexBuffer.h>
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/math/Math.h>
#include<hgl/graph/AABB.h>
#include<hgl/graph/VK.h>
VK_NAMESPACE_BEGIN
/**
* 单一图元数据
* 原始图元数据访问接口<br>
* Primitive的存为是为了屏蔽PrimitiveData的初始化之类的访问接口以便于更好的管理和使用
*/
class Primitive
{
struct VBOData
{
VBO *buf;
VkDeviceSize offset;
public:
CompOperatorMemcmp(const VBOData &);
};
Map<AnsiString,VBOData> buffer_list;
protected:
uint32_t vertex_count;
AnsiString prim_name;
IndexBufferData index_buffer_data;
PrimitiveData * prim_data;
protected:
AABB BoundingBox;
public:
protected:
friend class RenderableNode;
uint ref_count=0;
uint RefInc(){return ++ref_count;}
uint RefDec(){return --ref_count;}
Primitive(const AnsiString &pn,PrimitiveData *pd);
virtual ~Primitive();
public:
Primitive(const uint32_t vc=0):vertex_count(vc){}
virtual ~Primitive()=default;
const AnsiString & GetName ()const{ return prim_name; }
const uint GetRefCount()const{return ref_count;}
const VkDeviceSize GetVertexCount ()const;
const int GetVABCount ()const;
const int GetVABIndex (const AnsiString &name)const;
VAB * GetVAB (const int);
VAB * GetVAB (const AnsiString &name){return GetVAB(GetVABIndex(name));}
const int32_t GetVertexOffset ()const; ///<取得顶点偏移(注意是顶点不是字节)
VABMap * GetVABMap (const int); ///<取得VAB映射器
VABMap * GetVABMap (const AnsiString &name){return GetVABMap(GetVABIndex(name));}
void SetBoundingBox(const AABB &aabb){BoundingBox=aabb;}
const AABB & GetBoundingBox()const {return BoundingBox;}
const uint32_t GetIndexCount ()const;
IndexBuffer * GetIBO ();
const uint32_t GetFirstIndex ()const; ///<取得第一个索引
IBMap * GetIBMap (); ///<取得索引缓冲区映射器
bool Set(const AnsiString &name,VBO *vb,VkDeviceSize offset=0);
VertexDataManager * GetVDM (); ///<取得顶点数据管理器
bool Set(IndexBuffer *ib,VkDeviceSize offset=0)
{
if(!ib)return(false);
index_buffer_data.buffer=ib;
index_buffer_data.offset=offset;
return(true);
}
public:
const uint32_t GetVertexCount ()const {return vertex_count;}
VBO * GetVBO (const AnsiString &,VkDeviceSize *);
VkBuffer GetBuffer (const AnsiString &,VkDeviceSize *);
const int GetBufferCount ()const {return buffer_list.GetCount();}
const IndexBufferData * GetIndexBufferData ()const {return &index_buffer_data;}
const AABB & GetBoundingBox ()const{return BoundingBox;}
};//class Primitive
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE

View File

@@ -25,7 +25,7 @@ protected:
ObjectList<Pipeline> pipeline_list;
Pipeline *CreatePipeline(PipelineData *,const ShaderStageCreateInfoList &,VkPipelineLayout,const VIL *);
Pipeline *CreatePipeline(const AnsiString &,PipelineData *,const ShaderStageCreateInfoList &,VkPipelineLayout,const VIL *);
private:

View File

@@ -5,19 +5,28 @@
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKDescriptorSet.h>
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VertexAttribData.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/font/TextPrimitive.h>
#include<hgl/graph/StaticMesh.h>
#include<hgl/type/ObjectManage.h>
#include<hgl/shadergen/MaterialCreateInfo.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
namespace mtl
{
struct Material2DCreateConfig;
struct Material3DCreateConfig;
}//namespace mtl
using MaterialID =int;
using MaterialInstanceID =int;
using BufferID =int;
@@ -26,6 +35,7 @@ using PrimitiveID =int;
using RenderableID =int;
using SamplerID =int;
using TextureID =int;
using StaticMeshID =int;
class VertexAttribData;
@@ -52,17 +62,42 @@ class RenderResource
IDObjectManage<TextureID, Texture> rm_textures; ///<纹理合集
IDObjectManage<RenderableID, Renderable> rm_renderables; ///<渲染实例集合集
IDObjectManage<StaticMeshID, StaticMesh> rm_static_mesh; ///<静态网格合集
private:
void AddBuffer(const AnsiString &buf_name,DeviceBuffer *buf)
{
rm_buffers.Add(buf);
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
{
du->SetBuffer(buf->GetBuffer(),buf_name+":Buffer");
du->SetDeviceMemory(buf->GetVkMemory(),buf_name+":Memory");
}
#endif//_DEBUG
}
public:
GPUDevice *GetDevice(){return device;}
//注:并非一定要走这里,这里只是提供一个注册和自动绑定的机制
DescriptorBinding static_descriptor; ///<静态属性描述符绑定管理
DescriptorBinding global_descriptor; ///<全局属性描述符绑定管理
public:
RenderResource(GPUDevice *dev):device(dev),global_descriptor(DescriptorSetType::Global){}
RenderResource(GPUDevice *dev):device(dev),
static_descriptor(DescriptorSetType::Static),
global_descriptor(DescriptorSetType::Global)
{}
virtual ~RenderResource()=default;
public: //Add
public: //添加数据到管理器如果指针为nullptr会返回-1
MaterialID Add(Material * mtl ){return rm_material.Add(mtl);}
MaterialInstanceID Add(MaterialInstance * mi ){return rm_material_instance.Add(mi);}
@@ -72,15 +107,15 @@ public: //Add
SamplerID Add(Sampler * s ){return rm_samplers.Add(s);}
TextureID Add(Texture * t ){return rm_textures.Add(t);}
RenderableID Add(Renderable * r ){return rm_renderables.Add(r);}
StaticMeshID Add(StaticMesh * sm ){return rm_static_mesh.Add(sm);}
public: // VBO/VAO
public: // VAB/VAO
VBO *CreateVBO(VkFormat format,uint32_t count,const void *data,SharingMode sm=SharingMode::Exclusive);
VBO *CreateVBO(VkFormat format,uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateVBO(format,count,nullptr,sm);}
VBO *CreateVBO(const VAD *vad,SharingMode sm=SharingMode::Exclusive){return CreateVBO(vad->GetFormat(),vad->GetCount(),vad->GetData(),sm);}
VAB *CreateVAB(VkFormat format,uint32_t count,const void *data, SharingMode sm=SharingMode::Exclusive);
VAB *CreateVAB(VkFormat format,uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateVAB(format, count, nullptr, sm);}
#define SCENE_DB_CREATE_FUNC(name) DeviceBuffer *Create##name(VkDeviceSize size,void *data,SharingMode sm=SharingMode::Exclusive); \
DeviceBuffer *Create##name(VkDeviceSize size,SharingMode sm=SharingMode::Exclusive);
#define SCENE_DB_CREATE_FUNC(name) DeviceBuffer *Create##name(const AnsiString &buf_name,VkDeviceSize size,void *data,SharingMode sm=SharingMode::Exclusive); \
DeviceBuffer *Create##name(const AnsiString &buf_name,VkDeviceSize size,SharingMode sm=SharingMode::Exclusive){return Create##name(buf_name,size,nullptr,sm);}
SCENE_DB_CREATE_FUNC(UBO)
SCENE_DB_CREATE_FUNC(SSBO)
@@ -89,25 +124,37 @@ public: // VBO/VAO
#undef SCENE_DB_CREATE_FUNC
IndexBuffer *CreateIBO(IndexType index_type,uint32_t count,const void * data, SharingMode sm=SharingMode::Exclusive);
IndexBuffer *CreateIBO8 ( uint32_t count,const uint8 *data, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U8 ,count,(void *)data,sm);}
IndexBuffer *CreateIBO16( uint32_t count,const uint16 *data, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U16,count,(void *)data,sm);}
IndexBuffer *CreateIBO32( uint32_t count,const uint32 *data, SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32,count,(void *)data,sm);}
IndexBuffer *CreateIBO(IndexType index_type,uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(index_type,count,nullptr,sm);}
IndexBuffer *CreateIBO16( uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U16,count,nullptr,sm);}
IndexBuffer *CreateIBO32( uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32,count,nullptr,sm);}
IndexBuffer *CreateIBO(IndexType index_type,uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(index_type, count,nullptr,sm);}
IndexBuffer *CreateIBO8 ( uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U8, count,nullptr,sm);}
IndexBuffer *CreateIBO16( uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U16, count,nullptr,sm);}
IndexBuffer *CreateIBO32( uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateIBO(IndexType::U32, count,nullptr,sm);}
public: //Material
const ShaderModule *CreateShaderModule(const AnsiString &shader_module_name,const ShaderCreateInfo *);
Material * CreateMaterial(const mtl::MaterialCreateInfo *);
Material * LoadMaterial(const AnsiString &,mtl::Material2DCreateConfig *);
Material * LoadMaterial(const AnsiString &,mtl::Material3DCreateConfig *);
MaterialInstance * CreateMaterialInstance(Material *,const VILConfig *vil_cfg=nullptr);
MaterialInstance * CreateMaterialInstance(Material *,const VILConfig *vil_cfg,const void *,const int);
template<typename T>
MaterialInstance * CreateMaterialInstance(Material *mtl,const VILConfig *vil_cfg,const T *data)
{
return CreateMaterialInstance(mtl,vil_cfg,data,sizeof(T));
}
MaterialInstance * CreateMaterialInstance(const mtl::MaterialCreateInfo *,const VILConfig *vil_cfg=nullptr);
Primitive * CreatePrimitive(const uint32_t vertex_count=0);
Renderable * CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p);
Renderable * CreateRenderable(PrimitiveCreater *pc,MaterialInstance *mi,Pipeline *p);
Sampler * CreateSampler(VkSamplerCreateInfo *sci=nullptr);
Sampler * CreateSampler(Texture *);
@@ -117,7 +164,7 @@ public: //texture
Texture2D * LoadTexture2D(const OSString &,bool auto_mipmaps=false);
TextureCube * LoadTextureCube(const OSString &,bool auto_mipmaps=false);
Texture2DArray * CreateTexture2DArray(const uint32_t width,const uint32_t height,const uint32_t layer,const VkFormat &fmt,bool auto_mipmaps=false);
Texture2DArray * CreateTexture2DArray(const AnsiString &name,const uint32_t width,const uint32_t height,const uint32_t layer,const VkFormat &fmt,bool auto_mipmaps=false);
bool LoadTexture2DToArray(Texture2DArray *,const uint32_t layer,const OSString &);
public: //Get
@@ -130,6 +177,40 @@ public: //Get
Sampler * GetSampler (const SamplerID &id){return rm_samplers.Get(id);}
Texture * GetTexture (const TextureID &id){return rm_textures.Get(id);}
Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);}
StaticMesh * GetStaticMesh (const StaticMeshID &id){return rm_static_mesh.Get(id);}
public: //Release
void Release(Material * mtl ){rm_material.Release(mtl);}
void Release(MaterialInstance * mi ){rm_material_instance.Release(mi);}
void Release(DescriptorSet * ds ){rm_desc_sets.Release(ds);}
void Release(Primitive * p ){rm_primitives.Release(p);}
void Release(DeviceBuffer * buf ){rm_buffers.Release(buf);}
void Release(Sampler * s ){rm_samplers.Release(s);}
void Release(Texture * t ){rm_textures.Release(t);}
void Release(Renderable * r ){rm_renderables.Release(r);}
void Release(StaticMesh * sm ){rm_static_mesh.Release(sm);}
};//class RenderResource
/**
* 创建一个渲染资源对像<br>
* 这个函数是临时的,以后会被更好的机制替代
*/
template<typename T,typename ...ARGS>
T *CreateRRObject(RenderResource *rr,ARGS...args)
{
if(!rr)
return(nullptr);
T *obj=T::CreateNewObject(rr,args...);
if(!obj)
return(nullptr);
rr->Add(obj);
return obj;
}
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_DATABASE_INCLUDE

View File

@@ -1,5 +1,4 @@
#ifndef HGL_GRAPH_RENDERABLE_INCLUDE
#define HGL_GRAPH_RENDERABLE_INCLUDE
#pragma once
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VKPipeline.h>
@@ -9,43 +8,64 @@
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VertexAttrib.h>
VK_NAMESPACE_BEGIN
struct VertexInputData
/**
* 原始图元数据缓冲区<Br>
* 提供在渲染之前的数据绑定信息
*/
struct PrimitiveDataBuffer
{
uint32_t binding_count;
VkBuffer *buffer_list;
VkDeviceSize *buffer_offset;
uint32_t vab_count;
VkBuffer * vab_list;
uint32_t vertex_count;
// 理论上讲每个VAB绑定时都是可以指定byte offsets的。但是随后Draw时又可以指定vertexOffset。
// 在我们支持的两种draw模式中一种是每个模型一批VAB所有VAB的offset都是0。
// 另一种是使用VDM为了批量渲染所有的VAB又必须对齐所以每个VAB单独指定offset也不可行。
const IndexBufferData *index_buffer;
VkDeviceSize * vab_offset; //注意这里的offset是字节偏移不是顶点偏移
IndexBuffer * ibo;
VertexDataManager *vdm; //只是用来区分和比较的,不实际使用
public:
VertexInputData(const uint32_t,const uint32_t,const IndexBufferData *);
~VertexInputData();
PrimitiveDataBuffer(const uint32_t,IndexBuffer *,VertexDataManager *_v=nullptr);
~PrimitiveDataBuffer();
const bool Comp(const VertexInputData *vid)const
{
if(!vid)return(false);
if(binding_count!=vid->binding_count)return(false);
for(uint32_t i=0;i<binding_count;i++)
{
if(buffer_list[i]!=vid->buffer_list[i])return(false);
if(buffer_offset[i]!=vid->buffer_offset[i])return(false);
}
if(vertex_count!=vid->vertex_count)return(false);
if(index_buffer!=vid->index_buffer)return(false);
return(true);
}
};//struct VertexInputData
const bool Comp(const PrimitiveDataBuffer *pdb)const;
};//struct PrimitiveDataBuffer
/**
* 可渲染对象<br>
* 原始图元渲染数据<Br>
* 提供在渲染时的数据
*/
struct PrimitiveRenderData
{
//因为要VAB是流式访问所以我们这个结构会被用做排序依据
//也因此把vertex_offset放在最前面
int32_t vertex_offset; //注意这里的offset是相对于vertex的代表第几个顶点不是字节偏移
uint32_t first_index;
uint32_t vertex_count;
uint32_t index_count;
public:
PrimitiveRenderData(const uint32_t vc,const uint32_t ic,const int32_t vo=0,const uint32_t fi=0)
{
vertex_count =vc;
index_count =ic;
vertex_offset =vo;
first_index =fi;
}
CompOperatorMemcmp(const PrimitiveRenderData &);
CompOperatorMemcmpPointer(PrimitiveRenderData);
};
/**
* 原始可渲染对象(即仅一个模型一个材质)
*/
class Renderable ///可渲染对象实例
{
@@ -53,17 +73,24 @@ class Renderable
MaterialInstance * mat_inst;
Primitive * primitive;
VertexInputData * vertex_input;
PrimitiveDataBuffer * primitive_data_buffer;
PrimitiveRenderData * primitive_render_data;
private:
friend Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
Renderable(Primitive *,MaterialInstance *,Pipeline *,VertexInputData *);
Renderable(Primitive *,MaterialInstance *,Pipeline *,PrimitiveDataBuffer *,PrimitiveRenderData *);
public:
virtual ~Renderable();
virtual ~Renderable()
{
//需要在这里添加删除pipeline/desc_sets/primitive引用计数的代码
SAFE_CLEAR(primitive_data_buffer);
SAFE_CLEAR(primitive_render_data);
}
void UpdatePipeline (Pipeline *p){pipeline=p;}
@@ -74,9 +101,9 @@ public:
Primitive * GetPrimitive (){return primitive;}
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
const VertexInputData * GetVertexInputData ()const{return vertex_input;}
const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;}
const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;}
};//class Renderable
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
VK_NAMESPACE_END
#endif//HGL_GRAPH_RENDERABLE_INCLUDE

View File

@@ -1,53 +0,0 @@
#ifndef HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE
#define HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE
#include<hgl/graph/VKRenderResource.h>
VK_NAMESPACE_BEGIN
class RenderablePrimitiveCreater
{
RenderResource *rr;
uint32_t vertex_count;
Primitive *prim;
public:
RenderablePrimitiveCreater(RenderResource *_rr,uint32_t vc)
{
rr=_rr;
vertex_count=vc;
prim=rr->CreatePrimitive(vertex_count);
}
bool SetVBO(const AnsiString &name,const VkFormat &fmt,const void *buf)
{
VBO *vbo=rr->CreateVBO(fmt,vertex_count,buf);
if(!vbo)
return(false);
prim->Set(name,vbo);
return(true);
}
bool SetIBO(const IndexType &it,const void *buf,const uint32_t index_count)
{
IndexBuffer *ibo=rr->CreateIBO(it,index_count,buf);
if(!ibo)
return(false);
prim->Set(ibo);
return(true);
}
Renderable *Create(MaterialInstance *mi,Pipeline *p)
{
return rr->CreateRenderable(prim,mi,p);
}
};//class RenderablePrimitiveCreater
VK_NAMESPACE_END
#endif // HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE

View File

@@ -1,42 +0,0 @@
#ifndef HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
#define HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE
#include<hgl/type/String.h>
#include<hgl/type/List.h>
#include<hgl/type/StringList.h>
#include<hgl/graph/VKShaderStage.h>
#include<hgl/graph/VKStruct.h>
VK_NAMESPACE_BEGIN
class ShaderResource
{
VkShaderStageFlagBits stage_flag;
const uint32_t *spv_data;
uint32 spv_size;
ShaderStageIO stage_io;
public:
ShaderResource(const VkShaderStageFlagBits &,const uint32_t *,const uint32);
virtual ~ShaderResource();
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
const char * GetStageName ()const {return GetShaderStageName(stage_flag);}
const uint32_t * GetSPVData ()const {return spv_data;}
const uint32_t GetSPVSize ()const {return spv_size;}
ShaderAttributeArray & GetInputs () {return stage_io.input;}
// ShaderAttributeArray & GetOutputs () {return stage_io.output;}
const uint GetInputCount ()const {return stage_io.input.count;}
// const uint GetOutputCount ()const {return stage_io.output.count;}
const ShaderAttribute * GetInput (const AnsiString &)const;
const int GetInputBinding (const AnsiString &)const;
};//class ShaderResource
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE

View File

@@ -22,7 +22,7 @@ public:
TextureData * GetData () {return data;}
VkDeviceMemory GetDeviceMemory () {return data?data->memory->operator VkDeviceMemory():VK_NULL_HANDLE;}
VkDeviceMemory GetDeviceMemory () {return data?(data->memory?data->memory->operator VkDeviceMemory():VK_NULL_HANDLE):VK_NULL_HANDLE;}
VkImage GetImage () {return data?data->image:VK_NULL_HANDLE;}
VkImageLayout GetImageLayout () {return data?data->image_layout:VK_IMAGE_LAYOUT_UNDEFINED;}
VkImageView GetVulkanImageView () {return data?data->image_view->GetImageView():VK_NULL_HANDLE;}

View File

@@ -292,7 +292,7 @@ struct SwapchainDepthTextureCreateInfo:public TextureCreateInfo
struct TextureData
{
DeviceMemory * memory;
DeviceMemory * memory;
VkImage image;
VkImageLayout image_layout;
ImageView * image_view;

Some files were not shown because too many files have changed in this diff Show More