2017-05-29 5 views
0

J'essaie de rendre la texture sur un cube. Cependant, je fais quelque chose de mal. J'ai la texture mais les coordonnées me semblent fausses et je ne sais pas comment le régler correctement. Qu'est-ce que je rate ? Je pense que je dois faire quelque chose à propos de IndexBuffer et UV. Cependant, mon esprit est très mélangé.C# SharpDX comment définir correctement les coordonnées de texture?

Le résultat je reçois: https://www.youtube.com/watch?v=_fdJAaU81sQ

Mesh.cs

public class Mesh : IDisposable 
    { 
     public string File; 
     public string Name; 
     public Vector4[] Vertices { get; set; } 
     public int VerticesCount=0; 
     public Vector3 Position; //BASED ON PIVOT 
     public Vector3 PivotPosition; //MOVE MESH BASED ON THIS POSITION 
     public Vector3 Rotation; 
     public double Weight; 
     public SharpDX.Direct3D11.Device d3dDevice; 
     public SharpDX.Direct3D11.Buffer VerticesBuffer; 

     public bool IsDisposed=false; 
     public bool IsSelected = false; 
     public int Triangles; 
     public string Texture_DiffuseMap;     

     public Mesh(string _name, Vector4[] _vertices, string _file, SharpDX.Direct3D11.Device _device, string _Texture_DiffuseMap = "") 
     { 
      Vertices = new[] 
      { 
       new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front 
       new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), 
       new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), // BACK 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), // Top 
       new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), // Bottom 
       new Vector4(1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), 
       new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), // Left 
       new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), // Right 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), 
       new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), 
      }; 
      Texture_DiffuseMap = _Texture_DiffuseMap; 
      _vertices = Vertices; 
      d3dDevice = _device; 
      VerticesCount = Vertices.Count(); 

      Name = _name; 
      File = _file; 
      Meshes.Add(this); 
     } 

     // Other functions go here... 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
      IsDisposed = true; 

     } 

     protected virtual void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       Dispose(); 
      } 
      // free native resources if there are any. 
      VerticesBuffer.Dispose(); 
      IsDisposed = true; 
     } 

     public void Render() 
     { 

      d3dDevice.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; 
      d3dDevice.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VerticesBuffer, Utilities.SizeOf<Vector4>() * 2, 0)); 


      d3dDevice.ImmediateContext.Draw(VerticesCount,0); 


      /*d3dDevice.ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.LineList; 

      d3dDevice.ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VerticesBuffer, Utilities.SizeOf<Vector4>() * 2, 0)); 

      d3dDevice.ImmediateContext.Draw(VerticesCount, 0); 
      */ 
      VerticesBuffer.Dispose(); 
     } 
    } 

