Первые решения шейдеров.Начальная путаница с учебником по DirectX - PullRequest
0 голосов
/ 23 июля 2011

Я следую учебному руководству по DirectX с очень небольшим знанием C ++ по Visual C ++ 2010. Я знаю достаточно, чтобы понять / понять все до этого момента, но сейчас я пытаюсь включить шейдер HLSL. У меня есть содержимое, которое мне нужно, но я не знаю, каким файлом должен быть HLSL. Есть ли формат, в котором файл должен быть сделан? Я пытался поместить код шейдера в файл .cpp, но я получаю нарушение прав доступа при использовании функции CreateVertexShader. Я поместил его в заголовочный файл, но он прочитал код HLSL, такой как C ++, и получил синтаксические ошибки. Урок здесь: http://www.directxtutorial.com/Tutorial11/B-A/BA5.aspx

Код в коде внизу страницы идентичен и компилируется, но при отладке получает нарушение прав доступа. Может ли кто-нибудь показать мне, что мне нужно сделать, чтобы он работал правильно?

Спасибо.

1 Ответ

1 голос
/ 23 июля 2011

Этот сайт очень плохой, так как на нем вообще отсутствует проверка ошибок. Каждый вызов DirectX, который возвращает HRESULT ДОЛЖЕН , проверяется на наличие ошибок. Если он возвращает S_OK, все в порядке. Проверьте документацию и убедитесь, что вы проверяете КАЖДОЕ возвращаемое значение DirectX.

Ваш шейдер, вероятно, имеет ошибки и не может скомпилироваться, поэтому вы, вероятно, передаете NULL-указатель в CreateVertexShader.

Вот как я проверяю ошибки:

Сначала поместите это куда-нибудь (для этого вам не нужны все эти включения и библиотеки, но я не уверен, что это необходимо для работы):

#include <D3D11.h>
#include <DXGI.h>
#include <DxErr.h>
#include <D3D11Shader.h>
#include <D3Dcompiler.h>
#include <D3DX11async.h>

#if defined(_DEBUG)
#pragma comment(lib,"d3dx11d.lib")
#else
#pragma comment(lib,"d3dx11.lib")
#endif

#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"dxgi.lib")
#pragma comment(lib,"DxErr.lib")
#pragma comment(lib,"d3dcompiler.lib")

    #ifndef HR
        #define HR(x){HRESULT hr=x;if(FAILED(hr)){DXTraceW(__FILE__,(DWORD)__LINE__,hr,L#x,true);TRUE;}}
    #endif

Теперь для каждого вызова DirectX, который возвращает HRESULT (все вызовы Create * или вызовы compile_shader_from_file), сделайте следующее:

HR(device->CreateVertexShader(shaderBlob->GetBufferPointer(),shaderBlob->GetBufferSize(),NULL,&vs));

Обратите внимание на "HR (" в начале и, очевидно, еще один ")" в самом конце. Если этот вызов DirectX не удается, вы получите сообщение об ошибке.

Дополнительно для шейдеров вы должны получить больше данных, чтобы увидеть, что вы на самом деле облажались при написании кода HLSL. Вот как я это делаю:

ID3D10Blob* shaderBlob=NULL;
ID3D10Blob* errorBlob=NULL;

HR(D3DX11CompileFromFileA(fileName.c_str(),macros,NULL,mainFunction.c_str(),shaderModel.c_str(),
    shaderCompileFlags,0,NULL,&shaderBlob,&errorBlob,NULL)); 

if(errorBlob)
{
    char* es=reinterpret_cast<char*>(errorBlob->GetBufferPointer());
        NXMsg("ERROR",es);// Shows error message box
    errorBlob->Release();
    return NULL;
}

Формат файлов с кодом HLSL не имеет значения. Обычно люди выбирают что-то вроде .hlsl, .vs (вершинный шейдер), .ps (пиксельный шейдер) или что-то еще.

...