2014-03-12 48 views
0

我有一个错误,同时创造vertexbuffer 这里是我的代码:错误创建顶点缓冲

bool ColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) 
{ 



HRESULT result; 
    ID3D10Blob* errorMessage; 
    ID3D10Blob* vertexShaderBuffer; 
    ID3D10Blob* pixelShaderBuffer; 
    D3D11_INPUT_ELEMENT_DESC polygonLayout[2]; 
    unsigned int numElements; 
    D3D11_BUFFER_DESC matrixBufferDesc; 


// Initialize the pointers this function will use to null. 
errorMessage = 0; 
vertexShaderBuffer = 0; 
pixelShaderBuffer = 0; 

// Compile the vertex shader code. 
result = D3DX11CompileFromFile(vsFilename, NULL, NULL, "ColorVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, 
           &vertexShaderBuffer, &errorMessage, NULL); 
if(FAILED(result)) 
{ 
    // If the shader failed to compile it should have writen something to the error message. 
    if(errorMessage) 
    { 
     OutputShaderErrorMessage(errorMessage, hwnd, vsFilename); 
    } 
    // If there was nothing in the error message then it simply could not find the shader file itself. 
    else 
    { 
     MessageBox(hwnd, vsFilename, L"Missing Shader File", MB_OK); 
    } 

    return false; 
} 

// Compile the pixel shader code. 
result = D3DX11CompileFromFile(psFilename, NULL, NULL, "ColorPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, 
           &pixelShaderBuffer, &errorMessage, NULL); 
if(FAILED(result)) 
{ 
    // If the shader failed to compile it should have writen something to the error message. 
    if(errorMessage) 
    { 
     OutputShaderErrorMessage(errorMessage, hwnd, psFilename); 
    } 
    // If there was nothing in the error message then it simply could not find the file itself. 
    else 
    { 
     MessageBox(hwnd, psFilename, L"Missing Shader File", MB_OK); 
    } 

    return false; 
} 

// Create the vertex shader from the buffer. 
result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, 
    &m_vertexShader); 
if(FAILED(result)) 
{ 
    return false; 
} 

// Create the pixel shader from the buffer. 
result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, 
    &m_pixelShader); 
if(FAILED(result)) 
{ 
    return false; 
} 

// Create the vertex input layout description. 
// This setup needs to match the VertexType stucture in the ModelClass and in the shader. 
polygonLayout[0].SemanticName = "POSITION"; 
polygonLayout[0].SemanticIndex = 0; 
polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; 
polygonLayout[0].InputSlot = 0; 
polygonLayout[0].AlignedByteOffset = 0; 
polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 
polygonLayout[0].InstanceDataStepRate = 0; 

polygonLayout[1].SemanticName = "COLOR"; 
polygonLayout[1].SemanticIndex = 0; 
polygonLayout[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 
polygonLayout[1].InputSlot = 0; 
polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; 
polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 
polygonLayout[1].InstanceDataStepRate = 0; 

// Get a count of the elements in the layout. 
numElements = sizeof(polygonLayout)/sizeof(polygonLayout[0]); 

// Create the vertex input layout. 
result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), 
            vertexShaderBuffer->GetBufferSize(), &m_layout); 
if(FAILED(result)) 
{ 
    return false; 
} 

// Release the vertex shader buffer and pixel shader buffer since they are no longer needed. 
vertexShaderBuffer->Release(); 
vertexShaderBuffer = 0; 

pixelShaderBuffer->Release(); 
pixelShaderBuffer = 0; 

// Setup the description of the dynamic matrix constant buffer that is in the vertex shader. 
matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC; 
matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType); 
matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
matrixBufferDesc.MiscFlags = 0; 
matrixBufferDesc.StructureByteStride = 0; 

// Create the constant buffer pointer so we can access the vertex shader constant buffer from within this class. 
result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer); 
if(FAILED(result)) 
{ 
    return false; 
} 

return true; 
} 

而且顺便说一句的是,我从教程http://www.rastertek.com/dx11tut04.html去。你可以看到孔代码那里。 我听说问题可能是,我的视频卡不支持DirectX 11.如果这是问题,我可以使用功能级别11或类似的东西做软件顶点处理,所以它可以工作。

+0

好的,我觉得它的硬件问题。所以问题仍然可以在笔记本上做这个东西,哪个硬件不支持DirectX 11? –

+0

至少你应该告诉我们你遇到了什么错误。 – zdd

回答

0

如果您的显卡不支持Direct3D 11功能,程序将在设备初始化时失败,并且不会着色器创建,所以如果您使用D3D_FEATURE_LEVEL_11_0初始化设备并且成功,那意味着您的问题出现在着色器代码中的某处。这很可能是因为智能感知不适用于HLSL。

幸运的是,您的框架带有一些错误报告功能,所以您只需查看shader_errors.txt文件即可查看问题所在。

如果上述情况并非如此(即你已经改变了你的Direct3D功能级别),那么你有几种选择:

  1. 更改您的着色器模型的Direct3D功能级别在D3DX11CompileFromFile()方法匹配,例如如果您使用D3D_FEATURE_LEVEL_10_0,则将着色器型号设置为vs_4_0ps_4_0

  2. 如果你使用的是Windows 8(不支持DX11的机器上有点不太可能),那么你可以在你的设备初始化,这是一个快速软件光栅,但在旧版本的Windows不使用D3D_DRIVER_TYPE_WARP支持11_0功能级别。

  3. 作为最后的手段,您可以使用D3D_DRIVER_TYPE_REFERENCE,它支持所有Direct3D功能,但极其缓慢,无法使用。

最终总是有某种形式的情况下,你正运行在不支持您需要的功能级别的硬件后备选项的一个好主意。例如:

D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; 

HRESULT result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext); 
if (FAILED(result)) 
{ 
    featureLevel = D3D_FEATURE_LEVEL_10_0; 
    result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext); 
    if (FAILED(result)) 
    { 
     // OK, now quit, we need at least DirectX 10 compatible hardware 
     return false; 
    } 
} 

// In shader class 
if (m_device->GetFeatureLevel() == D3D_FEATURE_LEVEL_11_0) 
{ 
    // use 5.0 shader model 
} 
else 
{ 
    // use 4.0 shader model 
} 
+0

非常感谢您的回答,对于不清楚的问题表示抱歉。现在我再多解释一下。问题是我可以做些什么来使DirectX11在硬件上工作,但不支持它。我在另一台计算机上运行我的程序,但该计算机支持directx11,所以它在那里工作。此程序一直工作到着色器因为我将功能级别更改为directx 9.现在,我将检查它是否适用于directX10。并且...是的,它的工作表示感谢。 –

+0

我记得您可以启用硬件抽象层来模拟测试用软件丢失的任何硬件。就我的笔记而言,您可以将DirectX设置为使用“参考设备”类型,并在创建设备时将其设置为第二个参数。我知道对于DirectX 9来说是这样,查看它,至少如果你还有这些文件等,看看它已经有一段时间了。 – user3079666