将 RGB 像素阵列绘制到 DirectX-11 渲染视图
Draw RGB pixel array to DirectX-11 render view
给定更新每一帧的 RBG 像素数组(例如 1024x1024),ID3D11RenderTargetView
、ID3D11Device
和 ID3D11DeviceContext
,将这些像素绘制到渲染器的最简单方法是什么查看?
我一直在研究为正方形(两个三角形)创建顶点缓冲区的角度,尝试使像素成为合适的纹理,并弄清楚如何使着色器引用纹理采样器。我一直在关注本教程 https://docs.microsoft.com/en-us/windows/uwp/gaming/applying-textures-to-primitives .... But to be honest, I don't see how this tutorial has shaders that even reference the texture data (shaders defined on the proceeding tutorial, here).
我是一个完全的 DirectX 新手,但我正在为一个应用程序编写一个插件,我在其中获得了 directx11 device/view/context,并且需要用我的像素数据填充它。非常感谢!
IF 您可以确保您的暂存资源与给定的呈现目标的确切分辨率和格式相匹配:
创建暂存资源
映射暂存资源,并将您的数据复制到其中。
取消映射暂存资源
在RTV上使用GetResource
获取资源
CopyResource
从您的暂存到该资源。
否则,IF 你可以指望 Direct3D Hardware Feature level 10.0 或更好,最简单的方法是:
使用USAGE_DYNAMIC
创建纹理。
对其进行映射并将您的数据复制到纹理中。
取消映射资源
使用顶点着色器中的 'big-triangle' self-generation 技巧将动态纹理渲染为 'full-screen' 四边形:
SamplerState PointSampler : register(s0);
Texture2D<float4> Texture : register(t0);
struct Interpolators
{
float4 Position : SV_Position;
float2 TexCoord : TEXCOORD0;
};
Interpolators main(uint vI : SV_VertexId)
{
Interpolators output;
// We use the 'big triangle' optimization so you only Draw 3 verticies instead of 4.
float2 texcoord = float2((vI << 1) & 2, vI & 2);
output.TexCoord = texcoord;
output.Position = float4(texcoord.x * 2 - 1, -texcoord.y * 2 + 1, 0, 1);
return output;
}
和像素着色器:
float4 main(Interpolators In) : SV_Target0
{
return Texture.Sample(PointSampler, In.TexCoord);
}
然后绘制:
ID3D11ShaderResourceView* textures[1] = { texture };
context->PSSetShaderResources(0, 1, textures);
// You need a sampler object.
context->PSSetSamplers(0, 1, &sampler);
// Depending on your desired result, you may need state objects here
context->OMSetBlendState(nullptr, nullptr, 0xffffffff);
context->OMSetDepthStencilState(nullptr, 0);
context->RSSetState(nullptr);
context->IASetInputLayout(nullptr);
contet->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
Draw(3, 0);
有关“全屏四边形”绘图的完整来源,请参阅 GitHub。
给定更新每一帧的 RBG 像素数组(例如 1024x1024),ID3D11RenderTargetView
、ID3D11Device
和 ID3D11DeviceContext
,将这些像素绘制到渲染器的最简单方法是什么查看?
我一直在研究为正方形(两个三角形)创建顶点缓冲区的角度,尝试使像素成为合适的纹理,并弄清楚如何使着色器引用纹理采样器。我一直在关注本教程 https://docs.microsoft.com/en-us/windows/uwp/gaming/applying-textures-to-primitives .... But to be honest, I don't see how this tutorial has shaders that even reference the texture data (shaders defined on the proceeding tutorial, here).
我是一个完全的 DirectX 新手,但我正在为一个应用程序编写一个插件,我在其中获得了 directx11 device/view/context,并且需要用我的像素数据填充它。非常感谢!
IF 您可以确保您的暂存资源与给定的呈现目标的确切分辨率和格式相匹配:
创建暂存资源
映射暂存资源,并将您的数据复制到其中。
取消映射暂存资源
在RTV上使用
GetResource
获取资源CopyResource
从您的暂存到该资源。
否则,IF 你可以指望 Direct3D Hardware Feature level 10.0 或更好,最简单的方法是:
使用
USAGE_DYNAMIC
创建纹理。对其进行映射并将您的数据复制到纹理中。
取消映射资源
使用顶点着色器中的 'big-triangle' self-generation 技巧将动态纹理渲染为 'full-screen' 四边形:
SamplerState PointSampler : register(s0);
Texture2D<float4> Texture : register(t0);
struct Interpolators
{
float4 Position : SV_Position;
float2 TexCoord : TEXCOORD0;
};
Interpolators main(uint vI : SV_VertexId)
{
Interpolators output;
// We use the 'big triangle' optimization so you only Draw 3 verticies instead of 4.
float2 texcoord = float2((vI << 1) & 2, vI & 2);
output.TexCoord = texcoord;
output.Position = float4(texcoord.x * 2 - 1, -texcoord.y * 2 + 1, 0, 1);
return output;
}
和像素着色器:
float4 main(Interpolators In) : SV_Target0
{
return Texture.Sample(PointSampler, In.TexCoord);
}
然后绘制:
ID3D11ShaderResourceView* textures[1] = { texture };
context->PSSetShaderResources(0, 1, textures);
// You need a sampler object.
context->PSSetSamplers(0, 1, &sampler);
// Depending on your desired result, you may need state objects here
context->OMSetBlendState(nullptr, nullptr, 0xffffffff);
context->OMSetDepthStencilState(nullptr, 0);
context->RSSetState(nullptr);
context->IASetInputLayout(nullptr);
contet->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
Draw(3, 0);
有关“全屏四边形”绘图的完整来源,请参阅 GitHub。