TextureMapExampleComponent.cpp 43 KB

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