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
相关产品推荐
相关产品推荐

