TextureMapExampleComponent.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/RHI/ImagePool.h>
  9. #include <Atom/RHI.Reflect/InputStreamLayoutBuilder.h>
  10. #include <Atom/RHI.Reflect/RenderAttachmentLayoutBuilder.h>
  11. #include <Atom/RPI.Reflect/Shader/ShaderAsset.h>
  12. #include <RHI/TextureMapExampleComponent.h>
  13. #include <SampleComponentManager.h>
  14. #include <Utils/Utils.h>
  15. namespace AtomSampleViewer
  16. {
  17. const char* TextureMapExampleComponent::s_textureMapExampleName = "TextureMapExample";
  18. void TextureMapExampleComponent::Reflect(AZ::ReflectContext* context)
  19. {
  20. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  21. {
  22. serializeContext->Class<TextureMapExampleComponent, AZ::Component>()->Version(0);
  23. }
  24. }
  25. TextureMapExampleComponent::TextureMapExampleComponent()
  26. {
  27. m_attachmentID[RenderTargetIndex::Texture1D] = AZ::RHI::AttachmentId("Texture1D");
  28. m_attachmentID[RenderTargetIndex::Texture1DArray] = AZ::RHI::AttachmentId("Texture1DArray");
  29. m_attachmentID[RenderTargetIndex::Texture2DArray] = AZ::RHI::AttachmentId("Texture2DArray");
  30. m_attachmentID[RenderTargetIndex::TextureCubemap] = AZ::RHI::AttachmentId("TextureCubemap");
  31. m_attachmentID[RenderTargetIndex::TextureCubemapArray] = AZ::RHI::AttachmentId("TextureCubemapArray");
  32. m_attachmentID[RenderTargetIndex::Texture3D] = AZ::RHI::AttachmentId("Texture3D");
  33. m_baseRectangle[0] = AZ::Vector3(-1, -1, 1);
  34. m_baseRectangle[1] = AZ::Vector3(-1, 1, 1);
  35. m_baseRectangle[2] = AZ::Vector3(1, 1, 1);
  36. m_baseRectangle[3] = AZ::Vector3(1, -1, 1);
  37. m_supportRHISamplePipeline = true;
  38. }
  39. void TextureMapExampleComponent::OnFramePrepare(AZ::RHI::FrameGraphBuilder& frameGraphBuilder)
  40. {
  41. float value = (sinf(m_time) + 1) * 0.5f;
  42. for (int i = 0; i < s_numOfTargets; ++i)
  43. {
  44. m_targetSRGs[i]->SetConstant(m_shaderInputConstantIndices[i], AZ::Vector4(value, value, value, 1));
  45. m_targetSRGs[i]->Compile();
  46. }
  47. BasicRHIComponent::OnFramePrepare(frameGraphBuilder);
  48. }
  49. void TextureMapExampleComponent::OnTick(float deltaTime, AZ::ScriptTimePoint time)
  50. {
  51. AZ_UNUSED(time);
  52. m_time += deltaTime;
  53. }
  54. void TextureMapExampleComponent::Activate()
  55. {
  56. CreateInputAssemblyBufferPool();
  57. InitRenderTargetBufferView();
  58. InitRenderTargets();
  59. LoadRenderTargetShader();
  60. AZ::RHI::ImageViewDescriptor desc;
  61. CreateTextureScope(RenderTargetIndex::Texture1D, desc, "texture1d"); // 1D
  62. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 0, 0);
  63. CreateTextureScope(RenderTargetIndex::Texture1DArray, desc, "texture1darray0"); // 1D Array layer 0
  64. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 1, 1);
  65. CreateTextureScope(RenderTargetIndex::Texture1DArray, desc, "texture1darray1"); // 1D Array layer 1
  66. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 2, 2);
  67. CreateTextureScope(RenderTargetIndex::Texture1DArray, desc, "texture1darray2"); // 1D Array layer 2
  68. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 0, 0);
  69. CreateTextureScope(RenderTargetIndex::Texture2DArray, desc, "texture2darray0"); // 2D Array layer 0
  70. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 1, 1);
  71. CreateTextureScope(RenderTargetIndex::Texture2DArray, desc, "texture2darray1"); // 2D Array layer 1
  72. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 2, 2);
  73. CreateTextureScope(RenderTargetIndex::Texture2DArray, desc, "texture2darray2"); // 2D Array layer 2
  74. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 0);
  75. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube0"); // Cubemap 0
  76. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 1);
  77. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube1"); // Cubemap 1
  78. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 2);
  79. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube2"); // Cubemap 2
  80. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 3);
  81. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube3"); // Cubemap 3
  82. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 4);
  83. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube4"); // Cubemap 4
  84. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 5);
  85. CreateTextureScope(RenderTargetIndex::TextureCubemap, desc, "texturecube5"); // Cubemap 5
  86. // Cubemap Array 0
  87. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 0);
  88. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray0");
  89. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 1);
  90. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray1");
  91. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 2);
  92. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray2");
  93. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 3);
  94. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray3");
  95. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 4);
  96. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray4");
  97. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 5);
  98. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray5");
  99. // Cubemap Array 1
  100. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 6);
  101. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray6");
  102. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 7);
  103. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray7");
  104. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 8);
  105. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray8");
  106. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 9);
  107. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray9");
  108. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 10);
  109. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray10");
  110. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 11);
  111. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray11");
  112. // Cubemap Array 2
  113. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 12);
  114. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray12");
  115. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 13);
  116. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray13");
  117. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 14);
  118. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray14");
  119. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 15);
  120. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray15");
  121. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 16);
  122. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray16");
  123. desc = AZ::RHI::ImageViewDescriptor::CreateCubemapFace(s_textureFormat, 0, 0, 17);
  124. CreateTextureScope(RenderTargetIndex::TextureCubemapArray, desc, "texturecubearray17");
  125. // Texture 3D
  126. desc = AZ::RHI::ImageViewDescriptor::Create3D(s_textureFormat, 0, 0, 0, 0);
  127. CreateTextureScope(RenderTargetIndex::Texture3D, desc, "texture3d0");
  128. desc = AZ::RHI::ImageViewDescriptor::Create3D(s_textureFormat, 0, 0, 4, 4);
  129. CreateTextureScope(RenderTargetIndex::Texture3D, desc, "texture3d1");
  130. desc = AZ::RHI::ImageViewDescriptor::Create3D(s_textureFormat, 0, 0, 7, 7);
  131. CreateTextureScope(RenderTargetIndex::Texture3D, desc, "texture3d2");
  132. InitTexture1DBufferView();
  133. LoadRasterShader("Shaders/RHI/texturemap1d.azshader", RenderTargetIndex::Texture1D);
  134. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0);
  135. CreateRasterScope(RenderTargetIndex::Texture1D, desc, "rendertexture1d");
  136. InitTexture1DArrayBufferView();
  137. LoadRasterShader("Shaders/RHI/texturemap1darray.azshader", RenderTargetIndex::Texture1DArray);
  138. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 0, s_arraySize - 1);
  139. CreateRasterScope(RenderTargetIndex::Texture1DArray, desc, "rendertexture1darray");
  140. InitTexture2DArrayBufferView();
  141. LoadRasterShader("Shaders/RHI/texturemap2darray.azshader", RenderTargetIndex::Texture2DArray);
  142. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0, 0, s_arraySize - 1);
  143. CreateRasterScope(RenderTargetIndex::Texture2DArray, desc, "rendertexture2darray");
  144. InitCubemapBufferView();
  145. LoadRasterShader("Shaders/RHI/texturemapcubemap.azshader", RenderTargetIndex::TextureCubemap);
  146. desc = AZ::RHI::ImageViewDescriptor::CreateCubemap();
  147. CreateRasterScope(RenderTargetIndex::TextureCubemap, desc, "rendertexturecubemap");
  148. InitCubemapArrayBufferView();
  149. LoadRasterShader("Shaders/RHI/texturemapcubemaparray.azshader", RenderTargetIndex::TextureCubemapArray);
  150. CreateRasterScope(RenderTargetIndex::TextureCubemapArray, desc, "rendertexturecubemaparray");
  151. InitTexture3DBufferView();
  152. LoadRasterShader("Shaders/RHI/texturemap3d.azshader", RenderTargetIndex::Texture3D);
  153. desc = AZ::RHI::ImageViewDescriptor::Create(s_textureFormat, 0, 0);
  154. CreateRasterScope(RenderTargetIndex::Texture3D, desc, "rendertexture3d");
  155. AZ::RHI::RHISystemNotificationBus::Handler::BusConnect();
  156. AZ::TickBus::Handler::BusConnect();
  157. }
  158. void TextureMapExampleComponent::Deactivate()
  159. {
  160. m_inputAssemblyBufferPool = nullptr;
  161. m_positionBuffer.fill(nullptr);
  162. m_uvBuffer.fill(nullptr);
  163. m_indexBuffer.fill(nullptr);
  164. m_targetPipelineStates.fill(nullptr);
  165. m_targetSRGs.fill(nullptr);
  166. m_screenPipelineStates.fill(nullptr);
  167. m_screenSRGs.fill(nullptr);
  168. m_renderTargetImageDescriptors.fill({});
  169. m_scopeProducers.clear();
  170. m_windowContext = nullptr;
  171. AZ::RHI::RHISystemNotificationBus::Handler::BusDisconnect();
  172. AZ::TickBus::Handler::BusDisconnect();
  173. }
  174. void TextureMapExampleComponent::CreateInputAssemblyBufferPool()
  175. {
  176. const AZ::RHI::Ptr<AZ::RHI::Device> device = Utils::GetRHIDevice();
  177. m_inputAssemblyBufferPool = AZ::RHI::Factory::Get().CreateBufferPool();
  178. AZ::RHI::BufferPoolDescriptor bufferPoolDesc;
  179. bufferPoolDesc.m_bindFlags = AZ::RHI::BufferBindFlags::InputAssembly;
  180. bufferPoolDesc.m_heapMemoryLevel = AZ::RHI::HeapMemoryLevel::Device;
  181. m_inputAssemblyBufferPool->Init(*device, bufferPoolDesc);
  182. }
  183. void TextureMapExampleComponent::InitRenderTargetBufferView()
  184. {
  185. SetFullScreenRect(m_positions.data(), m_uvs.data(), m_indices.data());
  186. uint32_t posSize = 4 * sizeof(VertexPosition);
  187. uint32_t uvSize = 4 * sizeof(VertexUV);
  188. uint32_t indexSize = 6 * sizeof(uint16_t);
  189. InitBufferView(RenderTargetIndex::BufferViewIndex, posSize, m_positions.data(), uvSize, m_uvs.data(), sizeof(VertexUV), indexSize, m_indices.data());
  190. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  191. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  192. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
  193. m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout = layoutBuilder.End();
  194. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews);
  195. }
  196. void TextureMapExampleComponent::InitTexture1DBufferView()
  197. {
  198. AZ::Matrix3x3 transform = AZ::Matrix3x3::CreateScale(AZ::Vector3(0.02, 0.02, 1));
  199. SetVertexPositionTransform(m_positions.data(), 0, transform, -0.9, -0.8);
  200. SetVertexUV(m_uvs.data(), 0, 0.0f, 0.0f);
  201. SetVertexUV(m_uvs.data(), 1, 0.0f, 0.0f);
  202. SetVertexUV(m_uvs.data(), 2, 1.0f, 0.0f);
  203. SetVertexUV(m_uvs.data(), 3, 1.0f, 0.0f);
  204. m_indices[0] = 0;
  205. m_indices[1] = 3;
  206. m_indices[2] = 1;
  207. m_indices[3] = 1;
  208. m_indices[4] = 3;
  209. m_indices[5] = 2;
  210. uint32_t posSize = 4 * sizeof(VertexPosition);
  211. uint32_t uvSize = 4 * sizeof(VertexUV);
  212. uint32_t indexSize = 6 * sizeof(uint16_t);
  213. InitBufferView(RenderTargetIndex::Texture1D, posSize, m_positions.data(), uvSize, m_uvs.data(), sizeof(VertexUV), indexSize, m_indices.data());
  214. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  215. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  216. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
  217. m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout = layoutBuilder.End();
  218. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture1D].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture1D].m_streamBufferViews);
  219. }
  220. void TextureMapExampleComponent::InitTexture1DArrayBufferView()
  221. {
  222. SetVertexPositionArray(m_positions.data(), 0.02, -0.7, -0.8);
  223. SetVertexUV(m_uvs.data(), 0, 0.0f, 0.0f);
  224. SetVertexUV(m_uvs.data(), 1, 0.0f, 0.0f);
  225. SetVertexUV(m_uvs.data(), 2, 1.0f, 0.0f);
  226. SetVertexUV(m_uvs.data(), 3, 1.0f, 0.0f);
  227. SetVertexUV(m_uvs.data(), 4, 0.0f, 1.0f);
  228. SetVertexUV(m_uvs.data(), 5, 0.0f, 1.0f);
  229. SetVertexUV(m_uvs.data(), 6, 1.0f, 1.0f);
  230. SetVertexUV(m_uvs.data(), 7, 1.0f, 1.0f);
  231. SetVertexUV(m_uvs.data(), 8, 0.0f, 2.0f);
  232. SetVertexUV(m_uvs.data(), 9, 0.0f, 2.0f);
  233. SetVertexUV(m_uvs.data(), 10, 1.0f, 2.0f);
  234. SetVertexUV(m_uvs.data(), 11, 1.0f, 2.0f);
  235. SetVertexIndexRectsCounterClock(m_indices.data(), 18);
  236. uint32_t posSize = 12 * sizeof(VertexPosition);
  237. uint32_t uvSize = 12 * sizeof(VertexUV);
  238. uint32_t indexSize = 18 * sizeof(uint16_t);
  239. InitBufferView(RenderTargetIndex::Texture1DArray, posSize, m_positions.data(), uvSize, m_uvs.data(), sizeof(VertexUV), indexSize, m_indices.data());
  240. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  241. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  242. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32_FLOAT);
  243. m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout = layoutBuilder.End();
  244. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture1DArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture1DArray].m_streamBufferViews);
  245. }
  246. void TextureMapExampleComponent::InitTexture2DArrayBufferView()
  247. {
  248. SetVertexPositionArray(m_positions.data(), 0.05, -0.4, -0.8);
  249. SetVertexUVWArray(m_uvws.data(), s_arraySize);
  250. SetVertexIndexRectsCounterClock(m_indices.data(), 18);
  251. uint32_t posSize = 12 * sizeof(VertexPosition);
  252. uint32_t uvSize = 12 * sizeof(VertexUVW);
  253. uint32_t indexSize = 18 * sizeof(uint16_t);
  254. InitBufferView(RenderTargetIndex::Texture2DArray, posSize, m_positions.data(), uvSize, m_uvws.data(), sizeof(VertexUVW), indexSize, m_indices.data());
  255. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  256. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  257. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
  258. m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout = layoutBuilder.End();
  259. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture2DArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture2DArray].m_streamBufferViews);
  260. }
  261. void TextureMapExampleComponent::InitCubemapBufferView()
  262. {
  263. SetVertexPositionCubemap(m_positions.data(), 0, 0.0, -0.8);
  264. SetVertexUVWCubemap(m_uvws.data());
  265. SetVertexIndexRectsCounterClock(m_indices.data(), 36);
  266. uint32_t posSize = 24 * sizeof(VertexPosition);
  267. uint32_t uvSize = 24 * sizeof(VertexUVW);
  268. uint32_t indexSize = 36 * sizeof(uint16_t);
  269. InitBufferView(RenderTargetIndex::TextureCubemap, posSize, m_positions.data(), uvSize, m_uvws.data(), sizeof(VertexUVW), indexSize, m_indices.data());
  270. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  271. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  272. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
  273. m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout = layoutBuilder.End();
  274. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::TextureCubemap].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::TextureCubemap].m_streamBufferViews);
  275. }
  276. void TextureMapExampleComponent::InitCubemapArrayBufferView()
  277. {
  278. SetVertexPositionCubemap(m_positions.data(), 0, 0.4, -0.8);
  279. SetVertexPositionCubemap(m_positions.data(), 24, 0.4, -0.2);
  280. SetVertexPositionCubemap(m_positions.data(), 48, 0.4, 0.4);
  281. SetVertexUVWXCubemapArray(m_uvwxs.data(), s_arraySize);
  282. SetVertexIndexRectsCounterClock(m_indices.data(), 108);
  283. uint32_t posSize = 72 * sizeof(VertexPosition);
  284. uint32_t uvSize = 72 * sizeof(VertexUVWX);
  285. uint32_t indexSize = 108 * sizeof(uint16_t);
  286. InitBufferView(RenderTargetIndex::TextureCubemapArray, posSize, m_positions.data(), uvSize, m_uvwxs.data(), sizeof(VertexUVWX), indexSize, m_indices.data());
  287. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  288. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  289. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32A32_FLOAT);
  290. m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout = layoutBuilder.End();
  291. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::TextureCubemapArray].m_streamBufferViews);
  292. }
  293. void TextureMapExampleComponent::InitTexture3DBufferView()
  294. {
  295. SetVertexPositionArray(m_positions.data(), 0.05, 0.8, -0.8);
  296. SetVertexUVW(m_uvws.data(), 0, 0.0f, 0.0f, 0.05f);
  297. SetVertexUVW(m_uvws.data(), 1, 0.0f, 1.0f, 0.05f);
  298. SetVertexUVW(m_uvws.data(), 2, 1.0f, 1.0f, 0.05f);
  299. SetVertexUVW(m_uvws.data(), 3, 1.0f, 0.0f, 0.05f);
  300. SetVertexUVW(m_uvws.data(), 4, 0.0f, 0.0f, 0.55f);
  301. SetVertexUVW(m_uvws.data(), 5, 0.0f, 1.0f, 0.55f);
  302. SetVertexUVW(m_uvws.data(), 6, 1.0f, 1.0f, 0.55f);
  303. SetVertexUVW(m_uvws.data(), 7, 1.0f, 0.0f, 0.55f);
  304. SetVertexUVW(m_uvws.data(), 8, 0.0f, 0.0f, 0.95f);
  305. SetVertexUVW(m_uvws.data(), 9, 0.0f, 1.0f, 0.95f);
  306. SetVertexUVW(m_uvws.data(), 10, 1.0f, 1.0f, 0.95f);
  307. SetVertexUVW(m_uvws.data(), 11, 1.0f, 0.0f, 0.95f);
  308. SetVertexIndexRectsCounterClock(m_indices.data(), 18);
  309. uint32_t posSize = 12 * sizeof(VertexPosition);
  310. uint32_t uvSize = 12 * sizeof(VertexUVW);
  311. uint32_t indexSize = 18 * sizeof(uint16_t);
  312. InitBufferView(RenderTargetIndex::Texture3D, posSize, m_positions.data(), uvSize, m_uvws.data(), sizeof(VertexUVW), indexSize, m_indices.data());
  313. AZ::RHI::InputStreamLayoutBuilder layoutBuilder;
  314. layoutBuilder.AddBuffer()->Channel("POSITION", AZ::RHI::Format::R32G32B32_FLOAT);
  315. layoutBuilder.AddBuffer()->Channel("UV", AZ::RHI::Format::R32G32B32_FLOAT);
  316. m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout = layoutBuilder.End();
  317. AZ::RHI::ValidateStreamBufferViews(m_bufferViews[RenderTargetIndex::Texture3D].m_inputStreamLayout, m_bufferViews[RenderTargetIndex::Texture3D].m_streamBufferViews);
  318. }
  319. void TextureMapExampleComponent::InitRenderTargets()
  320. {
  321. using namespace AZ;
  322. RHI::ImageDescriptor imageDesc;
  323. imageDesc = RHI::ImageDescriptor::Create1D(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_textureFormat);
  324. m_renderTargetImageDescriptors[RenderTargetIndex::Texture1D] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::Texture1D], imageDesc);
  325. imageDesc = RHI::ImageDescriptor::Create1DArray(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_arraySize, s_textureFormat);
  326. m_renderTargetImageDescriptors[RenderTargetIndex::Texture1DArray] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::Texture1DArray], imageDesc);
  327. imageDesc = RHI::ImageDescriptor::Create2DArray(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_textureHeight, s_arraySize, s_textureFormat);
  328. m_renderTargetImageDescriptors[RenderTargetIndex::Texture2DArray] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::Texture2DArray], imageDesc);
  329. imageDesc = RHI::ImageDescriptor::CreateCubemap(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_textureFormat);
  330. m_renderTargetImageDescriptors[RenderTargetIndex::TextureCubemap] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::TextureCubemap], imageDesc);
  331. imageDesc = RHI::ImageDescriptor::CreateCubemapArray(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_arraySize, s_textureFormat);
  332. m_renderTargetImageDescriptors[RenderTargetIndex::TextureCubemapArray] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::TextureCubemapArray], imageDesc);
  333. imageDesc = RHI::ImageDescriptor::Create3D(RHI::ImageBindFlags::Color | RHI::ImageBindFlags::ShaderRead, s_textureWidth, s_textureHeight, s_textureDepth, s_textureFormat);
  334. m_renderTargetImageDescriptors[RenderTargetIndex::Texture3D] = RHI::TransientImageDescriptor(m_attachmentID[RenderTargetIndex::Texture3D], imageDesc);
  335. }
  336. void TextureMapExampleComponent::LoadRenderTargetShader()
  337. {
  338. using namespace AZ;
  339. const char* shaderFilePath = "Shaders/RHI/texturemaptarget.azshader";
  340. auto shader = LoadShader(shaderFilePath, s_textureMapExampleName);
  341. if (shader == nullptr)
  342. {
  343. return;
  344. }
  345. RHI::PipelineStateDescriptorForDraw pipelineDesc;
  346. shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId).ConfigurePipelineState(pipelineDesc);
  347. pipelineDesc.m_inputStreamLayout = m_bufferViews[RenderTargetIndex::BufferViewIndex].m_inputStreamLayout;
  348. RHI::RenderAttachmentLayoutBuilder attachmentsBuilder;
  349. attachmentsBuilder.AddSubpass()
  350. ->RenderTargetAttachment(s_textureFormat);
  351. [[maybe_unused]] AZ::RHI::ResultCode result = attachmentsBuilder.End(pipelineDesc.m_renderAttachmentConfiguration.m_renderAttachmentLayout);
  352. AZ_Assert(result == AZ::RHI::ResultCode::Success, "Failed to create render attachment layout");
  353. for (int i = 0; i < s_numOfTargets; ++i)
  354. {
  355. m_targetPipelineStates[i] = shader->AcquirePipelineState(pipelineDesc);
  356. m_targetSRGs[i] = CreateShaderResourceGroup(shader, "TextureMapTargetSrg", s_textureMapExampleName);
  357. FindShaderInputIndex(&m_shaderInputConstantIndices[i], m_targetSRGs[i], Name{"sinValue"}, s_textureMapExampleName);
  358. }
  359. }
  360. void TextureMapExampleComponent::LoadRasterShader(const char* shaderFilePath, int target)
  361. {
  362. using namespace AZ;
  363. auto shader = LoadShader(shaderFilePath, s_textureMapExampleName);
  364. if (shader == nullptr)
  365. {
  366. return;
  367. }
  368. RHI::PipelineStateDescriptorForDraw pipelineDesc;
  369. shader->GetVariant(RPI::ShaderAsset::RootShaderVariantStableId).ConfigurePipelineState(pipelineDesc);
  370. pipelineDesc.m_inputStreamLayout = m_bufferViews[target].m_inputStreamLayout;
  371. RHI::RenderAttachmentLayoutBuilder attachmentsBuilder;
  372. attachmentsBuilder.AddSubpass()
  373. ->RenderTargetAttachment(m_outputFormat);
  374. [[maybe_unused]] AZ::RHI::ResultCode result = attachmentsBuilder.End(pipelineDesc.m_renderAttachmentConfiguration.m_renderAttachmentLayout);
  375. AZ_Assert(result == AZ::RHI::ResultCode::Success, "Failed to create render attachment layout");
  376. m_screenPipelineStates[target] = shader->AcquirePipelineState(pipelineDesc);
  377. m_screenSRGs[target] = CreateShaderResourceGroup(shader, "TextureMapSrg", s_textureMapExampleName);
  378. FindShaderInputIndex(&m_shaderInputImageIndices[target], m_screenSRGs[target], Name{"texture"}, s_textureMapExampleName);
  379. }
  380. void TextureMapExampleComponent::CreateTextureScope(int target, const AZ::RHI::ImageViewDescriptor& imageViewDescriptor, const char* scopeName)
  381. {
  382. using namespace AZ;
  383. struct ScopeData
  384. {
  385. };
  386. const auto prepareFunction = [this, imageViewDescriptor, target](RHI::FrameGraphInterface frameGraph, [[maybe_unused]] ScopeData& scopeData)
  387. {
  388. // Create & Binds RenderTarget images
  389. {
  390. if (!frameGraph.GetAttachmentDatabase().IsAttachmentValid(m_attachmentID[target]))
  391. {
  392. frameGraph.GetAttachmentDatabase().CreateTransientImage(m_renderTargetImageDescriptors[target]);
  393. }
  394. RHI::ImageScopeAttachmentDescriptor desc;
  395. desc.m_attachmentId = m_attachmentID[target];
  396. desc.m_imageViewDescriptor = imageViewDescriptor;
  397. desc.m_loadStoreAction.m_clearValue = m_clearValue;
  398. desc.m_loadStoreAction.m_loadAction = RHI::AttachmentLoadAction::Clear;
  399. frameGraph.UseColorAttachment(desc);
  400. }
  401. frameGraph.SetEstimatedItemCount(1);
  402. };
  403. RHI::EmptyCompileFunction<ScopeData> compileFunction;
  404. const auto executeFunction = [this, target](const RHI::FrameGraphExecuteContext& context, [[maybe_unused]] const ScopeData& scopeData)
  405. {
  406. RHI::CommandList* commandList = context.GetCommandList();
  407. // Set persistent viewport and scissor state.
  408. commandList->SetViewports(&m_viewport, 1);
  409. RHI::Scissor scissor(0, 0, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_width, m_renderTargetImageDescriptors[target].m_imageDescriptor.m_size.m_height);
  410. commandList->SetScissors(&scissor, 1);
  411. RHI::DrawIndexed drawIndexed;
  412. drawIndexed.m_indexCount = 6;
  413. drawIndexed.m_instanceCount = 1;
  414. const RHI::ShaderResourceGroup* shaderResourceGroups[] = { m_targetSRGs[target]->GetRHIShaderResourceGroup() };
  415. RHI::DrawItem drawItem;
  416. drawItem.m_arguments = drawIndexed;
  417. drawItem.m_pipelineState = m_targetPipelineStates[target].get();
  418. drawItem.m_indexBufferView = &m_bufferViews[RenderTargetIndex::BufferViewIndex].m_indexBufferView;
  419. drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews.size());
  420. drawItem.m_streamBufferViews = m_bufferViews[RenderTargetIndex::BufferViewIndex].m_streamBufferViews.data();
  421. drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
  422. drawItem.m_shaderResourceGroups = shaderResourceGroups;
  423. // Submit the triangle draw item.
  424. commandList->Submit(drawItem);
  425. };
  426. m_scopeProducers.emplace_back(
  427. aznew RHI::ScopeProducerFunction<
  428. ScopeData,
  429. decltype(prepareFunction),
  430. decltype(compileFunction),
  431. decltype(executeFunction)>(
  432. AZ::RHI::ScopeId(scopeName),
  433. ScopeData{},
  434. prepareFunction,
  435. compileFunction,
  436. executeFunction));
  437. }
  438. void TextureMapExampleComponent::CreateRasterScope(int target, const AZ::RHI::ImageViewDescriptor& imageViewDescriptor, const char* scopeName)
  439. {
  440. using namespace AZ;
  441. struct ScopeData
  442. {
  443. };
  444. const auto prepareFunction = [this, target, imageViewDescriptor](RHI::FrameGraphInterface frameGraph, [[maybe_unused]] ScopeData& scopeData)
  445. {
  446. // Binds the swap chain as a color attachment.
  447. {
  448. RHI::ImageScopeAttachmentDescriptor descriptor;
  449. descriptor.m_attachmentId = m_outputAttachmentId;
  450. descriptor.m_loadStoreAction.m_loadAction = RHI::AttachmentLoadAction::Load;
  451. descriptor.m_loadStoreAction.m_storeAction = RHI::AttachmentStoreAction::Store;
  452. frameGraph.UseColorAttachment(descriptor);
  453. }
  454. // ShaderResourceGroup Texture input
  455. {
  456. RHI::ImageScopeAttachmentDescriptor desc;
  457. desc.m_attachmentId = m_attachmentID[target];
  458. desc.m_imageViewDescriptor = imageViewDescriptor;
  459. frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::Read);
  460. }
  461. // We will submit a single draw item.
  462. frameGraph.SetEstimatedItemCount(1);
  463. };
  464. const auto compileFunction = [this, target](const AZ::RHI::FrameGraphCompileContext& context, [[maybe_unused]] const ScopeData& scopeData)
  465. {
  466. const AZ::RHI::ImageView* imageView = context.GetImageView(m_attachmentID[target]);
  467. m_screenSRGs[target]->SetImageView(m_shaderInputImageIndices[target], imageView);
  468. m_screenSRGs[target]->Compile();
  469. };
  470. const auto executeFunction = [this, target](const RHI::FrameGraphExecuteContext& context, [[maybe_unused]] const ScopeData& scopeData)
  471. {
  472. RHI::CommandList* commandList = context.GetCommandList();
  473. // Set persistent viewport and scissor state.
  474. commandList->SetViewports(&m_viewport, 1);
  475. commandList->SetScissors(&m_scissor, 1);
  476. RHI::DrawIndexed drawIndexed;
  477. drawIndexed.m_indexCount = m_bufferViews[target].m_indexBufferView.GetByteCount() / sizeof(uint16_t);
  478. drawIndexed.m_instanceCount = 1;
  479. const RHI::ShaderResourceGroup* shaderResourceGroups[] = { m_screenSRGs[target]->GetRHIShaderResourceGroup() };
  480. RHI::DrawItem drawItem;
  481. drawItem.m_arguments = drawIndexed;
  482. drawItem.m_pipelineState = m_screenPipelineStates[target].get();
  483. drawItem.m_indexBufferView = &m_bufferViews[target].m_indexBufferView;
  484. drawItem.m_streamBufferViewCount = static_cast<uint8_t>(m_bufferViews[target].m_streamBufferViews.size());
  485. drawItem.m_streamBufferViews = m_bufferViews[target].m_streamBufferViews.data();
  486. drawItem.m_shaderResourceGroupCount = static_cast<uint8_t>(RHI::ArraySize(shaderResourceGroups));
  487. drawItem.m_shaderResourceGroups = shaderResourceGroups;
  488. // Submit the triangle draw item.
  489. commandList->Submit(drawItem);
  490. };
  491. m_scopeProducers.emplace_back(
  492. aznew RHI::ScopeProducerFunction<
  493. ScopeData,
  494. decltype(prepareFunction),
  495. decltype(compileFunction),
  496. decltype(executeFunction)>(
  497. AZ::RHI::ScopeId(scopeName),
  498. ScopeData{},
  499. prepareFunction,
  500. compileFunction,
  501. executeFunction));
  502. }
  503. void TextureMapExampleComponent::SetVertexUVWArray(VertexUVW* uvwBuffer, int arraySize)
  504. {
  505. for (int i = 0; i < arraySize; ++i)
  506. {
  507. SetVertexUVW(uvwBuffer, i * 4 + 0, 0.0f, 0.0f, static_cast<float>(i));
  508. SetVertexUVW(uvwBuffer, i * 4 + 1, 0.0f, 1.0f, static_cast<float>(i));
  509. SetVertexUVW(uvwBuffer, i * 4 + 2, 1.0f, 1.0f, static_cast<float>(i));
  510. SetVertexUVW(uvwBuffer, i * 4 + 3, 1.0f, 0.0f, static_cast<float>(i));
  511. }
  512. }
  513. void TextureMapExampleComponent::SetVertexIndexRectsCounterClock(uint16_t* indexBuffer, size_t arraySize)
  514. {
  515. uint16_t vertices = 0;
  516. for (int i = 0; i < arraySize; i += 6)
  517. {
  518. indexBuffer[i + 0] = vertices + 0;
  519. indexBuffer[i + 1] = vertices + 3;
  520. indexBuffer[i + 2] = vertices + 1;
  521. indexBuffer[i + 3] = vertices + 1;
  522. indexBuffer[i + 4] = vertices + 3;
  523. indexBuffer[i + 5] = vertices + 2;
  524. vertices += 4;
  525. }
  526. }
  527. void TextureMapExampleComponent::SetVertexUVWCubemap(VertexUVW* uvwBuffer)
  528. {
  529. SetVertexUVW(uvwBuffer, 0, -1.0f, -1.0f, -1.0f);
  530. SetVertexUVW(uvwBuffer, 1, -1.0f, -1.0f, 1.0f);
  531. SetVertexUVW(uvwBuffer, 2, -1.0f, 1.0f, 1.0f);
  532. SetVertexUVW(uvwBuffer, 3, -1.0f, 1.0f, -1.0f);
  533. SetVertexUVW(uvwBuffer, 4, -1.0f, -1.0f, -1.0f);
  534. SetVertexUVW(uvwBuffer, 5, -1.0f, -1.0f, 1.0f);
  535. SetVertexUVW(uvwBuffer, 6, 1.0f, -1.0f, 1.0f);
  536. SetVertexUVW(uvwBuffer, 7, 1.0f, -1.0f, -1.0f);
  537. SetVertexUVW(uvwBuffer, 8, 1.0f, -1.0f, -1.0f);
  538. SetVertexUVW(uvwBuffer, 9, 1.0f, -1.0f, 1.0f);
  539. SetVertexUVW(uvwBuffer, 10, 1.0f, 1.0f, 1.0f);
  540. SetVertexUVW(uvwBuffer, 11, 1.0f, 1.0f, -1.0f);
  541. SetVertexUVW(uvwBuffer, 12, -1.0f, -1.0f, 1.0f);
  542. SetVertexUVW(uvwBuffer, 13, -1.0f, 1.0f, 1.0f);
  543. SetVertexUVW(uvwBuffer, 14, 1.0f, 1.0f, 1.0f);
  544. SetVertexUVW(uvwBuffer, 15, 1.0f, -1.0f, 1.0f);
  545. SetVertexUVW(uvwBuffer, 16, -1.0f, -1.0f, -1.0f);
  546. SetVertexUVW(uvwBuffer, 17, -1.0f, 1.0f, -1.0f);
  547. SetVertexUVW(uvwBuffer, 18, 1.0f, 1.0f, -1.0f);
  548. SetVertexUVW(uvwBuffer, 19, 1.0f, -1.0f, -1.0f);
  549. SetVertexUVW(uvwBuffer, 20, -1.0f, 1.0f, -1.0f);
  550. SetVertexUVW(uvwBuffer, 21, -1.0f, 1.0f, 1.0f);
  551. SetVertexUVW(uvwBuffer, 22, 1.0f, 1.0f, 1.0f);
  552. SetVertexUVW(uvwBuffer, 23, 1.0f, 1.0f, -1.0f);
  553. }
  554. void TextureMapExampleComponent::SetVertexUVWXCubemapArray(VertexUVWX* uvwxBuffer, int arraySize)
  555. {
  556. for (int i = 0; i < arraySize; ++i)
  557. {
  558. SetVertexUVWX(uvwxBuffer, i * 24 + 0, 1.0f, -1.0f, -1.0f, static_cast<float>(i));
  559. SetVertexUVWX(uvwxBuffer, i * 24 + 1, 1.0f, -1.0f, 1.0f, static_cast<float>(i));
  560. SetVertexUVWX(uvwxBuffer, i * 24 + 2, 1.0f, 1.0f, 1.0f, static_cast<float>(i));
  561. SetVertexUVWX(uvwxBuffer, i * 24 + 3, 1.0f, 1.0f, -1.0f, static_cast<float>(i));
  562. SetVertexUVWX(uvwxBuffer, i * 24 + 4, -1.0f, -1.0f, -1.0f, static_cast<float>(i));
  563. SetVertexUVWX(uvwxBuffer, i * 24 + 5, -1.0f, -1.0f, 1.0f, static_cast<float>(i));
  564. SetVertexUVWX(uvwxBuffer, i * 24 + 6, -1.0f, 1.0f, 1.0f, static_cast<float>(i));
  565. SetVertexUVWX(uvwxBuffer, i * 24 + 7, -1.0f, 1.0f, -1.0f, static_cast<float>(i));
  566. SetVertexUVWX(uvwxBuffer, i * 24 + 8, -1.0f, 1.0f, -1.0f, static_cast<float>(i));
  567. SetVertexUVWX(uvwxBuffer, i * 24 + 9, -1.0f, 1.0f, 1.0f, static_cast<float>(i));
  568. SetVertexUVWX(uvwxBuffer, i * 24 + 10, 1.0f, 1.0f, 1.0f, static_cast<float>(i));
  569. SetVertexUVWX(uvwxBuffer, i * 24 + 11, 1.0f, 1.0f, -1.0f, static_cast<float>(i));
  570. SetVertexUVWX(uvwxBuffer, i * 24 + 12, -1.0f, -1.0f, -1.0f, static_cast<float>(i));
  571. SetVertexUVWX(uvwxBuffer, i * 24 + 13, -1.0f, -1.0f, 1.0f, static_cast<float>(i));
  572. SetVertexUVWX(uvwxBuffer, i * 24 + 14, 1.0f, -1.0f, 1.0f, static_cast<float>(i));
  573. SetVertexUVWX(uvwxBuffer, i * 24 + 15, 1.0f, -1.0f, -1.0f, static_cast<float>(i));
  574. SetVertexUVWX(uvwxBuffer, i * 24 + 16, -1.0f, -1.0f, 1.0f, static_cast<float>(i));
  575. SetVertexUVWX(uvwxBuffer, i * 24 + 17, -1.0f, 1.0f, 1.0f, static_cast<float>(i));
  576. SetVertexUVWX(uvwxBuffer, i * 24 + 18, 1.0f, 1.0f, 1.0f, static_cast<float>(i));
  577. SetVertexUVWX(uvwxBuffer, i * 24 + 19, 1.0f, -1.0f, 1.0f, static_cast<float>(i));
  578. SetVertexUVWX(uvwxBuffer, i * 24 + 20, -1.0f, -1.0f, -1.0f, static_cast<float>(i));
  579. SetVertexUVWX(uvwxBuffer, i * 24 + 21, -1.0f, 1.0f, -1.0f, static_cast<float>(i));
  580. SetVertexUVWX(uvwxBuffer, i * 24 + 22, 1.0f, 1.0f, -1.0f, static_cast<float>(i));
  581. SetVertexUVWX(uvwxBuffer, i * 24 + 23, 1.0f, -1.0f, -1.0f, static_cast<float>(i));
  582. }
  583. }
  584. void TextureMapExampleComponent::SetVertexPositionTransform(VertexPosition* positionBuffer, int bufferIndex, AZ::Matrix3x3 transform, float translateX, float translateY)
  585. {
  586. transform.SetColumn(2, AZ::Vector3(translateX, translateY, 0.0));
  587. AZ::Vector3 transformedVertex = transform * m_baseRectangle[0];
  588. positionBuffer[bufferIndex].m_position[0] = transformedVertex.GetX();
  589. positionBuffer[bufferIndex].m_position[1] = transformedVertex.GetY();
  590. positionBuffer[bufferIndex].m_position[2] = 0;
  591. transformedVertex = transform * m_baseRectangle[1];
  592. positionBuffer[bufferIndex + 1].m_position[0] = transformedVertex.GetX();
  593. positionBuffer[bufferIndex + 1].m_position[1] = transformedVertex.GetY();
  594. positionBuffer[bufferIndex + 1].m_position[2] = 0;
  595. transformedVertex = transform * m_baseRectangle[2];
  596. positionBuffer[bufferIndex + 2].m_position[0] = transformedVertex.GetX();
  597. positionBuffer[bufferIndex + 2].m_position[1] = transformedVertex.GetY();
  598. positionBuffer[bufferIndex + 2].m_position[2] = 0;
  599. transformedVertex = transform * m_baseRectangle[3];
  600. positionBuffer[bufferIndex + 3].m_position[0] = transformedVertex.GetX();
  601. positionBuffer[bufferIndex + 3].m_position[1] = transformedVertex.GetY();
  602. positionBuffer[bufferIndex + 3].m_position[2] = 0;
  603. }
  604. void TextureMapExampleComponent::SetVertexPositionArray(VertexPosition* positionBuffer, float scale, float translateX, float translateY)
  605. {
  606. AZ::Matrix3x3 transform = AZ::Matrix3x3::CreateScale(AZ::Vector3(scale, scale, 1));
  607. for (int i = 0; i < s_arraySize; ++i)
  608. {
  609. SetVertexPositionTransform(positionBuffer, i * 4, transform, translateX, translateY + 0.2f*i );
  610. }
  611. }
  612. void TextureMapExampleComponent::SetVertexPositionCubemap(VertexPosition* positionBuffer, int bufferIndex, float translateX, float translateY)
  613. {
  614. AZ::Matrix3x3 transform = AZ::Matrix3x3::CreateScale(AZ::Vector3(0.05, 0.05, 1));
  615. SetVertexPositionTransform(positionBuffer, bufferIndex + 0, transform, translateX, translateY);
  616. SetVertexPositionTransform(positionBuffer, bufferIndex + 4, transform, translateX, translateY + 0.1f);
  617. SetVertexPositionTransform(positionBuffer, bufferIndex + 8, transform, translateX, translateY + 0.2f);
  618. SetVertexPositionTransform(positionBuffer, bufferIndex + 12, transform, translateX - 0.1f, translateY + 0.2f);
  619. SetVertexPositionTransform(positionBuffer, bufferIndex + 16, transform, translateX + 0.1f, translateY + 0.2f);
  620. SetVertexPositionTransform(positionBuffer, bufferIndex + 20, transform, translateX, translateY + 0.3f);
  621. }
  622. void TextureMapExampleComponent::InitBufferView(int target,
  623. uint32_t posSize, void* posData,
  624. uint32_t uvSize, void* uvData, uint32_t uvTypeSize,
  625. uint32_t indexSize, void* indexData)
  626. {
  627. m_positionBuffer[target] = AZ::RHI::Factory::Get().CreateBuffer();
  628. AZ::RHI::ResultCode result = AZ::RHI::ResultCode::Success;
  629. AZ::RHI::BufferInitRequest request;
  630. request.m_buffer = m_positionBuffer[target].get();
  631. request.m_descriptor = AZ::RHI::BufferDescriptor{ AZ::RHI::BufferBindFlags::InputAssembly, posSize };
  632. request.m_initialData = posData;
  633. result = m_inputAssemblyBufferPool->InitBuffer(request);
  634. if (result != AZ::RHI::ResultCode::Success)
  635. {
  636. AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
  637. }
  638. m_bufferViews[target].m_streamBufferViews[0] =
  639. {
  640. *m_positionBuffer[target],
  641. 0,
  642. posSize,
  643. sizeof(VertexPosition)
  644. };
  645. m_uvBuffer[target] = AZ::RHI::Factory::Get().CreateBuffer();
  646. request.m_buffer = m_uvBuffer[target].get();
  647. request.m_descriptor = AZ::RHI::BufferDescriptor{ AZ::RHI::BufferBindFlags::InputAssembly, uvSize };
  648. request.m_initialData = uvData;
  649. result = m_inputAssemblyBufferPool->InitBuffer(request);
  650. if (result != AZ::RHI::ResultCode::Success)
  651. {
  652. AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
  653. }
  654. m_bufferViews[target].m_streamBufferViews[1] =
  655. {
  656. *m_uvBuffer[target],
  657. 0,
  658. uvSize,
  659. uvTypeSize
  660. };
  661. m_indexBuffer[target] = AZ::RHI::Factory::Get().CreateBuffer();
  662. request.m_buffer = m_indexBuffer[target].get();
  663. request.m_descriptor = AZ::RHI::BufferDescriptor{ AZ::RHI::BufferBindFlags::InputAssembly, indexSize };
  664. request.m_initialData = indexData;
  665. result = m_inputAssemblyBufferPool->InitBuffer(request);
  666. if (result != AZ::RHI::ResultCode::Success)
  667. {
  668. AZ_Error(s_textureMapExampleName, false, "Failed to initialize buffer with error code %d", result);
  669. }
  670. m_bufferViews[target].m_indexBufferView =
  671. {
  672. *m_indexBuffer[target],
  673. 0,
  674. indexSize,
  675. AZ::RHI::IndexFormat::Uint16
  676. };
  677. }
  678. }