2

我一直在搞乱 DirectX,而且我一直在研究我的这个奇怪的想法已经有一段时间了。似乎我的像素着色器由于某种奇怪的原因没有被调用。我不知道这是否可能,或者这是我的一些愚蠢的错误。代码如下(我从教程中复制了大部分内容。)

着色器(HLSL)代码如下:

/*
********************************************************************************************************
*   Constant Buffers (Can only change per render call).
********************************************************************************************************
*/
cbuffer SConstantBuffer : register( b0 )
{
    float3 origin;
    float3 direction;
    float planeDistance;
    int screenWidth;
    int screenHeight;
};


/*
********************************************************************************************************
*   Input and Output Structures
********************************************************************************************************
*/
struct VS_INPUT
{
    float3 position     :   POSITION;
    float4 color        :   COLOR;
};

struct VS_OUTPUT
{
    float4 position     :   SV_POSITION;
    float4 color        :   COLOR;
};


/*
********************************************************************************************************
*   Vertex Shader main
********************************************************************************************************
*/
VS_OUTPUT VS( VS_INPUT input )
{
    VS_OUTPUT output = (VS_OUTPUT)0;

    float param_d;
    float3 pixelPoint;
    float3 zAxis = { 0.0, 0.0, 1.0 };
    float3 planeOrigin = origin + (direction * planeDistance);
    float3 pointDirection = (input.position - origin) / length( (input.position - origin) );

    param_d = dot( (planeOrigin - origin), direction ) / dot( pointDirection, direction );
    pixelPoint = ( pointDirection * param_d ) + origin;

    output.position.xyz = cross ( pixelPoint, direction );
    output.position.x = output.position.x * 5.0;
    output.position.y = output.position.y * 5.0;
    output.position.z = 20.0;
    output.position.w = output.position.z;

    output.color = input.color;

    return output;
}


/*
********************************************************************************************************
*   Pixel Shader main
********************************************************************************************************
*/
float4 PS( VS_OUTPUT input ) : SV_Target
{
    return float4( 1.0, 1.0, 1.0, 1.0); //input.color;
}

DirectX 初始化和渲染代码如下:

#include "Renderer.h"

CRenderer::CRenderer ( )
{
    this->m_dxDevice = NULL;
    this->m_dxDeviceContext = NULL;
    this->m_dxRenderTargetView = NULL;
    this->m_dxSwapChain = NULL;
    this->m_dxBackBuffer = NULL;
    this->m_dxVertexLayout = NULL;
    this->m_dxVertexBuffer = NULL;
    this->m_dxPixelShader = NULL;
    this->m_dxConstantBuffer = NULL;
}

HRESULT 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 = D3DX11CompileFromFile( szFileName, NULL, NULL, szEntryPoint, szShaderModel, 
        dwShaderFlags, 0, NULL, ppBlobOut, &pErrorBlob, NULL );
    if( FAILED(hr) )
    {
        if( pErrorBlob != NULL )
            OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer() );
        if( pErrorBlob ) pErrorBlob->Release();
        return hr;
    }
    if( pErrorBlob ) pErrorBlob->Release();

    return S_OK;
}

