Программирование графических процессоров с использованием Direct3D и HLSL


Обработка ошибок


При использовании графической библиотеки Direct3D программисту следует уделять особе внимание обработке ошибок. Для этих целей предусмотрены два специальных макроса, которые проверяют код на наличие или отсутствие ошибок:

FAILED() SUCCEEDED()

Принцип работы этих макросов очень прост и представлен ниже.

if ( FAILED()) // ошибка при выполнении команды ... else // команда завершилась успешно

Для второго макроса принцип действия будет противоположным.

if (SUCCEEDED ()) // команда завершилась успешно ... else // ошибка при выполнении команды

Ниже приведены некоторые примеры обработки ошибок.

C++

LPDIRECT3D9 direct3d = NULL; ... if( FAILED( direct3d -> CreateDevice( … ) ) ) { // обработка ошибки }

Pascal

var direct3d: IDirect3D9; ... if Failed ( direct3d.CreateDevice( … ) ) then begin // обработка ошибки end;

Можно осуществлять анализ ошибок через дополнительную переменную.

C++

HRESULT hr; hr = direct3d -> CreateDevice( … ); if( FAILED(hr) ) {

}

Pascal

var hr: HRESULT; … hr := direct3d.CreateDevice( … ); if Failed(hr) then begin

end

И еще один способ обработки ошибок заключается в сравнении результата вызова функции с константой D3D_OK.

C++

if ( direct3d -> CreateDevice( … ) != D3D_OK ) {

}

Pascal

if direct3d.CreateDevice( … ) <> D3D_OK then begin

end;

Следует также остановиться на обработке ошибок при компиляции шейдеров. Как мы помним, в одном из параметров функции D3DXCompileShaderFromFile(…) возвращается указатель на буфер ошибок. Ниже приводится программный код, позволяющий вывести на экран сообщение об ошибке, полученное от компилятора HLSL.

C++

if ( D3DXCompileShaderFromFile( "shader.psh", NULL, NULL, "main", "ps_2_0", 0, &Code, &BufferErrors, NULL) != D3D_OK ) { MessageBox(NULL, (const char*)BufferErrors->GetBufferPointer(), "Ошибка в шейдере!!!", MB_OK | MB_ICONEXCLAMATION); }

Pascal

if D3DXCompileShaderFromFile('shader.psh', nil, nil, 'Main','ps_2_0', 0, @Code, @BufferErrors, nil) D3D_OK then begin MessageBox(0, BufferErrors.GetBufferPointer, 'Ошибка в шейдере!!!', MB_OK or MB_ICONEXCLAMATION); end;

Такой информативный способ позволяет легко "увидеть" в какой именно строке шейдера допущена ошибка.



Содержание раздела