Необычная ошибка при вызове SetRenderTarget в DX8.

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Mikle » 12.07.2006 (Ср) 19:30

[Правка]
Одна из поднимаемых тут проблем была быстро решена, поэтому я исправил название темы так, чтобы он отражал решаемый в данный момент вопрос. Актуально начинать читать с восьмого поста.
[/Правка]

Надеюсь, что вопрос подойдет под новый раздел :roll:
При попытке использование D3DX из DX8 в VB5 выводится сообщение об ошибке, Direct3D без использования D3DX работает. Фатально ли это? А то хочется иногда заюзать VB5 Control Creation, как бесплатную версию :wink:
Последний раз редактировалось Mikle 22.07.2006 (Сб) 9:36, всего редактировалось 2 раз(а).

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 12.07.2006 (Ср) 22:12

Очень интересно.. А почему же у меня буквально пол-года назад, когда я кодил на VB5 все отлично работало с DirectX8, в т.ч. и D3D?

А какая хоть ошибка?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.07.2006 (Чт) 10:40

AjaxVS
Я же написал - не работает именно D3DX, D3D работает.
Ошибка - Object Variable or With Block not set.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 13.07.2006 (Чт) 10:55

Хм... Текст ошибки как то наводит на мысли что вопрос не по адресу тут :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.07.2006 (Чт) 16:28

RayShade
Я понимаю, что обозначает эта ошибка, дело не в этом. Программа с тем же текстом на VB6 работает, а на VB5 сообщает об ошибке. Объявлены те же переменные, в списке References то же самое.

Я аж засомневался, эту ли конкретно ошибку выдает VB5, дома посмотрю еще раз.

Valenok
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 13.07.2006 (Чт) 10:40

Сообщение Valenok » 13.07.2006 (Чт) 18:21

Синтаксис языка разве не был немного изменён?
--
Truly yours, Sasha.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.07.2006 (Чт) 20:28

Допустим даже если и был иземенён синтаксис, хотя сомневаюсь, что что-то в нём изменилось. Как от этого изменилась работоспособность подключенной библиотеки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.07.2006 (Пт) 10:23

Все оказалось проще. :roll:
Переустановка VB5 решила проблему, до переустановки неработал только D3DX. Так что зря я напряг высокое общество таким пустяком :roll: .
Но у меня была еще одна родственная проблема.
Вот простейший код, использующий рендер в текстуру:
Код: Выделить всё
Option Explicit

Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dDevice As Direct3DDevice8

Dim MainC As Direct3DSurface8
Dim TexRT As Direct3DTexture8
Dim NewC As Direct3DSurface8

