调整D3D11Texture2D DirectX的大小11

调整D3D11Texture2D DirectX的大小11,directx,textures,scale,directx-11,Directx,Textures,Scale,Directx 11,我想调整D3D11Texture2D的大小,使其更小。例如,我有一个1920x1080的纹理,我想将其缩放为1280x720。 让你知道我根本没有画画,我只是想让字节缓冲区缩放。这是我的密码: if (mRealTexture == nullptr) { D3D11_TEXTURE2D_DESC description; texture2D->GetDesc(&description); description.BindFlags =

我想调整D3D11Texture2D的大小,使其更小。例如,我有一个1920x1080的纹理,我想将其缩放为1280x720。 让你知道我根本没有画画,我只是想让字节缓冲区缩放。这是我的密码:

if (mRealTexture == nullptr) {
        D3D11_TEXTURE2D_DESC description;
        texture2D->GetDesc(&description);
        description.BindFlags = 0;
        description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
        description.Usage = D3D11_USAGE_STAGING;
        description.MiscFlags = 0;
        hr = mDevice->CreateTexture2D(&description, NULL, &mRealTexture);
        if (FAILED(hr)) {
            if (mRealTexture) {
                mRealTexture->Release();
                mRealTexture = nullptr;
            }
            return NULL;
        }
    }
    mImmediateContext->CopyResource(mRealTexture, texture2D);

    if (mScaledTexture == nullptr) {
        D3D11_TEXTURE2D_DESC description;
        texture2D->GetDesc(&description);
        description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
        description.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
        description.Width = 1440;
        description.Height = 585;
        description.MipLevels = 4;
        description.ArraySize = 1;
        description.SampleDesc.Count = 1;
        description.SampleDesc.Quality = 0;
        description.Usage = D3D11_USAGE_DEFAULT;
        hr = mDevice->CreateTexture2D(&description, NULL, &mScaledTexture);
        if (FAILED(hr)) {
            if (mScaledTexture) {
                mScaledTexture->Release();
                mScaledTexture = nullptr;
            }
            return NULL;
        }
    } //I want to copy the mRealTexture on the mScaledTexture, map the scaledTexture and get the buffer.

感谢您的帮助

考虑到这一点,您只有几个选择

1-创建视口等,并使用全屏四边形渲染到目标大小。我觉得你不想这么做

2-您可以滚动自己的缩放,这并不太糟糕,并在将数据从一个缓冲区复制到另一个缓冲区时缩放纹理


选项2还不错,最粗略的缩放是根据缩放比读取点,但更准确的版本是根据加权网格平均采样数(需要为目标上访问的每个像素重新计算权重)。

可能会帮助您-这不是有效代码,但是关于如何使用Direct2D和DXGI调整资源大小的概述。可惜没有示例代码。。。我想很多人都需要这样做。。。这对我来说太模糊了,无法理解要采取的步骤。(在代码中,我的意思是)我知道这听起来很陈腐,但我不是那个意思,但试着为概述编写逼真的伪代码,并为每个接口使用MSDN文档,慢慢地将其转化为真正的实现。首先处理小部件并观察结果。我发现与DirectX一起工作,像DirectShow和MediaFoundation这样的类似结构的东西会非常令人沮丧,但它需要花费时间和精力去真正地学习它。一旦你这样做了,像这样的问题的解决方案就会自然而然地出现,因为你对DirectX可以做什么以及如何做有着丰富的知识。所以,为了解决你的问题,你必须把它缩小吗?因为你可以对同一个纹理进行稍微不同的采样,以便在不缩放的情况下获得结果?我可以在位图上加载像素缓冲区,然后对其进行缩放?我同意,如果这更多是关于缩放数据,那么您最好避免使用DX。