Program.cs

  [STAThread] 
    private static void Main() 
    { 
     new Thread(new ThreadStart(() => 
     { 
      DisposeCollector DC=new DisposeCollector(); 
      var form = new RenderForm(Globals.Window_Title) { Width = Globals.Window_Size.Width, Height = Globals.Window_Size.Height, AllowUserResizing = false, MinimizeBox = false }; 
      InputHandler IHandler = new InputHandler(form); 
      SampleDescription SamplerDesc = new SampleDescription(8, 0); 
      // SwapChain description 
      var desc = new SwapChainDescription() 
      { 
       BufferCount = 2, 
       ModeDescription = new ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm), 
       IsWindowed = true, 
       OutputHandle = form.Handle, 
       SampleDescription = SamplerDesc, 
       SwapEffect = SwapEffect.Discard, 
       Usage = Usage.RenderTargetOutput 
      }; 

      var samplerStateDescription = new SamplerStateDescription 
      { 
       AddressU = TextureAddressMode.Wrap, 
       AddressV = TextureAddressMode.Wrap, 
       AddressW = TextureAddressMode.Wrap, 
       Filter = Filter.MinMagMipLinear 
      }; 
      var rasterizerStateDescription = RasterizerStateDescription.Default(); 
      rasterizerStateDescription.IsFrontCounterClockwise = true; 

      // Used for debugging dispose object references 
      Configuration.EnableObjectTracking = true; 

      // Disable throws on shader compilation errors 
      Configuration.ThrowOnShaderCompileError = false; 

      SharpDX.DXGI.Factory factory = new SharpDX.DXGI.Factory1(); 
      SharpDX.DXGI.Adapter adapter = factory.GetAdapter(1); 

      Adapter[] availableAdapters = factory.Adapters; 
      foreach(Adapter _adapter in availableAdapters) 
      { 
       Console.WriteLine(_adapter.Description.Description); 
      } 
      // Create Device and SwapChain 
      Device device; 
      SwapChain swapChain; 
      Device.CreateWithSwapChain(adapter, DeviceCreationFlags.SingleThreaded, desc, out device, out swapChain); 

      var context = device.ImmediateContext; 

      //factory.MakeWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAll); 

      // Compile Vertex and Pixel shaders 
      var vertexShaderByteCode = ShaderBytecode.CompileFromFile("MiniCube.hlsl", "VS", "vs_5_0", ShaderFlags.Debug); 
      var vertexShader = new VertexShader(device, vertexShaderByteCode); 

      var pixelShaderByteCode = ShaderBytecode.CompileFromFile("MiniCube.hlsl", "PS", "ps_5_0", ShaderFlags.Debug); 
      var pixelShader = new PixelShader(device, pixelShaderByteCode); 

      var signature = ShaderSignature.GetInputSignature(vertexShaderByteCode); 

      // Layout from VertexShader input signature 
      var layout = new InputLayout(device, signature, new[] 
      { 
      new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), 
      new InputElement("NORMAL", 0, Format.R32G32B32A32_Float, 0, 0), 
      new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0), 
      new InputElement("TEXCOORD", 0, Format.R32G32_Float, InputElement.AppendAligned, 0) 

      }); 

      var samplerState = new SamplerState(device, samplerStateDescription); 

      Mesh mesh1 = new Mesh("mesh1", new[] { new Vector4(0, 0, 0, 1) }, "", device, "1_Purple.jpg") { IsSelected=true }; 
      Mesh mesh2 = new Mesh("mesh2", new[] { new Vector4(0, 0, 0, 1) }, "", device, "1_GREEN.jpg"); 
      //MenuCreator menu1 = new MenuCreator(device,new[] {new Vector4(0, 0, 0, 0) }); 
      // Create Constant Buffer 
      var contantBuffer = new Buffer(device, Utilities.SizeOf<Matrix>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); 

      ShaderResourceView textureView; 
      SharpDX.WIC.ImagingFactory2 ImagingFactory2 = new SharpDX.WIC.ImagingFactory2(); 

      // Prepare All the stages 
      context.InputAssembler.InputLayout = layout; 


      context.VertexShader.SetConstantBuffer(0, contantBuffer); 
      context.VertexShader.Set(vertexShader); 
      context.PixelShader.Set(pixelShader); 
      context.PixelShader.SetSampler(0, samplerState); 
      //context.PixelShader.SetShaderResource(0, textureView); 

      Matrix proj = Matrix.Identity; 

      // Use clock 
      var clock = new Stopwatch(); 
      FPS fps = new FPS(); 
      clock.Start(); 

      // Declare texture for rendering 
      bool userResized = true; 
      Texture2D backBuffer = null; 
      RenderTargetView renderView = null; 
      Texture2D depthBuffer = null; 
      DepthStencilView depthView = null; 

      // Setup handler on resize form 
      form.UserResized += (sender, args) => userResized = true; 

      // Setup full screen mode change F5 (Full) F4 (Window) 
      form.KeyUp += (sender, args) => 
      { 
       if (args.KeyCode == Keys.F5) 
       swapChain.SetFullscreenState(true, null); 
       else if (args.KeyCode == Keys.F4) 
        swapChain.SetFullscreenState(false, null); 
       else if (args.KeyCode == Keys.Escape) 
        form.Close(); 
      }; 

      //CREATE DEPTH STENCIL DESCRIPTION 
      DepthStencilStateDescription depthSSD = new DepthStencilStateDescription(); 
      depthSSD.IsDepthEnabled = false; 
      depthSSD.DepthComparison = Comparison.LessEqual; 
      depthSSD.DepthWriteMask = DepthWriteMask.Zero; 
      DepthStencilState DSState = new DepthStencilState(device, depthSSD); 

      Camera camera = new Camera(); 
      camera.eye = new Vector3(0, 0, -5); 
      camera.target = new Vector3(0, 0, 0); 
      Globals.Render = true; 
      /*void DrawEmptyCircle(Vector3 startPoint, Vector2 radius, Color color) 
      { 
       List<VertexPositionColor> circle = new List<VertexPositionColor>(); 
       float X, Y; 

       var stepDegree = 0.3f; 
       for (float angle = 0; angle <= 360; angle += stepDegree) 
       { 
        X = startPoint.X + radius.X * (float)Math.Cos((angle)); 
        Y = startPoint.Y + radius.Y * (float)Math.Sin((angle)); 
        Vector3 point = new Vector3(X, Y, 0); 
        circle.Add(new VertexPositionColor(point, color)); 
       } 
      }*/ 
      CubeApp.Windows.SystemInformation.Print(CubeApp.Windows.SystemInformation.GetSystemInformation()); 
      HardwareInformation.GetHardwareInformation("Win32_DisplayConfiguration", "Description"); 

      // Main loop 
      RenderLoop.Run(form,() => 
      { 


        fps.Count();fps.setFormHeader(form); 
       // Prepare matrices 
       if (Globals.Render) 
       { 
        var view = camera.getView(); 

       // If Form resized 
       if (userResized) 
       { 
        // Dispose all previous allocated resources 
        Utilities.Dispose(ref backBuffer); 
        Utilities.Dispose(ref renderView); 
        Utilities.Dispose(ref depthBuffer); 
        Utilities.Dispose(ref depthView); 

         foreach (Mesh _mesh in Meshes.MeshCollection) 
        { 
         if (_mesh.IsDisposed == false) 
         { 
          Utilities.Dispose(ref _mesh.VerticesBuffer); 
         } 
        } 

         // Resize the backbuffer 
         swapChain.ResizeBuffers(desc.BufferCount, form.ClientSize.Width, form.ClientSize.Height, Format.Unknown, SwapChainFlags.None); 
         // Get the backbuffer from the swapchain 
         backBuffer = Texture2D.FromSwapChain<Texture2D>(swapChain, 0); 
         // Renderview on the backbuffer 
         renderView = new RenderTargetView(device, backBuffer); 
         // Create the depth buffer 
         depthBuffer = new Texture2D(device, new Texture2DDescription() 
         { 
          Format = Format.D32_Float_S8X24_UInt, 
          ArraySize = 1, 
          MipLevels = 1, 
          Width = form.ClientSize.Width, 
          Height = form.ClientSize.Height, 
          SampleDescription = SamplerDesc, 
          Usage = ResourceUsage.Default, 
          BindFlags = BindFlags.DepthStencil, 
          CpuAccessFlags = CpuAccessFlags.None, 
          OptionFlags = ResourceOptionFlags.None 
         }); 

         // Create the depth buffer view 
         depthView = new DepthStencilView(device, depthBuffer); 
         // Setup targets and viewport for rendering 
         context.Rasterizer.SetViewport(new Viewport(0, 0, form.ClientSize.Width, form.ClientSize.Height, 0.0f, 1.0f)); 
         //context.OutputMerger.SetDepthStencilState(DSState); 
         context.OutputMerger.SetTargets(depthView, renderView); 
         // Setup new projection matrix with correct aspect ratio 
         proj = Matrix.PerspectiveFovLH((float)Math.PI/4.0f, form.ClientSize.Width/(float)form.ClientSize.Height, 0.1f, 100.0f); 
         // We are done resizing 
         userResized = false; 
        } 
        var time = clock.ElapsedMilliseconds/1000.0f; 
        var viewProj = Matrix.Multiply(view, proj); 

      // Clear views 
      context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0); 
      context.ClearRenderTargetView(renderView, Color.WhiteSmoke); 

      // Update WorldViewProj Matrix 
      var worldViewProj = Matrix.RotationX(45) * Matrix.RotationY(0 * 2) * Matrix.RotationZ(0 * .7f) * viewProj; 
      worldViewProj.Transpose(); 
      context.UpdateSubresource(ref worldViewProj, contantBuffer); 

       //Update Camera Position 
       Vector3 _camEye = camera.eye; 
       Vector3 _camTarget = camera.target; 

       if (IHandler.KeyW) 
       { 
        _camEye.Z+= 0.050f; _camTarget.Z += 0.050f; 
       } 
       if (IHandler.KeyS) 
       { 
        _camEye.Z -= 0.050f; _camTarget.Z -= 0.050f; 
       } 
       if (IHandler.KeyA) 
       { 
         _camEye.X -= 0.050f; _camTarget.X -= 0.050f; 

       } 
       if (IHandler.KeyD) 
       { 
        _camTarget.X += 0.050f; 
        _camEye.X += 0.050f; 

       } 
       if (IHandler.KeyQ) 
       { 

       } 
       camera.eye = _camEye; 
       camera.target = _camTarget; 
       camera.updateView(); 

       // Draw the cube 
       foreach (Mesh __mesh in Meshes.MeshCollection) 
       { 
        if (__mesh.IsSelected) 
        { 
         for (int i = 0; i <= __mesh.VerticesCount - 1; i++) 
         { 
          if (IHandler.KeyRight) __mesh.Vertices[i].X += 0.050f; 
          if (IHandler.KeyLeft) __mesh.Vertices[i].X -= 0.050f; 
          if (IHandler.KeyUp) __mesh.Vertices[i].Y += 0.050f; 
          if (IHandler.KeyDown) __mesh.Vertices[i].Y -= 0.050f; 
         } 
       } 
         var texture = TextureLoader.CreateTexture2DFromBitmap(device, TextureLoader.LoadBitmap(ImagingFactory2, __mesh.Texture_DiffuseMap)); 
         textureView = new ShaderResourceView(device, texture); 

         context.PixelShader.SetShaderResource(0, textureView); 
         texture.Dispose(); 
         textureView.Dispose(); 
         __mesh.VerticesBuffer = SharpDX.Direct3D11.Buffer.Create(device, BindFlags.VertexBuffer, __mesh.Vertices); 
        //EnvironmentDisplayModes.SetDisplayMode(device, __mesh, EnvironmentDisplayModes.DisplayMode.Standart); 
        __mesh.Render(); 
      } 

      // Present! 
      swapChain.Present(0, PresentFlags.None); 
       } 
      }); 
      // Release all resources 
      foreach (Mesh msh in Meshes.MeshCollection) 
      { 
       msh.d3dDevice.Dispose(); 
       msh.VerticesBuffer.Dispose(); 
      } 
     DC.DisposeAndClear(); 
     signature.Dispose(); 
     vertexShaderByteCode.Dispose(); 
     vertexShader.Dispose(); 
     pixelShaderByteCode.Dispose(); 
     pixelShader.Dispose(); 
     layout.Dispose(); 
     contantBuffer.Dispose(); 
     depthBuffer.Dispose(); 
     depthView.Dispose(); 
     renderView.Dispose(); 
     backBuffer.Dispose(); 
     ImagingFactory2.Dispose(); 
     device.Dispose(); 
     context.Dispose(); 
     swapChain.Dispose(); 
     factory.Dispose(); 
     adapter.Dispose(); 
     DSState.Dispose(); 
     samplerState.Dispose(); 
     DC.Dispose(); 
     form.Dispose(); 
     })).Start(); 
} 
} 

