My 3D game looks fine on AMD gpus (radeon HD 5800, 6300m) and on integrated gpus (intel), but looks grainy on nvidia gpus (tested on 635m, 930m). Changing the shader, blending, depth buffer settings, fullscreen, doesnt seem to help. Anyone knows why this happens?
Here is my D3D initialization code, it could be relevant:
bool InitializeDirect3d11App(HINSTANCE const hInstance)
{
std::cout << NEWLINE << "InitializeDirect3d11App(" << hInstance << ")" << NEWLINE;
// Describe our Display Mode
DXGI_MODE_DESC bufferDesc = {};
bufferDesc.Width = Width;
bufferDesc.Height = Height;
bufferDesc.RefreshRate.Numerator = 60;
bufferDesc.RefreshRate.Denominator = 1;
bufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
// Describe our Swap Chain
DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
swapChainDesc.BufferDesc = bufferDesc;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 1;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.Windowed = windowed;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
// Create our Direct3D 11 Device and SwapChain // D3D11_CREATE_DEVICE_DEBUG, D3D11_CREATE_DEVICE_BGRA_SUPPORT, D3D11_CREATE_DEVICE_SINGLETHREADED
D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_SINGLETHREADED,
nullptr, NULL, D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, nullptr, &d3d11DevCon);
// BackBuffer
D3D11_TEXTURE2D_DESC BackBuffer_Texture2D_Desc = {};
BackBuffer_Texture2D_Desc.Width = Width;
BackBuffer_Texture2D_Desc.Height = Height;
BackBuffer_Texture2D_Desc.MipLevels = 1;
BackBuffer_Texture2D_Desc.ArraySize = 1;
BackBuffer_Texture2D_Desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
BackBuffer_Texture2D_Desc.SampleDesc.Count = 1;
BackBuffer_Texture2D_Desc.SampleDesc.Quality = 0;
BackBuffer_Texture2D_Desc.Usage = D3D11_USAGE_DEFAULT;
BackBuffer_Texture2D_Desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
//BackBuffer_Texture2D_Desc.BindFlags = D3D11_BIND_RENDER_TARGET;
BackBuffer_Texture2D_Desc.CPUAccessFlags = 0;
BackBuffer_Texture2D_Desc.MiscFlags = 0;
d3d11Device->CreateTexture2D(&BackBuffer_Texture2D_Desc, nullptr, &BackBuffer);
D3D11_RENDER_TARGET_VIEW_DESC BackBuffer_RTV_Desc = {};
BackBuffer_RTV_Desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
BackBuffer_RTV_Desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
BackBuffer_RTV_Desc.Texture2D.MipSlice = 0;
SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer);
d3d11Device->CreateRenderTargetView(BackBuffer, nullptr, &BackBuffer_RTV);
// Describe and create our Depth/Stencil Buffer
BackBuffer_Texture2D_Desc.Format = DXGI_FORMAT_D32_FLOAT;
BackBuffer_Texture2D_Desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
d3d11Device->CreateTexture2D(&BackBuffer_Texture2D_Desc, nullptr, &DepthStencilBuffer);
d3d11Device->CreateDepthStencilView(DepthStencilBuffer, nullptr, &DepthStencilBuffer_DSV);
D3D11_DEPTH_STENCIL_DESC depth_write_enabled_desc = {};
depth_write_enabled_desc.DepthEnable = TRUE;
depth_write_enabled_desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; // depth write enabled
depth_write_enabled_desc.DepthFunc = D3D11_COMPARISON_LESS;
depth_write_enabled_desc.StencilEnable = false;
depth_write_enabled_desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
depth_write_enabled_desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
depth_write_enabled_desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depth_write_enabled_desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depth_write_enabled_desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE;
depth_write_enabled_desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depth_write_enabled_desc.BackFace = depth_write_enabled_desc.FrontFace;
d3d11Device->CreateDepthStencilState(&depth_write_enabled_desc, &pDepthenabledStencilState);
depth_write_enabled_desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; // depth write disabled
d3d11Device->CreateDepthStencilState(&depth_write_enabled_desc, &pDepthdisabledStencilState);
D3D11_BLEND_DESC blendDesc = {};
blendDesc.AlphaToCoverageEnable = false; // transparency artifacts if true
D3D11_RENDER_TARGET_BLEND_DESC rtbd = {};
rtbd.BlendEnable = true;
rtbd.SrcBlend = D3D11_BLEND_ONE;//D3D11_BLEND_BLEND_FACTOR;
rtbd.DestBlend = D3D11_BLEND_ONE;
rtbd.BlendOp = D3D11_BLEND_OP_ADD;
rtbd.SrcBlendAlpha = D3D11_BLEND_ONE;//D3D11_BLEND_BLEND_FACTOR;
rtbd.DestBlendAlpha = D3D11_BLEND_ZERO;//D3D11_BLEND_ONE;
rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtbd.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
blendDesc.RenderTarget[0] = rtbd;
d3d11Device->CreateBlendState(&blendDesc, &Blend_Add);
rtbd.SrcBlend = D3D11_BLEND_SRC_ALPHA;
rtbd.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
rtbd.BlendOp = D3D11_BLEND_OP_ADD;
rtbd.SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
rtbd.DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0] = rtbd;
d3d11Device->CreateBlendState(&blendDesc, &Blend_Alpha);
rtbd.SrcBlend = D3D11_BLEND_BLEND_FACTOR;
rtbd.DestBlend = D3D11_BLEND_INV_BLEND_FACTOR;
rtbd.BlendOp = D3D11_BLEND_OP_ADD;
rtbd.SrcBlendAlpha = D3D11_BLEND_BLEND_FACTOR;
rtbd.DestBlendAlpha = D3D11_BLEND_INV_BLEND_FACTOR;
rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0] = rtbd;
d3d11Device->CreateBlendState(&blendDesc, &Blend_Overwrite);
// Create and set the Viewport (subrectangle of the back buffer)
D3D11_VIEWPORT viewport = {};
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = Width;
viewport.Height = Height;
viewport.MinDepth = 0.0;
viewport.MaxDepth = 1.0;
d3d11DevCon->RSSetViewports(1, &viewport);
// Describe and create the Sampler state
D3D11_SAMPLER_DESC sampDesc = {};
sampDesc.Filter = D3D11_FILTER_ANISOTROPIC;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.MaxAnisotropy = 16;
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
d3d11Device->CreateSamplerState(&sampDesc, &TextureSamplerState);
d3d11DevCon->PSSetSamplers(0, 1, &TextureSamplerState);
D3D11_RASTERIZER_DESC rsdesc = {};
rsdesc.FillMode = D3D11_FILL_SOLID;
rsdesc.CullMode = D3D11_CULL_BACK;
rsdesc.FrontCounterClockwise = true;
d3d11Device->CreateRasterizerState(&rsdesc, &CCWcullMode);
rsdesc.FrontCounterClockwise = false;
d3d11Device->CreateRasterizerState(&rsdesc, &CWcullMode);
rsdesc.CullMode = D3D11_CULL_NONE;
d3d11Device->CreateRasterizerState(&rsdesc, &NonecullMode);
rsdesc.FillMode = D3D11_FILL_WIREFRAME;
d3d11Device->CreateRasterizerState(&rsdesc, &WireFrameRState);
//Compile Shaders from shader file
D3DX11CompileFromFile(L"Effects.fx", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS_Buffer, 0, 0);
D3DX11CompileFromFile(L"Effects.fx", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS_Buffer, 0, 0);
//Create the Shader Objects
d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), nullptr, &VS);
d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), nullptr, &PS);
//Set Vertex and Pixel Shaders
d3d11DevCon->VSSetShader(VS, 0, 0);
d3d11DevCon->PSSetShader(PS, 0, 0);
//Create the buffer to send to the per object cbuffer in effect file
D3D11_BUFFER_DESC cbbd = {};
cbbd.Usage = D3D11_USAGE_DEFAULT;
cbbd.ByteWidth = sizeof(cbVertex);
cbbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbbd.CPUAccessFlags = 0;
cbbd.MiscFlags = 0;
d3d11Device->CreateBuffer(&cbbd, nullptr, &cbVertexBuffer);
//Create the buffer to send to the per frame cbuffer in effect file
cbbd.ByteWidth = sizeof(cbPixel);
d3d11Device->CreateBuffer(&cbbd, nullptr, &cbPixelBuffer);
//Describe, create and set the Input Layout
const D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, // 12
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, // 8
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, // 12
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 }, // 16
// = 48 B
{ "COLORINST", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "ATTRIBUTES", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "WORLD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "WORLD", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "WORLD", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 64, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "WORLD", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 80, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, // 16
{ "TEXTUREIDS", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 96, D3D11_INPUT_PER_INSTANCE_DATA, 1 } // 16
}; // = 112 B
d3d11Device->CreateInputLayout(layout, ARRAYSIZE(layout), VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), &vertLayout);
d3d11DevCon->IASetInputLayout(vertLayout);
d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
FW1CreateFactory(FW1_VERSION, &pFW1Factory);
pFW1Factory->CreateFontWrapper(d3d11Device, L"Arial", &pFontWrapper);
//Set our Render Target
d3d11DevCon->OMSetRenderTargets(1, &BackBuffer_RTV, DepthStencilBuffer_DSV);
QueryPerformanceFrequency(&Frequency);
min_frame_ticks.QuadPart = Frequency.QuadPart / fps_cap;
std::cout << "Performance Counter Frequency: " << Frequency.QuadPart << NEWLINE;
return true;
}