Всем привет.
Уже довольно давно занимаюсь созданием библиотеки типов Direct3D9 и вспомогательных функций D3DX для VB6.
Итак в архиве содержится библиотека типов "DirectX 9 for Visual Basic 6.0 type library by The trick" (dx9vb.tlb) содержащая описание следующих интерфейсов:
IDirect3D9; IDirect3DDevice9; IDirect3DSurface9; IDirect3DResource9; IDirect3DSwapChain9; IDirect3DTexture9; IDirect3DBaseTexture9; IDirect3DVolumeTexture9; IDirect3DVolume9; IDirect3DCubeTexture9; IDirect3DVertexBuffer9; IDirect3DIndexBuffer9; IDirect3DStateBlock9; IDirect3DVertexDeclaration9; IDirect3DVertexShader9; IDirect3DPixelShader9; IDirect3DQuery9;
Также в этой библиотеке задеклалриованы множество типов, констант и энумов. Работа этой библиотеки слабо тестировалась, поэтому что-то может не работать.
Также в архиве содержится несколько модулей написанных на VB6:
D3DX_COLOR.bas - для работы с цветами D3DX_MATRICES.bas - для работы с матрицами D3DX_QUATERNION.bas - для работы с кватернионами D3DX_VECTOR2.bas, D3DX_VECTOR3.bas, D3DX_VECTOR4.bas - для работы с векторами D3DX_MISC.bas - различные функции которые не вошли не в одну из категорий
Эти модули содержат аналоги соответствующих функций D3DX. После компиляции EXE файл не содержит никаких зависимостей (естественно DirectX9), т.е. tlb не нужна.
Также в архиве содержится несколько тестовых примеров работы, которые, возможно я буду пополнять:
Генерация ландшафта:
Простой огонь:
Вывод текста:
Применение 3D эффектов к окнам.
Крутатень! Спасибо!
Подскажи.
У меня при такой конструкции Ошибка вылезает "expected function or variable"
rev = dev.TestCooperativeLevel
Она не функция?)
Sub TestCooperativeLevel() Member of DxVBLib.IDirect3DDevice9 Reports the current cooperative-level status of the Direct3D device for a windowed or full-screen application.
Куда она репортит? Как мне значение получить?
Мне надо ловить выход из полноэкранного режима,т.е. потерю девайса
AWPStar
> Она не функция?)
Вообще функция возвращающая HRESULT, для VB6 это означает что если она возвратит значение отличное от 0, то будет сгенерирована ошибка. Узнать можно через Err.Number.
the trick
Да, но она объявлена как Sub. И она не возвращает значений т.к. это sub)
AWPStar
> Да, но она объявлена как Sub. И она не возвращает значений т.к. это sub)
Это VB6 так делает, потому что большинство методов COM объектов возвращают HRESULT являющееся статусом вызова. Если HRESULT < 0, значит произошла ошибка при вызове метода и VB6 генерирует ошибку присваивая номеру ошибки возвращаемое значение. Ты можешь сделать вроде этого:
On Error Resume Next dev.TestCooperativeLevel MsgBox "TestCooperativeLevel has returned: " & Err.Number
the trick
Тут еще дело в том, что если TestCooperativeLevel <> 0 вызывается automation error и это ошибку можно только пропустить через On Error.
Какие-то танцы с бубном.) Не понимаю как обратно девайс восстановить, т.к. при D3DERR_DEVICENOTRESET ошибка уже не будет рейзиться и не узнать когда надо сделать reset.
Как ты эту проблему решаешь?
AWPStar
> Тут еще дело в том, что если TestCooperativeLevel <> 0 вызывается automation
> error и это ошибку можно только пропустить через On Error.
Ты читаешь что я тебе пишу вообще? И должна ошибка генерироваться номер ошибки и есть возвращаемое значение которое ты получаешь через Err.Number.
the trick
Да, действительно. Это у меня ресурсы все удалялись, черный экран. поэтому я думал, что девайс не восстанавливался т.к. считал, что Err.Number = 0
the trick
Два дня я бился над криво работающими отражениями, в конце концов предположил, что криво работает моя математика, подключил твою... опять лаги, но другие.
В конце концов выяснил, что и у меня, и у тебя криво работает простая функция - транспозиция матрицы, только моя портила данные при транспонировании одной матрицы в другую, а твоя портит, если транспонировать матрицу в себя.
Ещё хотелось бы кое-что поменять, если это не очень сложно.
В таких методах, как SetPixelShaderConstant, SetVertexShaderConstant, CreateVertexShader, CreatePixelShader хотелось бы иметь нетипизированный указатель (As Any) на загружаемые данные.
У меня набор загружаемых в вертексный шейдер констант собран в структуру VSConst, создана переменная VSC As VSConst. Вместо того, чтобы писать так:
Dev.SetVertexShaderConstantF 0, VSC, Len(VSC) \ 16
приходится писать так:
Dev.SetVertexShaderConstantF 0, VSC.MtrxWVP.m11, Len(VSC) \ 16
потому, что требуется именно Single.
Шейдеры хранятся в ресурсах, LoadResData возвращает байтовый массив, а CreateVertexShader и CreatePixelShader просят именно Long.
Mikle
Привет.
Исправил матрицы и изменил тип указателей. Качать по той же ссылке.
Вот это оперативность! Благодарю.
Привет.
Подскажи как создать шейдер.
Пытаюсь сделать так:
Set CreateVertexShaderFromFile = d3dev.CreateVertexShader( VarPtr(ar(0)))
где "ar() as byte" - это файл шейдера(откомпилированный).
Выдает ошибку 0x8876086c.
Может что-то где-то не так делаю.
Делаю по аналогии с функцией Майлка, только там параметры другие(т.е. те же, но присвоение другое).
AWPStar
> Подскажи как создать шейдер.
Не работал с шейдерами, но аналогия - https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb174366(v=vs.85).aspx
Похоже что нужно делать не ar() as byte, а ar() as Long, и передавать Set CreateVertexShaderFromFile = d3dev.CreateVertexShader(ar(0))
the trick
Спасибо! Похоже, что да. Видимо размер файлов шейдеров всегда кратен 4ем.
Тема в архиве.