Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建顶点缓冲区时出错_C++_Directx_Directx 11_Vertex Buffer - Fatal编程技术网

C++ 创建顶点缓冲区时出错

C++ 创建顶点缓冲区时出错,c++,directx,directx-11,vertex-buffer,C++,Directx,Directx 11,Vertex Buffer,创建vertexbuffer时出错 这是我的密码: bool ColorShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, WCHAR* vsFilename, WCHAR* psFilename) { HRESULT result; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShade

创建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;
}
顺便说一句,我从教程开始。你可以在那里看到孔代码。
我听说问题可能是,我的显卡不支持DirectX 11。如果这是问题所在,我可以用功能级别11或类似的东西进行软件顶点处理,这样它就可以工作。

如果您的卡不支持Direct3D 11功能,程序将在设备初始化时失败,而不是创建着色器,因此如果您使用
D3D_功能级别11_0
初始化设备并成功,这意味着您的问题存在于着色器代码的某个地方。这很可能是因为IntelliSense不能与HLSL一起工作

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

如果上述情况并非如此(即您已经更改了Direct3D功能级别),则您有几个选项:

  • D3DX11CompileFromFile()
    方法中更改着色器模型以匹配Direct3D功能级别,例如,如果使用
    D3D\u功能级别\u 10\u 0
    将着色器模型设置为
    vs\u 4\u 0
    ps\u 4\u 0

  • 如果您使用的是Windows 8(在不支持DX11的机器上不太可能),那么您可以在设备初始化中使用
    D3D\u DRIVER\u TYPE\u WARP
    ,这是一种快速的软件光栅化器,但在旧版本的Windows上它不支持11\u 0功能级别

  • 最后,您可以使用
    D3D\u DRIVER\u TYPE\u 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
    }
    

    好的,我想这是硬件问题。所以问题仍然是,我可以在笔记本电脑上做这些事情吗?哪种硬件不支持DirectX 11?至少你应该告诉我们你遇到了什么错误。非常感谢你的回答,很抱歉问题不清楚。我现在将进一步解释。问题是我能做些什么让directx11在不支持它的硬件上工作。我在另一台计算机上运行了我的程序,但那台计算机支持directx11,这个程序一直运行到着色器,因为我将功能级别更改为directx 9。现在我将检查它是否适用于directX10。而且…是的,它工作了,谢谢。我记得,为了测试目的,您可以启用硬件抽象层来模拟任何缺少软件的硬件。从我的笔记中可以看出,您将DirectX设置为使用“参考设备”类型,并且在创建设备时在第二个参数处设置该类型。我知道DirectX 9也是如此,至少如果你还有文件等等,就查一下,因为已经有一段时间了。