Я пытаюсь реализовать изменение размера рендеринга при изменении размера окна/элемента управления.Текстура не заполняет весь целевой вид рендеринга при изменении размера
Однако при этом он работает не так, как ожидалось (возможно, потому что я не делаю это правильно), поскольку визуализированная текстура не заполняет весь мой целевой вид рендеринга.
Теперь, когда когда-либо изменении размера окна, я сбросить мой визуализации целевого вида и любой другой цели визуализации (текстуры) [Пожалуйста, см ниже код]
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()));
}
}
Я хотел бы иметь возможность растягивать изображение или нет, сохраняя при этом соотношение сторон на основе моего требования.
Также мои данные текстуры обновляются из другого потока путем сопоставления данных растрового изображения с моей целью рендеринга.
Примечание. Текстура заполняет весь вид цели рендеринга, если сопоставленное изображение имеет тот же размер, что и мой визуализированный целевой вид.
Пожалуйста, смотрите экран отвалов ниже:
Скриншоты: первого экрана:
Размер для первого экрана дампа изображения: ---- Размер дисплея изображения (835, 626) на цель визуализации размера (720, 576)
2-й экран:
Размер для второго экрана дампа изображения: Дисплей Размер изображения (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]' (слева направо, снизу вверх). Он не использует пиксельные координаты. Координаты текстуры находятся в диапазоне '[0, 1]' (слева направо, сверху вниз). Нет пиксельных координат. Это позволяет указать квадрат независимо от разрешения экрана. Наконец, вам не нужны шесть вершин для треугольной полосы, образующей квад. Четыре достаточно. –
Спасибо за быстрый ответ @NicoSchertler Однако после обновления кода, как было предложено мной, моя проблема по-прежнему сохраняется в отношении изменения размера. Любые предложения по этому поводу? Спасибо – Dave23Rave
Пожалуйста, обновите свой вопрос с помощью текущего кода. –