2015-11-21 3 views
0

Я пытаюсь реализовать изменение размера рендеринга при изменении размера окна/элемента управления.Текстура не заполняет весь целевой вид рендеринга при изменении размера

Однако при этом он работает не так, как ожидалось (возможно, потому что я не делаю это правильно), поскольку визуализированная текстура не заполняет весь мой целевой вид рендеринга.

Теперь, когда когда-либо изменении размера окна, я сбросить мой визуализации целевого вида и любой другой цели визуализации (текстуры) [Пожалуйста, см ниже код]

 this.ImgSource.SetRenderTargetDX11(null); 

     Disposer.SafeDispose(ref this.m_RenderTargetView); 
     Disposer.SafeDispose(ref this.m_d11Factory); 
     Disposer.SafeDispose(ref this.RenderTarget); 

     int width = (int)sizeInfo.Width; 
     int height = (int)sizeInfo.Height; 

     Texture2DDescription colordesc = new Texture2DDescription 
     { 
      BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, 
      Format = PIXEL_FORMAT, 
      Width = width, 
      Height = height, 
      MipLevels = 1, 
      SampleDescription = new SampleDescription(1, 0), 
      Usage = ResourceUsage.Default, 
      OptionFlags = ResourceOptionFlags.Shared, 
      CpuAccessFlags = CpuAccessFlags.None, 
      ArraySize = 1 

     }; 

     this.RenderTarget = new Texture2D(this.Device, colordesc); 
     m_RenderTargetView = new RenderTargetView(this.Device, this.RenderTarget); 

     m_depthStencil = CreateTexture2D(this.Device, width, height, BindFlags.DepthStencil, Format.D24_UNorm_S8_UInt); 

     m_depthStencilView = new DepthStencilView(this.Device, m_depthStencil); 

     Device.ImmediateContext.Rasterizer.SetViewport(0, 0, width, height, 0.0f, 1.0f); 
     Device.ImmediateContext.OutputMerger.SetTargets(m_depthStencilView, m_RenderTargetView); 

     SetShaderAndVertices(sizeInfo); 

SetShaderAndVertices Метод: (sizeInfo является размер он оказывать целевой)

protected void SetShaderAndVertices(Size rendersize) 
    { 
     var device = this.Device; 
     var context = device.ImmediateContext; 

     ShaderBytecode shaderCode = GetShaderByteCode(eEffectType.Texture); 
     layout = new InputLayout(device, shaderCode, new[] { 
       new InputElement("SV_Position", 0, Format.R32G32B32A32_Float, 0, 0), 
       new InputElement("TEXCOORD", 0, Format.R32G32_Float, 32, 0), 
     }); 

     // Write vertex data to a datastream 
     var stream = new DataStream(Utilities.SizeOf<VertexPositionTexture>() * 4, true, true); 

     stream.WriteRange(new[] 
          { 
         new VertexPositionTexture(
            new Vector4(-1, 1, 0.0f, 1.0f), // position top-left 
            new Vector2(0f,0f) 
            ), 
         new VertexPositionTexture(
            new Vector4(1, 1, 0.0f, 1.0f), // position top-right 
            new Vector2(1,0) 
            ), 
         new VertexPositionTexture(
            new Vector4(-1, -1, 0.0f, 1.0f), // position bottom-left 
            new Vector2(0,1) 
            ), 
         new VertexPositionTexture(
            new Vector4(1, -1, 0.0f, 1.0f), // position bottom-right 
            new Vector2(1,1) 
            ), 
           }); 
     stream.Position = 0; 

     // Instantiate VertexPositionTexture buffer from vertex data 
     // 
     vertices = new SharpDX.Direct3D11.Buffer(device, stream, new BufferDescription() 
     { 
      BindFlags = BindFlags.VertexBuffer, 
      CpuAccessFlags = CpuAccessFlags.None, 
      OptionFlags = ResourceOptionFlags.None, 
      SizeInBytes = Utilities.SizeOf<VertexPositionTexture>() * 4, 
      Usage = ResourceUsage.Default, 
      StructureByteStride = 0 
     }); 
     stream.Dispose(); 

     // Prepare All the stages 
     // for primitive topology https://msdn.microsoft.com/en-us/library/bb196414.aspx#ID4E2BAC 
     context.InputAssembler.InputLayout = (layout); 
     context.InputAssembler.PrimitiveTopology = (PrimitiveTopology.TriangleStrip); 
     context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf<VertexPositionTexture>(), 0)); 

     context.OutputMerger.SetTargets(m_RenderTargetView); 
    } 

