错误C3861:'D3DCompileFromFile':找不到标识符

时间:2014-11-04 17:09:05

标签: c++ visual-studio-2013 direct3d directx-11

我试图使用D3D函数D3DCompilFromFile并且它完全正常工作,直到我调整了一下我的着色器,现在我的程序突然停止识别D3DCompileFromFile函数,我检查了什么标题/库/ dll' s我需要包括在内,而且他们都是我的知识。

我正在使用VS2013

以下是一些示例代码

application.cpp

HRESULT Application::CompileShaderFromFile(WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut)
{
    HRESULT hr = S_OK;

    DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined(DEBUG) || defined(_DEBUG)
    // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
    // Setting this flag improves the shader debugging experience, but still allows 
    // the shaders to be optimized and to run exactly the way they will run in 
    // the release configuration of this program.
    dwShaderFlags |= D3DCOMPILE_DEBUG;
#endif

    ID3DBlob* pErrorBlob;
    hr = D3DCompileFromFile(szFileName, nullptr, nullptr, szEntryPoint, szShaderModel,
        dwShaderFlags, 0, ppBlobOut, &pErrorBlob);

    if (FAILED(hr))
    {
        if (pErrorBlob != nullptr)
            OutputDebugStringA((char*)pErrorBlob->GetBufferPointer());

        if (pErrorBlob) pErrorBlob->Release();

        return hr;
    }

    if (pErrorBlob) pErrorBlob->Release();

    return S_OK;
}

application.h

#include <windows.h>
#include <d3d11_1.h>
#include <d3dcompiler.h>
#include <directxmath.h>
#include <directxcolors.h>
#include "resource.h"
#include <iostream>
#include <vector>
#include <time.h>
#include <stdio.h>
#include <stdlib.h> 

using namespace DirectX;
using namespace std;
.
.
.
.
HRESULT CompileShaderFromFile(WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut);

Lighting.fx

cbuffer cbData
{
    float4x4 World; 
    float4x4 View; 
    float4x4 Projection;

    float4 gDiffuseMtrl; 
    float4 gDiffuseLight; 
    float3 gLightVecW;
    float4 gAmbientMtrl;
    float4 gAmbientLight;
};

struct VS_IN
{
    float4 posL   : POSITION;
    float3 normalL : NORMAL;
};

struct VS_OUT
{
    float4 Pos    : SV_POSITION;
    float4 Col    : COLOR;
};

VS_OUT VS(VS_IN vIn)
{
    VS_OUT output = (VS_OUT)0;

    output.Pos = mul( vIn.posL, World ); 
    output.Pos = mul( output.Pos, View ); 
    output.Pos = mul( output.Pos, Projection );


    // Convert from local to world normal
    float3 normalW = mul(float4(vIn.normalL, 0.0f), World).xyz;
    normalW = normalize(normalW);

    // Compute Colour
    float s = max(dot(gLightVecW, normalW), 0.0f);
    float3 diffuse = s*(gDiffuseMtrl*gDiffuseLight).rgb;
    float3 ambient = gAmbientMtrl * gAmbientLight;
    output.Col.rgb = diffuse + ambient;
    output.Col.a = gDiffuseMtrl.a;


    return output;
}

float4 PS(VS_OUT pIn) : SV_Target
{
    return pIn.Col;
}

technique11 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}

很抱歉,如果我只是向人们扔太多代码,但我真的很难找到原因

1 个答案:

答案 0 :(得分:3)

您使用的是legacy DirectX SDK吗? D3DCompiler的旧#43版本中不存在D3DCompileFromFile,这意味着您可能正在使用旧的&#39; d3dcompiler.h&#39;在DirectX SDK中的标头而不是较新的Windows 8.1 SDK版本的&#39; d3dcompiler.h&#39; VS 2013附带。

理想情况下,您根本不应使用DirectX SDK(请参阅Living without D3DX)。

我从您的着色器中看到您正在使用效果11,因此您应该确保转到不需要任何DXSDK标头的最新CodePlex版本。请注意,支持&#39; fx_5_0&#39;不推荐使用配置文件,并且预计将在HLSL编译器的将来更新中删除该配置文件。 Windows 8.1 SDK#47版本的编译器将发出一个警告,说明这一点,但仍会编译这些着色器。