2016-10-27 2 views
2

Dans une application graphique, je rends une image à une texture, puis j'utilise cette texture sur un modèle 3D. Lorsque l'application démarre, tout va bien, mais si je redimensionne la vue où je fais le rendu et que je le rends plus grand, la texture sur le modèle 3d disparaît (elle ne noircit pas, pense que toutes les valeurs deviennent 1). Rendre l'image plus petite ne fait pas disparaître la texture, mais elle est montrée incorrectement (pas redimensionnée).Le rendu à la texture échoue après le redimensionnement

Voici quelques images explicatives:

Redimensionner plus petit enter image description here Non redimensionnée enter image description here Redimensionner plus, 1 pixel plus est suffisant pour faire disparaître l'image. enter image description here

Le code qui génère le RenderView est la suivante:

private void CreateRenderToTexture(Panel view) 
    { 
     Texture2DDescription t2d = new Texture2DDescription() 
     { 
      Height = view.Height, 
      Width = view.Width, 
      Format = Format.R32G32B32A32_Float, 
      BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget, //| BindFlags.UnorderedAccess, 
      CpuAccessFlags = CpuAccessFlags.None, 
      OptionFlags = ResourceOptionFlags.None, 
      SampleDescription = new SampleDescription(_multisample, 0), 
      MipLevels = 1, 
      Usage = ResourceUsage.Default, 
      ArraySize = 1, 
     }; 
     _svgTexture = new Texture2D(_device, t2d); 
     _svgRenderView = new RenderTargetView(_device, _svgTexture);   
    } 

private void RenderSVGToTexture() 
    {    
     _camera.SetDefaultProjection(); 
     UpdatePerFrameBuffers(); 
     _dc.OutputMerger.SetTargets(_depthStencil, _svgRenderView);//depth stencil has same dimension as all other buffers 
     _dc.ClearRenderTargetView(_svgRenderView, new Color4(1.0f, 1.0f, 1.0f)); 
     _dc.ClearDepthStencilView(_depthStencil, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); 

     Entity e; 
     if (RenderingManager.Scene.Entity2DExists("svgimage")) 
     { 
      RenderingManager.Scene.GetEntity2D("svgimage", out e); 
      e.Draw(_dc); 
     } 
     _swapChain.Present(0, PresentFlags.None); 
    } 

Lors du rendu de la scène 3D j'appelle cette fonction avant de rendre le modèle:

private void SetTexture() 
    { 
     Entity e; 
     if (!RenderingManager.Scene.GetEntity3D("model3d", out e)) 
      return; 

     e.ShaderType = ResourceManager.ShaderType.MAIN_MODEL; 
     if (ResourceManager.SVGTexture == null) 
     { 
      e.ShaderType = ResourceManager.ShaderType.PNUVNOTEX; 
      return; 
     } 
     SamplerDescription a = new SamplerDescription(); 
     a.AddressU = TextureAddressMode.Wrap; 
     a.AddressV = TextureAddressMode.Wrap; 
     a.AddressW = TextureAddressMode.Wrap; 

     a.Filter = Filter.MinPointMagMipLinear; 

     SamplerState b = SamplerState.FromDescription(ResourceManager.Device, a); 

     ShaderResourceView svgTexResourceView = new ShaderResourceView(ResourceManager.Device, Texture2D.FromPointer(ResourceManager.SVGTexture.ComPointer)); 
     ResourceManager.Device.ImmediateContext.PixelShader.SetShaderResource(svgTexResourceView, 0);   

     ResourceManager.Device.ImmediateContext.PixelShader.SetSampler(b, 0); 
     b.Dispose(); 
     svgTexResourceView.Dispose(); 
    } 

Pixel Shader:

Texture2D svg : register(t0); 
    Texture2D errorEstimate : register(t1); 
    SamplerState ss : register(s0); 

    float4 main(float4 position : SV_POSITION, float4 color : COLOR, float2 uv : UV) : SV_Target 
    { 
     return color * svg.Sample(ss, uv);// *errorEstimate.Sample(ss, uv); 
    } 

Je ne suis pas derstand ce que je fais mal, j'espère que vous pouvez me faire voir l'erreur que je fais. Merci, et désolé pour le mauvais anglais!

Répondre

0

Comme il (presque) toujours avéré que je faisais une erreur très stupide.

Je n'appelais pas la bonne fonction de redimensionnement. Fondamentalement, dans la classe Renderer2D, il existe une fonction DoResize qui effectue le redimensionnement des tampons 2d uniquement, alors que dans la classe Renderer abstraite, il y a le reste des tampons à redimensionner. L'erreur est que dans la classe parente j'appelais la mauvaise fonction de redimensionnement de base!

classe parent:

protected override void DoResize(uint width, uint height) 
    { 
     if (width == 0 || height == 0) 
      return; 
     base.DoResize(width, height); //Here i was calling base.Resize (which was deprecated after a change in the application architecture) 
     _camera.Width = width; 
     _camera.Height = height; 

     _svgTexture.Dispose(); 
     _svgRenderView.Dispose(); 

     CreateRenderToTexture(_viewReference); 
     ResizePending = false; 
    } 

Classe de base

protected virtual void DoResize(uint width, uint height) 
    { 
     Width = width; 
     Height = height; 

     _viewport = new Viewport(0, 0, Width, Height); 

     _renderTarget.Dispose(); 

     if (_swapChain.ResizeBuffers(2, (int)width, (int)height, Format.Unknown, SwapChainFlags.AllowModeSwitch).IsFailure) 
      Console.WriteLine("An error occured while resizing buffers."); 
     using (var resource = Resource.FromSwapChain<Texture2D>(_swapChain, 0)) 
      _renderTarget = new RenderTargetView(_device, resource); 

     _depthStencil.Dispose(); 
     CreateDepthBuffer(); 
    } 

Peut-être que le code i posté peut être utile pour quelqu'un qui essaie de faire un peu de rendre à des trucs de texture, depuis je vois qu'il y a toujours des gens qui ne peuvent pas le faire fonctionner :)