MiniCube.hlsl

Texture2D ShaderTexture : register(t0); 
SamplerState Sampler : register(s0); 

struct VS_IN 
{ 
    float4 pos : POSITION; 
    float3 Normal : NORMAL; 
    float4 col : COLOR; 
    float2 TextureUV: TEXCOORD; // Texture UV coordinate 
}; 
struct VS_OUTPUT 
{ 
    float4 pos : POSITION0; 
    float depth : TEXCOORD0; 
    float2 TextureUV: TEXCOORD; 
}; 

struct PS_IN 
{ 
    float4 pos : SV_POSITION; 
    float4 col : COLOR; 
    float2 TextureUV: TEXCOORD; 
    float3 WorldNormal : NORMAL; 
    float3 WorldPosition : WORLDPOS; 
}; 

float4x4 worldViewProj; 

PS_IN VS(VS_IN input) 
{ 
    PS_IN output = (PS_IN)0; 

    output.pos = mul(input.pos, worldViewProj); 
    input.pos.z= input.pos.z - 0.9f; 
    input.pos.z *= 10.0f; 

    output.col = 1.0f-((input.pos.w /* * input.col*/)/(input.pos.z /* *input.col*/)); 
    output.TextureUV = input.TextureUV; 
    return output; 
} 

float4 PS(PS_IN input) : SV_Target 
{ 
    return ShaderTexture.Sample(Sampler, input.TextureUV)*input.col; 
} 