Shader Файл:

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

cbuffer PerObject: register(b0) 
{ 
    float4x4 WorldViewProj; 
}; 


// ------------------------------------------------------ 
// A shader that accepts Position and Texture 
// ------------------------------------------------------ 

struct VertexShaderInput 
{ 
    float4 Position : SV_Position; 
    float2 TextureUV : TEXCOORD0; 
}; 

struct VertexShaderOutput 
{ 
    float4 Position : SV_Position; 
    float2 TextureUV : TEXCOORD0; 
}; 

VertexShaderOutput VSMain(VertexShaderInput input) 
{ 
    VertexShaderOutput output = (VertexShaderOutput)0; 

    output.Position = input.Position; 
    output.TextureUV = input.TextureUV; 

    return output; 
} 

float4 PSMain(VertexShaderOutput input) : SV_Target 
{ 
    return ShaderTexture.Sample(Sampler, input.TextureUV); 
} 

// ------------------------------------------------------ 
// A shader that accepts Position and Color 
// ------------------------------------------------------ 

struct ColorVS_IN 
{ 
    float4 pos : SV_Position; 
    float4 col : COLOR; 
}; 

struct ColorPS_IN 
{ 
    float4 pos : SV_Position; 
    float4 col : COLOR; 
}; 

ColorPS_IN ColorVS(ColorVS_IN input) 
{ 
    ColorPS_IN output = (ColorPS_IN)0; 
    output.pos = input.pos; 
    output.col = input.col; 
    return output; 
} 

float4 ColorPS(ColorPS_IN input) : SV_Target 
{ 
    return input.col; 
} 

// ------------------------------------------------------ 
// Techniques 
// ------------------------------------------------------ 

technique11 Color 
{ 
    pass P0 
    { 
     SetGeometryShader(0); 
     SetVertexShader(CompileShader(vs_5_0, ColorVS())); 
     SetPixelShader(CompileShader(ps_5_0, ColorPS())); 
    } 
} 

technique11 TextureLayer 
{ 
    pass P0 
    { 
     SetGeometryShader(0); 
     SetVertexShader(CompileShader(vs_5_0, VSMain())); 
     SetPixelShader(CompileShader(ps_5_0, PSMain())); 
    } 
} 

Я хотел бы иметь возможность растягивать изображение или нет, сохраняя при этом соотношение сторон на основе моего требования.

Также мои данные текстуры обновляются из другого потока путем сопоставления данных растрового изображения с моей целью рендеринга.

Примечание. Текстура заполняет весь вид цели рендеринга, если сопоставленное изображение имеет тот же размер, что и мой визуализированный целевой вид.

Пожалуйста, смотрите экран отвалов ниже:

Скриншоты: первого экрана:

enter image description here

Размер для первого экрана дампа изображения: ---- Размер дисплея изображения (835, 626) на цель визуализации размера (720, 576)

2-й экран:

enter image description here

Размер для второго экрана дампа изображения: Дисплей Размер изображения (899, 674) на цели визуализации размера (899, 676)

Все больше информации, то дайте мне знать, и я с радостью предоставить.

Спасибо.

P.S: Я также разместил этот вопрос в another forum, но не повезло, поэтому разместил здесь, надеясь, что кто-то сможет направить меня в правильном направлении.

С помощью C#, SharpDx с DirectX11 и D3DImage & & не используется Swapchains

