You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DirectX 11纹理像素化放大失效问题求助

DirectX 11纹理像素化放大失效问题求助

我写了一段示例代码,创建了一个320x180的纹理,然后在初始内部尺寸为320x180的可调整大小窗口中显示它。但当我把窗口调大时,纹理变得模糊了——我本来以为用D3D11_FILTER_MIN_MAG_MIP_POINT就能实现像素化的放大效果,结果完全没达到预期。到底哪里出错了?

下面是窗口在320x180原始尺寸和放大后的效果对比(原问题附带效果截图)


完整可复现代码

GPU着色器代码(gpu.hlsl)

struct pixeldesc {
    float4 position : SV_POSITION;
    float2 texcoord : TEX;
};

Texture2D mytexture : register(t0);
SamplerState mysampler : register(s0);

pixeldesc VsMain(uint vI : SV_VERTEXID) {
    pixeldesc output;
    output.texcoord = float2(vI % 2, vI / 2);
    output.position = float4(output.texcoord * float2(2, -2) - float2(1, -1), 0, 1);
    return output;
}

float4 PsMain(pixeldesc pixel) : SV_TARGET {
    return float4(mytexture.Sample(mysampler, pixel.texcoord).rgb, 1);
}

CPU端代码(cpu.cpp)

#pragma comment(lib, "user32")
#pragma comment(lib, "d3d11")
#pragma comment(lib, "d3dcompiler")
#include <windows.h>
#include <d3d11.h>
#include <d3dcompiler.h>

int winw = 320*1;
int winh = 180*1;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_DESTROY) {
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
    WNDCLASSA wndclass = { 0, WindowProc, 0, 0, 0, 0, 0, 0, 0, "d8" };
    RegisterClassA(&wndclass);

    RECT winbox;
    winbox.left = GetSystemMetrics(SM_CXSCREEN) / 2 - winw / 2;
    winbox.top = GetSystemMetrics(SM_CYSCREEN) / 2 - winh / 2;
    winbox.right = winbox.left + winw;
    winbox.bottom = winbox.top + winh;
    AdjustWindowRectEx(&winbox, WS_OVERLAPPEDWINDOW, false, 0);

    HWND window = CreateWindowExA(0, "d8", "testing d3d11 upscaling", WS_OVERLAPPEDWINDOW|WS_VISIBLE, winbox.left, winbox.top, winbox.right - winbox.left, winbox.bottom - winbox.top, 0, 0, 0, 0);

    D3D_FEATURE_LEVEL featurelevels[] = { D3D_FEATURE_LEVEL_11_0 };
    DXGI_SWAP_CHAIN_DESC swapchaindesc = {};
    swapchaindesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    swapchaindesc.SampleDesc.Count = 1;
    swapchaindesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapchaindesc.BufferCount = 2;
    swapchaindesc.OutputWindow = window;
    swapchaindesc.Windowed = TRUE;
    swapchaindesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;

    IDXGISwapChain* swapchain;
    ID3D11Device* device;
    ID3D11DeviceContext* devicecontext;
    D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, featurelevels, ARRAYSIZE(featurelevels), D3D11_SDK_VERSION, &swapchaindesc, &swapchain, &device, nullptr, &devicecontext);

    ID3D11Texture2D* framebuffer;
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&framebuffer); // get the swapchain's buffer
    ID3D11RenderTargetView* framebufferRTV;
    device->CreateRenderTargetView(framebuffer, nullptr, &framebufferRTV); // and make it a render target [view]

    ID3DBlob* vertexshaderCSO;
    D3DCompileFromFile(L"gpu.hlsl", 0, 0, "VsMain", "vs_5_0", 0, 0, &vertexshaderCSO, 0);
    ID3D11VertexShader* vertexshader;
    device->CreateVertexShader(vertexshaderCSO->GetBufferPointer(), vertexshaderCSO->GetBufferSize(), 0, &vertexshader);

    ID3DBlob* pixelshaderCSO;
    D3DCompileFromFile(L"gpu.hlsl", 0, 0, "PsMain", "ps_5_0", 0, 0, &pixelshaderCSO, 0);
    ID3D11PixelShader* pixelshader;
    device->CreatePixelShader(pixelshaderCSO->GetBufferPointer(), pixelshaderCSO->GetBufferSize(), 0, &pixelshader);

    D3D11_RASTERIZER_DESC rasterizerdesc = { D3D11_FILL_SOLID, D3D11_CULL_NONE };
    ID3D11RasterizerState* rasterizerstate;
    device->CreateRasterizerState(&rasterizerdesc, &rasterizerstate);

    D3D11_SAMPLER_DESC samplerdesc = { D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_WRAP, D3D11_TEXTURE_ADDRESS_WRAP, D3D11_TEXTURE_ADDRESS_WRAP };
    ID3D11SamplerState* samplerstate;
    device->CreateSamplerState(&samplerdesc, &samplerstate);

    unsigned char texturedata[320*180*4];
    for (int i = 0; i < 320*180*4; i++) {
        texturedata[i] = rand() % 0xff;
    }

    D3D11_TEXTURE2D_DESC texturedesc = {};
    texturedesc.Width = 320;
    texturedesc.Height = 180;
    texturedesc.MipLevels = 1;
    texturedesc.ArraySize = 1;
    texturedesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    texturedesc.SampleDesc.Count = 1;
    texturedesc.Usage = D3D11_USAGE_IMMUTABLE;
    texturedesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

    D3D11_SUBRESOURCE_DATA textureSRD = {};
    textureSRD.pSysMem = texturedata;
    textureSRD.SysMemPitch = 320 * 4;

    ID3D11Texture2D* texture;
    device->CreateTexture2D(&texturedesc, &textureSRD, &texture);
    ID3D11ShaderResourceView* textureSRV;
    device->CreateShaderResourceView(texture, nullptr, &textureSRV);

    D3D11_VIEWPORT viewport = { 0,

编译运行命令

在PowerShell中执行以下命令即可编译并运行代码:

(cl .\cpu.cpp) -and (./cpu.exe)

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:48:04