Пример #1
0
bool MFSamplerState_CreatePlatformSpecific(MFSamplerState *pSS)
{
	D3D11_SAMPLER_DESC samplerDesc;
	if(pSS->stateDesc.magFilter == MFTexFilter_Anisotropic || pSS->stateDesc.minFilter == MFTexFilter_Anisotropic || pSS->stateDesc.mipFilter == MFTexFilter_Anisotropic)
		samplerDesc.Filter = D3D11_ENCODE_ANISOTROPIC_FILTER(false);
	else
		samplerDesc.Filter = D3D11_ENCODE_BASIC_FILTER(sFilterType[pSS->stateDesc.minFilter], sFilterType[pSS->stateDesc.magFilter], sFilterType[pSS->stateDesc.mipFilter], false);
	samplerDesc.AddressU = sTexAddress[pSS->stateDesc.addressU];
	samplerDesc.AddressV = sTexAddress[pSS->stateDesc.addressV];
	samplerDesc.AddressW = sTexAddress[pSS->stateDesc.addressW];
	samplerDesc.MipLODBias = pSS->stateDesc.mipLODBias;
	samplerDesc.MaxAnisotropy = pSS->stateDesc.maxAnisotropy;
	samplerDesc.ComparisonFunc = sCompareFunc[pSS->stateDesc.comparisonFunc];
	samplerDesc.BorderColor[0] = pSS->stateDesc.borderColour.x;
	samplerDesc.BorderColor[1] = pSS->stateDesc.borderColour.y;
	samplerDesc.BorderColor[2] = pSS->stateDesc.borderColour.z;
	samplerDesc.BorderColor[3] = pSS->stateDesc.borderColour.w;
	samplerDesc.MinLOD = pSS->stateDesc.minLOD;
	samplerDesc.MaxLOD = pSS->stateDesc.maxLOD;

	ID3D11SamplerState *pD3D11SS;
	HRESULT hr = g_pd3dDevice->CreateSamplerState(&samplerDesc, &pD3D11SS);
	pSS->pPlatformData = pD3D11SS;

	return SUCCEEDED(hr);
}
Пример #2
0
D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy, GLenum comparisonMode)
{
    bool comparison = comparisonMode != GL_NONE;

    if (maxAnisotropy > 1.0f)
    {
        return D3D11_ENCODE_ANISOTROPIC_FILTER(static_cast<D3D11_COMPARISON_FUNC>(comparison));
    }
    else
    {
        D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT;
        D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT;
        switch (minFilter)
        {
          case GL_NEAREST:                dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR:                 dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR_MIPMAP_NEAREST:  dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_NEAREST_MIPMAP_LINEAR:  dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_LINEAR; break;
          case GL_LINEAR_MIPMAP_LINEAR:   dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
          default:                        UNREACHABLE();
        }

        D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT;
        switch (magFilter)
        {
          case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR:  dxMag = D3D11_FILTER_TYPE_LINEAR; break;
          default:         UNREACHABLE();
        }

        return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, static_cast<D3D11_COMPARISON_FUNC>(comparison));
    }
}
Пример #3
0
D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)
{
    if (maxAnisotropy > 1.0f)
    {
        return D3D11_ENCODE_ANISOTROPIC_FILTER(false);
    }
    else
    {
        D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT;
        D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT;
        switch (minFilter)
        {
          case GL_NEAREST:                dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR:                 dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR_MIPMAP_NEAREST:  dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT;  break;
          case GL_NEAREST_MIPMAP_LINEAR:  dxMin = D3D11_FILTER_TYPE_POINT;  dxMip = D3D11_FILTER_TYPE_LINEAR; break;
          case GL_LINEAR_MIPMAP_LINEAR:   dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
          default:                        UNREACHABLE();
        }

        D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT;
        switch (magFilter)
        {
          case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT;  break;
          case GL_LINEAR:  dxMag = D3D11_FILTER_TYPE_LINEAR; break;
          default:         UNREACHABLE();
        }

        return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false);
    }
}