在一个应用程序中,我尝试使用多重采样在一些简单的2D几何体上进行抗锯齿处理。它最初是在Windows XP上开发的,我可以为我的DirectX设备和任何其他交换链启用多重采样。现在,在Windows 7上,多重采样功能似乎根本不起作用。
我提取了一个非常简短的示例代码,除了显示三角形之外什么都不做。当我在Windows XP上运行程序时,边缘是消除锯齿的,但在Windows 7上它不是。
void testDX() {
struct CustomVertex {
FLOAT x, y, z, rhw;
DWORD color;
};
CustomVertex vertices[] = {
{0.0f, 0.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
{700.0f, 500.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
{0.0f, 500.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
};
HRESULT hr;
DXWindow window;
window.New(GetDesktopWindow(), "Main Window", 0, 0, 800, 600);
IDirect3D9Ptr d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof d3dpp);
d3dpp.Flags = (D3DPRESENTFLAG_VIDEO | D3DPRESENTFLAG_DEVICECLIP) & ~D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.Windowed = TRUE;
d3dpp.hDeviceWindow = window.GetHandle();
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE;
d3dpp.MultiSampleQuality = 7;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//d3dpp.BackBufferFormat = m_d3ddm.Format;
d3dpp.BackBufferCount = 0;
//d3dpp.EnableAutoDepthStencil = TRUE;
//d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // D3DFMT_D24X8;
IDirect3DDevice9Ptr device;
hr = d3d->CreateDevice(0, D3DDEVTYPE_HAL, window.GetHandle(), D3DCREATE_FPU_PRESERVE | D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &device);
IDirect3DSwapChain9Ptr swapChain;
hr = device->GetSwapChain(0, &swapChain);
hr = device->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
while (!window.ShouldQuit()) {
Sleep(50);
IDirect3DSurface9Ptr targetSurface;
hr = swapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &targetSurface);
hr = device->SetRenderTarget(0, targetSurface);
hr = device->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0);
hr = device->BeginScene();
hr = device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, vertices, sizeof CustomVertex);
hr = device->EndScene();
hr = swapChain->Present(0, 0, (HWND)0, 0, D3DPRESENT_DONOTWAIT);
}
}
我尝试将代码与Microsoft随其DirectX SDK提供的AntiAlias示例进行比较。虽然抗锯齿效果在示例代码中起作用,但我找不到任何显着差异(但是,程序流程不是很直观)。
我的问题是,为什么通过多重采样的抗锯齿在Windows XP上工作但在Windows 7上不工作,我该怎么做才能解决这个问题?
答案 0 :(得分:3)
删除D3DPRESENTFLAG_VIDEO有助于在Windows 7上启用多重采样。之所以添加,是因为应用程序使用DirectX来显示视频。但由于该标志没有很好的记录,似乎只是视频驱动程序的一个提示,我不知道设置或不设置标志的副作用。它没有其他明显的效果,但可能存在我不知道的性能损失。