Dim Running As Boolean

Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS
  Set d3d = dx.Direct3DCreate
  d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode

  d3dpp.Windowed = True
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
  d3dpp.BackBufferFormat = DispMode.Format

  Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
  Set MainC = d3dDevice.GetRenderTarget

  Set TexRT = d3dDevice.CreateTexture(128, 128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
  Set NewC = TexRT.GetSurfaceLevel(0)
End Sub

Private Sub Render()
  d3dDevice.SetRenderTarget NewC, Nothing, 0
  d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0

  d3dDevice.SetRenderTarget MainC, Nothing, 0
  d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
  d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Private Sub Form_Load()
'  On Local Error Resume Next
  Me.Show
  InitD3D
  Running = True
  Do While DoEvents
    Render
  Loop
  Set MainC = Nothing
  Set NewC = Nothing
  Set TexRT = Nothing
  Set d3dDevice = Nothing
  Set d3d = Nothing
  Set dx = Nothing
End Sub

Он работает в среде VB, работает, если скомпилировать в P-code, но не работает в Native Code. Иногда выдается ошибка "Object Variable or With Block not set", но чаще просто "Программа выполнила недопустимую операцию..."
Ошибка явно происходит в процедуре Render, по крайней мере если ее заремить - все работает. Но введение "On Local Error Resume Next" в эту процедуру не спасает, зато спасает, если ввести это в Form_Load, где ошибки быть просто не может.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 22.07.2006 (Сб) 9:28

Код: Выделить всё
Option Explicit

Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dDevice As Direct3DDevice8

Dim MainC As Direct3DSurface8
Dim TexRT As Direct3DTexture8
Dim NewC As Direct3DSurface8

Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS
  Set d3d = dx.Direct3DCreate
  d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode

  d3dpp.Windowed = True
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
  d3dpp.BackBufferFormat = DispMode.Format

  Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
  Set MainC = d3dDevice.GetRenderTarget

  Set TexRT = d3dDevice.CreateTexture(128, 128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
  Set NewC = TexRT.GetSurfaceLevel(0)
End Sub

Private Sub Form_Load()
  Me.Show
  InitD3D
  Do While DoEvents
    d3dDevice.SetRenderTarget NewC, Nothing, 0
    d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
 
    d3dDevice.SetRenderTarget MainC, Nothing, 0
    d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
    d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
  Loop
  Set MainC = Nothing
  Set NewC = Nothing
  Set TexRT = Nothing
  Set d3dDevice = Nothing
  Set d3d = Nothing
  Set dx = Nothing
End Sub

Я ничего не изменил, только вместо вызова процедуры Render подставил ее содержимое - и все работает.
Народ, помогите разобраться с ситуацией. Очевидно, что при вызове d3dDevice.SetRenderTarget происходит что-то некорректное, причем оно дает ошибку не в текущей процедуре, а уровнем выше, причем только в Native Code. Во втором примере уровня "выше" нет - и не стало ошибки...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 29.06.2007 (Пт) 2:44

Самое интересное, что так тоже слетает:
Код: Выделить всё
Private Sub Form_Load()
  On Error GoTo ErrLabel
  Me.Show
  InitD3D
  Running = True
  Do While DoEvents
    Render
  Loop
  Set MainC = Nothing
  Set NewC = Nothing
  Set TexRT = Nothing
  Set d3dDevice = Nothing
  Set d3d = Nothing
  Set dx = Nothing
Exit Sub

ErrLabel:
MsgBox Err.Description
End Sub
:shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.06.2007 (Пт) 8:14

Вырезать 2...7 посты?
Lasciate ogni speranza, voi ch'entrate.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re:

Сообщение Vovik » 10.01.2011 (Пн) 21:26

Короче старая песня о главном... Майкл, помнится ты говорил, что в библе можно сделать одну приватную функцию, где вызывается SetRenderTarget и public функцию, в которой стоит on error и вызывается та самая приватная. Печально то, что этот ход не спасает ситуацию. Помогает on error только в самой программе, причем не важно его расположение. Мне понравилось ставить его в конце цикла и ошибку не выдало. Т.е. первый (или несколько первых) проход(ов) рендерится без ошибки!!! :shock: Как можно обмануть эту заразу? Не указывать же в сдк, что при использовании рендера в текстуру вам нужно обязательно прописать строчку On Local Error Resume Next :lol:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.01.2011 (Вт) 3:28

Майкл!!!!! Сделал такой эксперимент:
Код: Выделить всё
Option Explicit

Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dDevice As Direct3DDevice8

Dim MainC As Direct3DSurface8
Dim TexRT As Direct3DTexture8
Dim NewC As Direct3DSurface8

Dim Running As Boolean

Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS
  Set d3d = dx.Direct3DCreate
  d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode

  d3dpp.Windowed = True
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
  d3dpp.BackBufferFormat = DispMode.Format

  Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
  Set MainC = d3dDevice.GetRenderTarget

  Set TexRT = d3dDevice.CreateTexture(128, 128, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)
  Set NewC = TexRT.GetSurfaceLevel(0)
End Sub

Private Sub Render()
  MsgBox "5"
  d3dDevice.SetRenderTarget MainC, Nothing, 0
 
  MsgBox "6"
  d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
 
  MsgBox "7"
  d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
 
  MsgBox "8"
End Sub

Private Sub Form_Load()
' On Local Error Resume Next
  Me.Show
  InitD3D
  Running = True
 
  MsgBox "1"
  Do While DoEvents
   
    MsgBox "2"
    d3dDevice.SetRenderTarget NewC, Nothing, 0
   
    MsgBox "3"
    d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1, 0
   
    MsgBox "4"

    Render
    MsgBox "9"
  Loop
  Set MainC = Nothing
  Set NewC = Nothing
  Set TexRT = Nothing
  Set d3dDevice = Nothing
  Set d3d = Nothing
  Set dx = Nothing
End Sub


После запуска exe первый проход действительно не дает ошибки. :?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Mikle » 11.01.2011 (Вт) 9:46

Vovik писал(а):Как можно обмануть эту заразу?

Переходи уже на девятку, эта ошибка скрыта в недрах dx8vb.dll.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Vovik » 22.01.2011 (Сб) 14:30

Mikle писал(а):
Vovik писал(а):Как можно обмануть эту заразу?

Переходи уже на девятку, эта ошибка скрыта в недрах dx8vb.dll.

Докопался я до истины :drunken: . Это не дерект виноват. Просто нужно использовать D3DXRenderToSurface. Если кому интересно могу выложить пример.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Mikle » 22.01.2011 (Сб) 21:48

Vovik писал(а):Это не дерект виноват. Просто нужно использовать D3DXRenderToSurface.

Виноват, естественно, не директ, а его порт, зашитый в dx8vb.dll. Функция D3DXRenderToSurface портирована без ошибок, но это ещё не значит, что более низкоуровневая SetRenderTarget не обязана корректно работать.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Vovik » 23.01.2011 (Вс) 0:18

Mikle писал(а):
Vovik писал(а):Это не дерект виноват. Просто нужно использовать D3DXRenderToSurface.

Виноват, естественно, не директ, а его порт, зашитый в dx8vb.dll. Функция D3DXRenderToSurface портирована без ошибок, но это ещё не значит, что более низкоуровневая SetRenderTarget не обязана корректно работать.
Видишь, только она работает корректно. :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Mikle » 23.01.2011 (Вс) 14:26

Vovik писал(а):Видишь, только она работает корректно.

Да, для тех, кто хочет продолжать использовать DX8 под VB6 - это вариант.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Vovik » 14.02.2011 (Пн) 17:59

Mikle писал(а):
Vovik писал(а):Видишь, только она работает корректно.

Да, для тех, кто хочет продолжать использовать DX8 под VB6 - это вариант.
Хотелось бы DX9 под VB6, но толкового враппера до сих пор нет... :(

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Необычная ошибка при вызове SetRenderTarget в DX8.

Сообщение Mikle » 14.02.2011 (Пн) 18:50

Враппера нет, есть мой порт.


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList