Войти
Вело-изобретателиФорумГрафика

Direct3D9 в VB6

Страницы: 1 2 Следующая »
#0
(Правка: 7 мая 2018, 9:46) 11:38, 10 ноя. 2015

Всем привет.
Уже довольно давно занимаюсь созданием библиотеки типов 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 эффектов к окнам.
Изображение

Скачать


#1
23:30, 12 янв. 2016

Крутатень! Спасибо!

#2
8:19, 13 фев. 2016

Подскажи.
У меня при такой конструкции Ошибка вылезает "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.
Куда она репортит? Как мне значение получить?

Мне надо ловить выход из полноэкранного режима,т.е. потерю девайса

#3
14:23, 13 фев. 2016

AWPStar
> Она не функция?)
Вообще функция возвращающая HRESULT, для VB6 это означает что если она возвратит значение отличное от 0, то будет сгенерирована ошибка. Узнать можно через Err.Number.

#4
14:28, 13 фев. 2016

the trick
Да, но она объявлена как Sub. И она не возвращает значений т.к. это sub)

#5
15:15, 13 фев. 2016

AWPStar
> Да, но она объявлена как Sub. И она не возвращает значений т.к. это sub)
Это VB6 так делает, потому что большинство методов COM объектов возвращают HRESULT являющееся статусом вызова. Если HRESULT < 0, значит произошла ошибка при вызове метода и VB6 генерирует ошибку присваивая номеру ошибки возвращаемое значение. Ты можешь сделать вроде этого:

On Error Resume Next
dev.TestCooperativeLevel
MsgBox "TestCooperativeLevel has returned: " & Err.Number
#6
15:44, 13 фев. 2016

the trick
Тут еще дело в том, что если TestCooperativeLevel <> 0 вызывается automation error и это ошибку можно только пропустить через On Error.
Какие-то танцы с бубном.) Не понимаю как обратно девайс восстановить, т.к. при D3DERR_DEVICENOTRESET ошибка уже не будет рейзиться и не узнать когда надо сделать reset.

Как ты эту проблему решаешь?

#7
15:52, 13 фев. 2016

AWPStar
> Тут еще дело в том, что если TestCooperativeLevel <> 0 вызывается automation
> error и это ошибку можно только пропустить через On Error.
Ты читаешь что я тебе пишу вообще? И должна ошибка генерироваться номер ошибки и есть возвращаемое значение которое ты получаешь через Err.Number.

#8
16:00, 13 фев. 2016

the trick
Да, действительно. Это у меня ресурсы все удалялись, черный экран. поэтому я думал, что девайс не восстанавливался т.к. считал, что Err.Number = 0

#9
10:50, 27 фев. 2016

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.

#10
11:57, 27 фев. 2016

Mikle
Привет.
Исправил матрицы и изменил тип указателей. Качать по той же ссылке.

#11
12:08, 27 фев. 2016

Вот это оперативность! Благодарю.

#12
21:19, 31 мая 2016

Привет.
Подскажи как создать шейдер.
Пытаюсь сделать так:

Set CreateVertexShaderFromFile = d3dev.CreateVertexShader( VarPtr(ar(0)))
где "ar() as byte" - это файл шейдера(откомпилированный).
Выдает ошибку 0x8876086c.
Может что-то где-то не так делаю.

Делаю по аналогии с функцией Майлка, только там параметры другие(т.е. те же, но присвоение другое).

#13
21:39, 31 мая 2016

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))

#14
21:48, 31 мая 2016

the trick
Спасибо! Похоже, что да. Видимо размер файлов шейдеров всегда кратен 4ем.

Страницы: 1 2 Следующая »
Вело-изобретателиФорумГрафика