2017-04-13 3 views
0

私は、ステンシルバッファを使用してアプリケーションでマウスピッキングを実装しました。いくつかのIntel GPUでマルチサンプルテクスチャからのロードが失敗する

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のアイリスに550

を動作するコードは、インテルハスウェルGPU上で失敗し、:ここで

は、マウスの下に値を読み込み、ピクセルシェーダですHD 5000、インテルHD 4600)。 Texture2DMS.Loadはただ0を返します。何が間違っているかもしれませんか?

更新: 8x MSAAでのみ発生します。影響を受けるインテルGPUであっても、4倍にすることは問題ありません。

+0

ドライバは、 '' CheckFormatSupport''とその形式の '' CheckMultisampleQualityLevels''を使った8x MSAAを使って '' D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD''をサポートしていることを確認しましたか? –

+0

@ChuckWalbournはい、私のアプリは起動時に両方を呼び出し、MSAAを無効にしたり、レベルを下げたりします。 – Soonts

答えて

0

Intel GPUドライバまたはハードウェアにバグがあるようです。この関数はS_OKを返し

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; 
} 

場合、私は最大の制限:

は、ここでの回避策です。

関連する問題