Répondre

0

tout d'abord, il est courant se rendre re les coordonnées de texture dans les sommets. Donc, la première chose à faire pour vous est de changer la structure de vos sommets à:

public MyVertex 
{ 
    public Vector3 Position; 
    public Vector3 Normal; 
    public Vector2 TextureCoord; 
} 

Je ne vois pas la nécessité de rendre la position et une normale Vector4, ce qui devrait le faire. Lorsque vous utilisez des textures, il n'est pas nécessaire d'utiliser la couleur dans la structure des sommets.

Ensuite, vous modifiez la structure d'entrée du shader dans la structure ci-dessus. Dans le shader mais aussi dans votre initialisation.

Il est recommandé de définir les coordonnées de texture lors de l'initialisation du maillage. Un exemple serait pour un avion:

var vertices = new MyVertex[] { new MyVertex(){Position = new Vector3(0.0f, 0.0f, 0.0f),Normal = new Vector3(0.0f, 1.0f, 0.0f), TextureCoord = new Vector2(0.0f, 0.0f)}, new MyVertex(){Position = new Vector3(1.0f, 0.0f, 0.0f),Normal = new Vector3(0.0f, 1.0f, 0.0f), TextureCoord = new Vector2(1.0f, 0.0f)}, new MyVertex(){Position = new Vector3(1.0f, 0.0f, 1.0f),Normal = new Vector3(0.0f, 1.0f, 0.0f), TextureCoord = new Vector2(1.0f, 1.0f)}, new MyVertex(){Position = new Vector3(0.0f, 0.0f, 1.0f),Normal = new Vector3(0.0f, 1.0f, 0.0f), TextureCoord = new Vector2(0.0f, 1.0f)} };

Si vous stockez vos sommets comme ça, cela devrait fonctionner comme un charme. Il ne vous reste plus qu'à utiliser les coordonnées de textures d'entrée pour votre échantillonnage de la texture passée dans le shader.

De même, il n'est pas nécessaire de manipuler les coordonnées de texture dans le matériau si vous souhaitez utiliser un mappage de texture simple. Sinon, vous pouvez rechercher différents types de mappage de texture sur wikipedia, comme la mise en forme de textures sphérique, en boîte ou en plan.