{"id":3188,"date":"2015-07-13T08:04:01","date_gmt":"2015-07-13T08:04:01","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3188"},"modified":"2016-02-04T18:38:53","modified_gmt":"2016-02-04T18:38:53","slug":"une-skybox-pour-afficher-un-ciel-autour-de-votre-camera","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3188","title":{"rendered":"Une classe Skybox pour afficher un ciel autour de votre cam\u00e9ra &#8211; 1\u00e8re approche"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/skybox.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3189\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/skybox.png\" alt=\"skybox\" width=\"417\" height=\"326\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/skybox.png 813w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/skybox-300x235.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/skybox-624x488.png 624w\" sizes=\"(max-width: 417px) 100vw, 417px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Pour que votre sc\u00e8ne soit r\u00e9aliste, il peut \u00eatre utile d&rsquo;afficher un d\u00e9cor de ciel de grande taille autour de la cam\u00e9ra.<\/p>\n<p>Ceci constitue une <strong>premi\u00e8re approche<\/strong> \u00e0 l&rsquo;affichage d&rsquo;une Skybox.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir utiliser la classe <em>ShaderTechnique<\/em>. Voir cet article.<\/p>\n<p>&#8211; Savoir utiliser la classe <em>MeshSceneNode<\/em>. Voir cet article.<\/p>\n<p>&#8211; Savoir un peu utiliser <em>DirectX 10<\/em>.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Tout d&rsquo;abord la classe d\u00e9rivant ShaderTechnique :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/------------------------------------------------------\r\n\/\/ Une simple effet affichant une SkyBox\r\n\/\/------------------------------------------------------\r\nclass ShaderTechnique_SkyBox : public ShaderTechnique\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0friend class SkyBoxSceneNode;\r\n\r\n\u00a0\u00a0 \u00a0ShaderTechnique_SkyBox();\r\n\u00a0\u00a0 \u00a0virtual ~ShaderTechnique_SkyBox();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool Initialize();\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n};\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici ensuite le fichier ShaderTechnique_SkyBox.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nShaderTechnique_SkyBox::ShaderTechnique_SkyBox() :\r\nShaderTechnique(&quot;SkyBox.fx&quot;, &quot;Render&quot;, VertexLayoutType::PTN_VERTEX)\r\n{\r\n}\r\n\r\nShaderTechnique_SkyBox::~ShaderTechnique_SkyBox()\r\n{\r\n}\r\n\r\nbool ShaderTechnique_SkyBox::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0ShaderTechnique::Initialize();\r\n\r\n\u00a0\u00a0 \u00a0SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid ShaderTechnique_SkyBox::SetupShaderVariables()\r\n{\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;World&quot;, ShaderVariableType::WORLD);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;View&quot;, ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;Projection&quot;, ShaderVariableType::PROJECTION);\r\n\r\n\u00a0\u00a0 \u00a0RegisterTextureVariable(&quot;txFace&quot;);\r\n}\r\n\r\nvoid ShaderTechnique_SkyBox::Update(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::WORLD);\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::PROJECTION);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SkyBoxSceneNode.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SKY_BOX_SCENE_NODE_H\r\n#define SKY_BOX_SCENE_NODE_H\r\n\r\nclass SkyBoxSceneNode : public MeshSceneNode\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0SkyBoxSceneNode(ID3D10ShaderResourceView* pTop, ID3D10ShaderResourceView* pBottom,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pLeft, ID3D10ShaderResourceView* pRight,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pFront, ID3D10ShaderResourceView* pBack);\r\n\r\n\u00a0\u00a0 \u00a0virtual ~SkyBoxSceneNode();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool Initialize();\r\n\u00a0\u00a0 \u00a0virtual void Render(float fTimeSinceLastFrame);\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0virtual void OnPreRender(float fTimeSinceLastFrame);\r\n\u00a0\u00a0 \u00a0virtual void OnPostRender(float fTimeSinceLastFrame);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0PTNVertex SetVertex(D3DXVECTOR3 p, D3DXVECTOR2 t, D3DXVECTOR3 n);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pFrontTex;\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pLeftTex;\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pBackTex;\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pRightTex;\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pTopTex;\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* m_pBottomTex;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pFrontVB;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pLeftVB;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pBackVB;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pRightVB;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pTopVB;\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* m_pBottomVB;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SkyBoxSceneNode.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;SkyBoxSceneNode.h&quot;\r\n\r\nSkyBoxSceneNode::SkyBoxSceneNode(ID3D10ShaderResourceView* pTop, ID3D10ShaderResourceView* pBottom,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pLeft, ID3D10ShaderResourceView* pRight,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pFront, ID3D10ShaderResourceView* pBack) :\r\nm_pFrontVB(nullptr),\r\nm_pLeftVB(nullptr),\r\nm_pBackVB(nullptr),\r\nm_pRightVB(nullptr),\r\nm_pTopVB(nullptr),\r\nm_pBottomVB(nullptr),\r\nm_pFrontTex(pFront),\r\nm_pLeftTex(pLeft),\r\nm_pBackTex(pBack),\r\nm_pRightTex(pRight),\r\nm_pTopTex(pTop),\r\nm_pBottomTex(pBottom)\r\n{\r\n\u00a0\u00a0 \u00a0SetVertexType(VertexLayoutType::PTN_VERTEX);\r\n\u00a0\u00a0 \u00a0SetDrawMethod(DrawMethod::DRAW_INDEXED);\r\n\u00a0\u00a0 \u00a0SetTopology(D3D_PRIMITIVE_TOPOLOGY::D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\r\n\r\n\u00a0\u00a0 \u00a0SetShaderTechnique( SHADER_MANAGER-&gt;GetShader(&quot;SkyBox&quot;) );\r\n}\r\n\r\nSkyBoxSceneNode::~SkyBoxSceneNode()\r\n{\r\n}\r\n\r\nPTNVertex SkyBoxSceneNode::SetVertex(D3DXVECTOR3 p, D3DXVECTOR2 t, D3DXVECTOR3 n)\r\n{\r\n\u00a0\u00a0 \u00a0PTNVertex vertex;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0vertex.position = p;\r\n\u00a0\u00a0 \u00a0vertex.texture = t;\r\n\u00a0\u00a0 \u00a0vertex.normal = n;\r\n\r\n\u00a0\u00a0 \u00a0return vertex;\r\n}\r\n\r\nbool SkyBoxSceneNode::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0std::vector&lt;unsigned short&gt; indices;\r\n\r\n\u00a0\u00a0 \u00a0indices.push_back(3);\r\n\u00a0\u00a0 \u00a0indices.push_back(1);\r\n\u00a0\u00a0 \u00a0indices.push_back(0);\r\n\u00a0\u00a0 \u00a0indices.push_back(2);\r\n\u00a0\u00a0 \u00a0indices.push_back(1);\r\n\u00a0\u00a0 \u00a0indices.push_back(3);\r\n\r\n\u00a0\u00a0 \u00a0BuildIB(indices);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On redecoupe les bords des textures pour \u00e9viter\r\n\u00a0\u00a0 \u00a0\/\/ d'afficher les arr\u00eates du cube\r\n\u00a0\u00a0 \u00a0float fTextureWidth = GetShaderTextureViewSize(m_pBottomTex).x;\r\n\r\n\u00a0\u00a0 \u00a0float onepixel = 1.0f \/ (fTextureWidth * 1.5f);\r\n\u00a0\u00a0 \u00a0float t = 1.0f - onepixel;\r\n\u00a0\u00a0 \u00a0float o = 0.0f + onepixel;\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;PTNVertex&gt; vertices;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Front side\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 0, 1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1,-1,-1),\u00a0 D3DXVECTOR2(o, t), D3DXVECTOR3(0, 0, 1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1, 1,-1),\u00a0 D3DXVECTOR2(o, o), D3DXVECTOR3(0, 0, 1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 0, 1.0f)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pFrontVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Left side\r\n\u00a0\u00a0 \u00a0vertices.clear();\r\n\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1,-1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(-1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1,-1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(-1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(-1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(-1, 0, 0)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pLeftVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Back side\r\n\u00a0\u00a0 \u00a0vertices.clear();\r\n\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 0, -1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, 0, -1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, 0, -1.0f)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 0, -1.0f)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pBackVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Right side\r\n\u00a0\u00a0 \u00a0vertices.clear();\r\n\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(o, t), D3DXVECTOR3(1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(o, o), D3DXVECTOR3(1, 0, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(1, 0, 0)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pRightVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Top side\r\n\u00a0\u00a0 \u00a0vertices.clear();\r\n\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1,-1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, -1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1, 1, 1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, -1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1, 1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, -1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1, 1,-1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, -1, 0)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pTopVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Bottom side\r\n\u00a0\u00a0 \u00a0vertices.clear();\r\n\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1, 1), D3DXVECTOR2(t, t), D3DXVECTOR3(0, 1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3( 1,-1,-1), D3DXVECTOR2(o, t), D3DXVECTOR3(0, 1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1,-1), D3DXVECTOR2(o, o), D3DXVECTOR3(0, 1, 0)));\r\n\u00a0\u00a0 \u00a0vertices.push_back( SetVertex(D3DXVECTOR3(-1,-1, 1), D3DXVECTOR2(t, o), D3DXVECTOR3(0, 1, 0)));\r\n\r\n\u00a0\u00a0 \u00a0BuildVB(vertices);\r\n\r\n\u00a0\u00a0 \u00a0m_pBottomVB = GetVertexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid SkyBoxSceneNode::Render(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(false);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pFrontVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pFrontTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pLeftVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pLeftTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pBackVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pBackTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pRightVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pRightTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pTopVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pTopTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0SetVertexBuffer(m_pBottomVB);\r\n\u00a0\u00a0 \u00a0GetShaderTechnique()-&gt;SetTextureRV(&quot;txFace&quot;, m_pBottomTex);\r\n\u00a0\u00a0 \u00a0Renderable::Render(fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(true);\r\n}\r\n\r\nvoid SkyBoxSceneNode::OnPreRender(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0Camera* pCamera = SCENE_MANAGER-&gt;GetActiveCamera();\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX finalMatrix;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX translate;\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 cameraPos = pCamera-&gt;GetPosition();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On centre toujours la skybox autour de la position de la cam\u00e9ra\r\n\u00a0\u00a0 \u00a0D3DXMatrixTranslation(&amp;translate, cameraPos.x, cameraPos.y, cameraPos.z);\r\n\r\n\u00a0\u00a0 \u00a0float viewDistance = (pCamera-&gt;GerNearValue() + pCamera-&gt;GetFarValue()) * 0.5f;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On agrandie la skybox pour qu'elle est une bonne taille\r\n\u00a0\u00a0 \u00a0D3DXMATRIX scale;\r\n\u00a0\u00a0 \u00a0D3DXMatrixScaling(&amp;scale, viewDistance, viewDistance, viewDistance);\r\n\r\n\u00a0\u00a0 \u00a0finalMatrix = scale * translate;\r\n\r\n\u00a0\u00a0 \u00a0SCENE_MANAGER-&gt;PushAndSetMatrix(finalMatrix);\r\n}\r\n\r\nvoid SkyBoxSceneNode::OnPostRender(float fTimeSinceLastFrame)\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0SCENE_MANAGER-&gt;PopMatrix();\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SkyBox.fx :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmatrix World;\r\nmatrix View;\r\nmatrix Projection;\r\n\r\nTexture2D txFace;\r\n\r\nSamplerState samLinear\r\n{\r\n\u00a0\u00a0\u00a0 Filter = MIN_MAG_MIP_LINEAR;\r\n\u00a0\u00a0\u00a0 AddressU = Wrap;\r\n\u00a0\u00a0\u00a0 AddressV = Wrap;\r\n};\r\n\r\nstruct VS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : POSITION;\r\n\u00a0\u00a0\u00a0 float2 Tex : TEXCOORD;\r\n\u00a0\u00a0\u00a0 float3 Norm : NORMAL;\r\n};\r\n\r\nstruct PS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : SV_POSITION;\r\n\u00a0\u00a0\u00a0 float2 Tex : TEXCOORD0;\r\n\u00a0\u00a0\u00a0 float3 Norm : NORMAL;\r\n};\r\n\r\nPS_INPUT VS( VS_INPUT input )\r\n{\r\n\u00a0\u00a0\u00a0 PS_INPUT output = (PS_INPUT)0;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 output.Pos = mul( input.Pos, World );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, View );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, Projection );\r\n\r\n\u00a0\u00a0\u00a0 output.Tex = input.Tex;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 output.Norm = mul( input.Norm, World );\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 return output;\r\n}\r\n\r\nfloat4 PS( PS_INPUT input) : SV_Target\r\n{\r\n\u00a0\u00a0 \u00a0float4 textureColor = txFace.Sample(samLinear, input.Tex);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 return textureColor;\r\n}\r\n\r\ntechnique10 Render\r\n{\r\n\u00a0\u00a0\u00a0 pass P0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetVertexShader( CompileShader( vs_4_0, VS() ) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetGeometryShader( NULL );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetPixelShader( CompileShader( ps_4_0, PS() ) );\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 un \u00e9norme cube autour de la cam\u00e9ra qui servira de ciel ou de d\u00e9cor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Pour que votre sc\u00e8ne soit r\u00e9aliste, il peut \u00eatre utile d&rsquo;afficher un d\u00e9cor de ciel de grande taille autour de la cam\u00e9ra. Ceci constitue une premi\u00e8re approche \u00e0 l&rsquo;affichage d&rsquo;une Skybox. Pr\u00e9requis : &#8211; Savoir utiliser la classe ShaderTechnique. Voir cet article. &#8211; Savoir utiliser la classe MeshSceneNode. Voir cet article. &#8211; Savoir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3188"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3188"}],"version-history":[{"count":23,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3188\/revisions"}],"predecessor-version":[{"id":4707,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3188\/revisions\/4707"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}