2017-05-29 5 views
0

キューブにテクスチャを描画しようとしています。しかし、私は何か間違っています。私はテクスチャを持っていますが、座標が間違っているように見え、正しく設定する方法がわかりません。私は何が欠けていますか?私はIndexBufferとUVについて何かしなければならないと思う。しかし、私の心は非常に混ざり合っています。C#SharpDXテクスチャ座標を正しく設定する方法は?

私が得る結果:それは共通であるすべての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; 
} 

答えて

0

ファースト〜にsto頂点のテクスチャ座標を再作成します。 だからあなたのためにまず最初に行うには、にご頂点のあなたの構造を変更することです:私は位置し、通常のvector4を作るために必要が表示されないので、これはそれを行う必要があります

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

。テクスチャを使用すると、頂点構造で色を使用する必要もありません。

次に、シェーダーの入力構造を上記の構造に変更します。シェーダでも、それを初期化します。

メッシュの初期化でテクスチャ座標を設定することをお勧めします。例では、飛行機のために次のようになります。

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)} };

あなたがそのようなあなたの頂点を保存する場合は、それが魅力のように動作するはずです。 残されたことは、シェーダで渡されたテクスチャのサンプリングに入力texturecoordinatesを使用することだけです。

シンプルなテクスチャマッピングを使用する場合は、シェーダのテクスチャ座標を操作する必要もありません。さもなければ、ウィキペディア上で、球形、ボックス、または平面のテクスチャマッピングのような異なるタイプのテクスチャマッピングをルックアップすることができます。

関連する問題