HRESULT CRenderer::InitDevice ( HWND arg_hWnd )
{
    HRESULT status = S_OK;
    this->m_hWnd = arg_hWnd;

    RECT rctWindowSize;
    GetClientRect( arg_hWnd, &rctWindowSize );
    UINT dWidth = rctWindowSize.right - rctWindowSize.left;
    UINT dHeight = rctWindowSize.bottom - rctWindowSize.top;

    UINT dCreateDeviceFlag = 0;
#ifdef _DEBUG
    dCreateDeviceFlag |= D3D11_CREATE_DEVICE_DEBUG;
#endif _DEBUG

    D3D_DRIVER_TYPE pDriverType [] = 
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE
    };
    UINT numDriverType = ARRAYSIZE(pDriverType);

    D3D_FEATURE_LEVEL pFeatureLevel [] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0
    };
    UINT numFeatureLevel = ARRAYSIZE(pFeatureLevel);


    //Fillout Device Descriptor
    DXGI_SWAP_CHAIN_DESC objSwapChainDesc;
    ZeroMemory(&objSwapChainDesc, sizeof(objSwapChainDesc));
    objSwapChainDesc.BufferCount = 1;
    objSwapChainDesc.BufferDesc.Width = dWidth;
    objSwapChainDesc.BufferDesc.Height = dHeight;
    objSwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    objSwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    objSwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    objSwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    objSwapChainDesc.OutputWindow = this->m_hWnd;
    objSwapChainDesc.SampleDesc.Count = 1;
    objSwapChainDesc.SampleDesc.Quality = 0;
    objSwapChainDesc.Windowed = true;


    //Parse and create the appropriate type of device
    for ( UINT driverTypeIndex = 0; driverTypeIndex < numDriverType; driverTypeIndex++ )
    {
        this->m_objDriverType = pDriverType[driverTypeIndex];
        status = D3D11CreateDeviceAndSwapChain ( NULL, 
                                                 this->m_objDriverType, 
                                                 NULL, 
                                                 dCreateDeviceFlag, 
                                                 pFeatureLevel, 
                                                 numFeatureLevel, 
                                                 D3D11_SDK_VERSION,
                                                 &objSwapChainDesc, 
                                                 &(this->m_dxSwapChain), 
                                                 &(this->m_dxDevice), 
                                                 &(this->m_objFeatureLevel), 
                                                 &(this->m_dxDeviceContext) );
        if ( SUCCEEDED(status) )
            break;
    }
    if ( FAILED(status) )
        return status;


    //Create a render traget
    this->m_dxBackBuffer = NULL;
    status = this->m_dxSwapChain->GetBuffer ( 0, __uuidof(ID3D11Texture2D), (LPVOID*)(&this->m_dxBackBuffer) );
    if ( FAILED(status) )
        return status;

    status = this->m_dxDevice->CreateRenderTargetView ( this->m_dxBackBuffer, NULL, &(this->m_dxRenderTargetView) );
    if ( FAILED(status) )
        return status;


    //CreatDepth Stencil
    D3D11_TEXTURE2D_DESC objDepthStencilDesc;
    ZeroMemory(&objDepthStencilDesc, sizeof(objDepthStencilDesc));

    D3D11_DEPTH_STENCIL_VIEW_DESC objDepthStencilViewDesc;
    ZeroMemory(&objDepthStencilViewDesc, sizeof(objDepthStencilViewDesc));

    objDepthStencilDesc.Width = dWidth;
    objDepthStencilDesc.Height = dHeight;
    objDepthStencilDesc.MipLevels = 1;
    objDepthStencilDesc.ArraySize = 1;
    objDepthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
    objDepthStencilDesc.SampleDesc.Count = 1;
    objDepthStencilDesc.SampleDesc.Quality = 0;
    objDepthStencilDesc.Usage = D3D11_USAGE_DEFAULT;
    objDepthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
    objDepthStencilDesc.MiscFlags = 0;
    objDepthStencilDesc.CPUAccessFlags = 0;

    status = this->m_dxDevice->CreateTexture2D ( 
                                                &objDepthStencilDesc, 
                                                NULL,
                                                &(this->m_dxDepthStencilBuffer)
                                                );
    if ( FAILED(status) )
        return status;

    objDepthStencilViewDesc.Format = objDepthStencilDesc.Format;
    objDepthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
    objDepthStencilViewDesc.Texture2D.MipSlice = 0;

    status = this->m_dxDevice->CreateDepthStencilView ( 
                                                       this->m_dxDepthStencilBuffer,
                                                       &objDepthStencilViewDesc,
                                                       &(this->m_dxDepthStencilView)
                                                      );
    if ( FAILED(status) )
        return status;

    this->m_dxDeviceContext->OMSetRenderTargets ( 1, &(this->m_dxRenderTargetView), this->m_dxDepthStencilView );


    //Set View Port (Can be commented out;
    this->m_objViewport.Width       = (FLOAT)dWidth;
    this->m_objViewport.Height      = (FLOAT)dHeight;
    this->m_objViewport.MinDepth    = 0.0;
    this->m_objViewport.MaxDepth    = 1.0;
    this->m_objViewport.TopLeftX    = 0;
    this->m_objViewport.TopLeftY    = 0;

    this->m_dxDeviceContext->RSSetViewports ( 1, &(this->m_objViewport) );


    //Setting up Shaders
    //Compiling Vertex Shader file
    ID3DBlob * dxVSBlob = NULL;
    status = CompileShaderFromFile ( L"RTShaders.fx", "VS", "vs_4_0", &dxVSBlob );
    if (FAILED (status))
    {
        dxVSBlob->Release ( );
        return status;
    }

    //Creating Compiled Shader
    status = this->m_dxDevice->CreateVertexShader ( dxVSBlob->GetBufferPointer ( ), 
                                                    dxVSBlob->GetBufferSize ( ),
                                                    NULL,
                                                    &(this->m_dxVertexShader) );
    if( FAILED(status) )
    {
        dxVSBlob->Release ( );
        return status;
    }

    //Describe Layout
    D3D11_INPUT_ELEMENT_DESC layout [] =
    {
        {
            "POSITION",
            0,
            DXGI_FORMAT_R32G32B32_FLOAT,
            0,
            0,
            D3D11_INPUT_PER_VERTEX_DATA,
            0
        },
/*      {
            "NORMAL",
            0,
            DXGI_FORMAT_R32G32B32A32_FLOAT,
            0,
            16,
            D3D11_INPUT_PER_VERTEX_DATA,
            0
        },
*/      {
            "COLOR",
            0,
            DXGI_FORMAT_R32G32B32_FLOAT,
            0,
            12,                             //NEED TO CHANGE THIS TO 32 WHEN UNCOMMENTING THE ABOVE BLOCK
            D3D11_INPUT_PER_VERTEX_DATA,
            0
        },
    };
    UINT numElements = ARRAYSIZE(layout);

    //Create Layout
    status = this->m_dxDevice->CreateInputLayout ( layout, 
                                                   numElements, 
                                                   dxVSBlob->GetBufferPointer ( ), 
                                                   dxVSBlob->GetBufferSize ( ), 
                                                   &(this->m_dxVertexLayout) );
    dxVSBlob->Release ( );
    dxVSBlob = NULL;
    if ( FAILED(status) )
    {
        return status;
    }

    //Set Vertex Layout to the pipeline
    this->m_dxDeviceContext->IASetInputLayout ( this->m_dxVertexLayout );

    //Compiling Pixel Shader File
    ID3DBlob * dxPSBlob = NULL;
    status = CompileShaderFromFile ( L"RTShaders.fx", "PS", "ps_4_0", &dxPSBlob );
    if ( FAILED(status) )
    {
        if ( dxPSBlob )
            dxPSBlob->Release ( );
        return status;
    }

    //Creating Compiled Pixel Shader
    status = this->m_dxDevice->CreatePixelShader ( 
                                                 dxPSBlob->GetBufferPointer ( ),
                                                 dxPSBlob->GetBufferSize ( ),
                                                 NULL,
                                                 &(this->m_dxPixelShader)
                                                 );
    dxPSBlob->Release ( );
    dxPSBlob = NULL;
    if ( FAILED(status) )
    {
        return status;
    }

    return S_OK;
}
HRESULT CRenderer::CreateVertexBuffer ( )
{
    HRESULT status = S_OK;

    D3D11_BUFFER_DESC objBufferDesc;
    D3D11_SUBRESOURCE_DATA objSubresData;
    UINT dStride = sizeof (SVertex);
    UINT dOffset = 0;

    ZeroMemory(&objBufferDesc, sizeof(objBufferDesc));
    ZeroMemory(&objSubresData, sizeof(objSubresData));

    objBufferDesc.ByteWidth = sizeof(SVertex) * 1681;
    objBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    objBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    objBufferDesc.CPUAccessFlags = 0;

    objSubresData.pSysMem = pVertexData;

    status = this->m_dxDevice->CreateBuffer (
                                            &objBufferDesc,
                                            &objSubresData,
                                            &(this->m_dxVertexBuffer)
                                            );
    if ( FAILED(status) )
        return status;

    this->m_dxDeviceContext->IASetVertexBuffers ( 0, 1, &(this->m_dxVertexBuffer), &dStride, &dOffset );

    this->m_dxDeviceContext->IASetPrimitiveTopology ( D3D11_PRIMITIVE_TOPOLOGY_POINTLIST );

    return S_OK;
}

HRESULT CRenderer::CreateConstantBuffer ( )
{
    HRESULT status = S_OK;

    D3D11_BUFFER_DESC objBufferDesc;

    ZeroMemory(&objBufferDesc, sizeof(objBufferDesc));

    objBufferDesc.ByteWidth = sizeof(SConstantBuffer) + (16 - sizeof(SConstantBuffer)%16);
    objBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    objBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    objBufferDesc.CPUAccessFlags = 0;

    status = this->m_dxDevice->CreateBuffer (
                                            &objBufferDesc,
                                            NULL,
                                            &(this->m_dxConstantBuffer)
                                            );

    return status;
}

HRESULT CRenderer::Render ( )
{
    HRESULT status = S_OK;
    RECT screenRect;
    SConstantBuffer objConstBuffer;

    float pClearColor [4] = { 0.0f, 0.125f, 0.5f, 1.0f };

    this->m_dxDeviceContext->ClearRenderTargetView ( this->m_dxRenderTargetView, pClearColor );
    this->m_dxDeviceContext->ClearDepthStencilView ( this->m_dxDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

    GetClientRect ( this->m_hWnd, &screenRect );
    objConstBuffer.f4Origin = XMFLOAT3 ( 0.0f, 0.0f, 0.0f );
    objConstBuffer.f4Direction = XMFLOAT3 ( 0.0f, 0.0f, 1.0f );
    objConstBuffer.fDistanceFromPlane = 2.0f;
    objConstBuffer.dScreenWidth = screenRect.right - screenRect.left;
    objConstBuffer.dScreenHeight = screenRect.bottom - screenRect.top;
    this->m_dxDeviceContext->UpdateSubresource ( this->m_dxConstantBuffer, 0, NULL, &objConstBuffer, 0, 0 );

    this->m_dxDeviceContext->VSSetShader ( this->m_dxVertexShader, NULL, 0 );
    this->m_dxDeviceContext->VSSetConstantBuffers ( 0, 1, &(this->m_dxConstantBuffer) );
    this->m_dxDeviceContext->PSSetShader ( this->m_dxPixelShader, NULL, 0 );
    this->m_dxDeviceContext->Draw ( 1680, 0 );

    this->m_dxSwapChain->Present ( 0, 0 );

    return status;
}

CRenderer::~CRenderer ( )
{
    if ( this->m_dxDeviceContext ) 
        this->m_dxDeviceContext->ClearState ( );

    if ( this->m_dxPixelShader )
        this->m_dxPixelShader->Release ( );
    this->m_dxPixelShader = NULL;

    if ( this->m_dxVertexLayout )
        this->m_dxVertexLayout->Release ( );
    this->m_dxVertexLayout = NULL;

    if ( this->m_dxVertexBuffer )
        this->m_dxVertexBuffer->Release ( );
    this->m_dxVertexBuffer = NULL;

    if ( this->m_dxDepthStencilBuffer )
        this->m_dxDepthStencilBuffer->Release ( );
    this->m_dxDepthStencilBuffer = NULL;

    if ( this->m_dxDepthStencilView )
        this->m_dxDepthStencilView->Release ( );
    this->m_dxDepthStencilView = NULL;

    if ( this->m_dxRenderTargetView )
        this->m_dxRenderTargetView->Release ( );
    this->m_dxRenderTargetView = NULL;

    if ( this->m_dxBackBuffer->Release ( ) )
        this->m_dxBackBuffer->Release ( );
    this->m_dxBackBuffer = NULL;

    if ( this->m_dxSwapChain )
        this->m_dxSwapChain->Release ( );
    this->m_dxSwapChain = NULL;

    if ( this->m_dxDeviceContext )
        this->m_dxDeviceContext->Release ( );
    this->m_dxDeviceContext = NULL;

    if ( this->m_dxDevice )
        this->m_dxDevice->Release ( );
    this->m_dxDevice = NULL;
}

什么都没有在屏幕上渲染,我应该看到点或一个大的白色补丁,但我看到的只是渲染目标已清除。我一直在运行 Pix,PreVS 和 PostVS 转换看起来不错。请帮忙!

4

0 回答 0