我已经使用模板缓冲区在我的应用中实现了鼠标选择。
这是在鼠标下读取值的像素着色器:
Texture2DMS<uint2> depthStencilTexture : register( t0 );
cbuffer ReadDepthInput : register( b2 )
{
int2 readPosition;
}
// Produces vector3( x, y, stencilValue )
float4 main() : SV_Target0
{
uint2 res = depthStencilTexture.Load( readPosition, 1 );
float stencil = res.y;
// Scale the result from integers to 0..1
stencil /= 255.0f;
return float4( float( readPosition.x ) / 65535.0f, float( readPosition.y ) / 65535.0f, stencil, 0 );
}
该代码适用于nVidia和AMD GPU,适用于Intel Iris 550。
英特尔Haswell GPU(Intel HD 5000,Intel HD 4600)上的代码失败。 Texture2DMS.Load只返回0.任何想法可能出错?
更新:仅适用于8x MSAA。将其降低到4倍即使在受影响的英特尔GPU上也能正常工作。
答案 0 :(得分:0)
看起来英特尔GPU驱动程序或硬件存在错误。
这是一种解决方法:
HRESULT isIntelHaswellGPU( ID3D11Device* device )
{
CComQIPtr<IDXGIDevice> dxgiDev = device;
if( !dxgiDev )
return E_NOINTERFACE;
CComPtr<IDXGIAdapter> adapter;
CHECK( dxgiDev->GetAdapter( &adapter ) );
DXGI_ADAPTER_DESC desc;
CHECK( adapter->GetDesc( &desc ) );
if( desc.VendorId != 0x8086 )
return S_FALSE; // nVidia or AMD GPU
// https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units#Seventh_generation
// https://github.com/GameTechDev/gpudetect/blob/master/DeviceId.cpp
const UINT maskedDeviceId = ( desc.DeviceId & 0xFF00 );
if( maskedDeviceId == 0x0400 || maskedDeviceId == 0x0A00 || maskedDeviceId == 0x0D00 )
return S_OK; // Detected Intel Haswell GPU
return S_FALSE;
}
如果此函数返回S_OK,我限制最大值。 MSAA等级为4。