Также см ниже код, используемый для отображения текстуры данных: Device.ImmediateContext.ClearRenderTargetView (this.m_RenderTargetView, Color4.Black);

 Texture2DDescription colordesc = new Texture2DDescription 
     { 
      BindFlags = BindFlags.ShaderResource, 
      Format = PIXEL_FORMAT, 
      Width = iWidthOfImage, 
      Height = iHeightOfImage, 
      MipLevels = 1, 
      SampleDescription = new SampleDescription(1, 0), 
      Usage = ResourceUsage.Dynamic, 
      OptionFlags = ResourceOptionFlags.None, 
      CpuAccessFlags = CpuAccessFlags.Write, 
      ArraySize = 1 
     }; 

     Texture2D newFrameTexture = new Texture2D(this.Device, colordesc); 

     DataStream dtStream = null; 
     DataBox dBox = Device.ImmediateContext.MapSubresource(newFrameTexture, 0, MapMode.WriteDiscard, 0, out dtStream); 
     if (dtStream != null) 
     { 
      int iRowPitch = dBox.RowPitch; 

      for (int iHeightIndex = 0; iHeightIndex < iHeightOfImage; iHeightIndex++) 
      { 
       //Copy the image bytes to Texture 
       // we write row strides multiplies by bytes per pixel 
       // as our case is bgra32 which is 4 bytes 
       dtStream.Position = iHeightIndex * iRowPitch; 
       Marshal.Copy(decodedData, iHeightIndex * iWidthOfImage * 4, new IntPtr(dtStream.DataPointer.ToInt64() + iHeightIndex * iRowPitch), iWidthOfImage * 4); 
      } 
     } 

     Device.ImmediateContext.UnmapSubresource(newFrameTexture, 0); 
     Device.ImmediateContext.CopySubresourceRegion(newFrameTexture, 0, null, this.RenderTarget, 0); 
+1

Вы, кажется, неправильно понимаете систему координат. Вы должны определить свой квадрат в пространстве клипов, который имеет координаты в диапазоне '[-1, 1]' (слева направо, снизу вверх). Он не использует пиксельные координаты. Координаты текстуры находятся в диапазоне '[0, 1]' (слева направо, сверху вниз). Нет пиксельных координат. Это позволяет указать квадрат независимо от разрешения экрана. Наконец, вам не нужны шесть вершин для треугольной полосы, образующей квад. Четыре достаточно. –

+0

Спасибо за быстрый ответ @NicoSchertler Однако после обновления кода, как было предложено мной, моя проблема по-прежнему сохраняется в отношении изменения размера. Любые предложения по этому поводу? Спасибо – Dave23Rave

+0

Пожалуйста, обновите свой вопрос с помощью текущего кода. –

ответ

0

После изменения размера, пропорции вашего нового окна не совпадает с вашей текстурой, поэтому он не может охватить всю клиентскую область окна.Вам нужно будет увеличить текстурированную геометрию, чтобы она покрывала всю клиентскую область при проецировании на плоскость камеры. Это обязательно означает, что часть текстуры обрезается.

В основном, это та же проблема при просмотре телевизионного программирования с соотношением сторон 4: 3 на мониторе 16: 9. Вы можете либо увеличить его, чтобы заполнить экран, в результате чего содержимое 4: 3 обрезается или растягивается, или вы можете использовать буквенное поле с содержимым 4: 3 с черным по обе стороны от содержимого.

+0

Спасибо за информацию @legalize однако как бы я растягивать/сжимать текстуру без обрезания текстуры или отображения текстуры в виде содержимого ящика, что является моей проблемой здесь, поскольку я новичок to directx11. Любой псевдокод или фактический код действительно будут полезны. – Dave23Rave

+0

Я пропустил, что у вас также многопоточность. Упростите это до наименьшей возможной программы, которую вы можете. Это означает отсутствие многопоточности. Я бы еще больше упростил текстуру как гигантскую квадратную шахматную доску, поэтому легче понять, внедряется ли искажение, и если не квадратный размер текстуры вызывает что-то не так с вашим кодом. – legalize

+0

Спасибо за ваше предложение @legalize, это помогло мне определить проблему. Я фактически обновляю порт представления из другого потока, в отличие от рендера. Теперь я устанавливаю видовое окно и любые другие ресурсы, если изменяется размер рендеринга. благодаря – Dave23Rave

Смежные вопросы