Ошибка чтения памяти при вызове DrawPrimitive

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Ошибка чтения памяти при вызове DrawPrimitive

Сообщение Alex(S) » 06.11.2006 (Пн) 22:53

Программа на VB6 и с использованием DirectX 8.0.
Сначала в программе происходят некоторые действия, потом вызывается отдельная форма с PictureBox, при инициализации устройсва для директХ происходит создание массива с координатами точек для построения треугольников (массив достаточно большой - от 60000 элементов).
Код для отрисовки этого массива взят из SDK.
В общем возникает ошибка: "...память не может быть read..." на строке:
Код: Выделить всё
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 1000


Подскажите, пожалуйста, в чем может быть проблема.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 07.11.2006 (Вт) 16:30

Alex(S)
Давай весь цикл.... да и почему 1000 треугольников на 60000 вершин? :roll:
#define ROFL 0xDDDD

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 07.11.2006 (Вт) 16:32

Там мог быть неверно проинициализирован VertexBuffer. Левое FVF... Много чего, где может вылезти AccessViolation.
Изображение

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Сообщение Alex(S) » 08.11.2006 (Ср) 0:28

Отрисовываю все в следующей процедуре:
Код: Выделить всё
Private Sub Render()
    Dim v As CUSTOMVERTEX
    Dim sizeOfVertex As Long   
   
    If g_D3DDevice Is Nothing Then Exit Sub

    g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFF&, 1#, 0

    g_D3DDevice.BeginScene
   
    SetupMatrices

    sizeOfVertex = Len(v)
    g_D3DDevice.SetStreamSource 0, g_VB, sizeOfVertex * 60000 
    g_D3DDevice.SetVertexShader D3DFVF_CUSTOMVERTEX
    g_D3DDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 20000

    g_D3DDevice.EndScene

    g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
   
End Sub


Инициализация буфера:
Код: Выделить всё
Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE)

Private Function InitGeometry() As Boolean

    Dim VertexSizeInBytes As Long
   
    VertexSizeInBytes = 24
    Set g_VB = g_D3DDevice.CreateVertexBuffer(VertexSizeInBytes * 60000, _
                     0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT)

    D3DVertexBuffer8SetData g_VB, 0, VertexSizeInBytes * 60000, 0, Vertices(0)
    InitGeometry = True
End Function


Ее вызов происходит вот в такой процедуре:
Код: Выделить всё
Private Sub Command1_Click()
    Dim b As Boolean
   
     DoEvents
   
    b = InitD3D(frm3DMap.pic3D.hWnd)
    If Not b Then
        MsgBox "Unable to CreateDevice (see InitD3D() source for comments)"
        End
    End If
   
'Создание матрицы точек
    If TDGrafics.FillVector(frmMapH.mfgMapH, qwe, 1) = True Then
        Fl = 2
    Else
        Fl = 1
    End If
   
    If Fl = 2 Then
        b = InitGeometry()
        If Not b Then
            MsgBox "Unable to Create VertexBuffer"
          '  End
        End If
    End If
   
   If Fl = 2 Then Render
End Sub


Остальные процедуры для ДиректХ взяты из SDK.

Давай весь цикл.... да и почему 1000 треугольников на 60000 вершин?

Просто тестировал, вдруг какие-нибудь ограничения есть на это.

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 08.11.2006 (Ср) 2:18

"g_D3DDevice.SetStreamSource 0, g_VB, sizeOfVertex * 60000"
Попробуй не умножать на 60000, а просто
"g_D3DDevice.SetStreamSource 0, g_VB, sizeOfVertex"

тогда всё работать должно.
С=[::::::::::> ™ e398wallpapers.narod.ru

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Сообщение Alex(S) » 08.11.2006 (Ср) 11:25

|( () ( T |/| |(
Спасибо за совет, теперь ошибка не возникает, но ничего не отрисовывается. Матрица формируется правильно, это я проверял.
В чем может быть еще проблема?

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 08.11.2006 (Ср) 17:56

VertexSizeInBytes, помойму в твоём случае он равен 16.
"sizeOfVertex = Len(v)" я не понял что за v, но sizeOfVertex тоже должен быть 16.
С=[::::::::::> ™ e398wallpapers.narod.ru

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 08.11.2006 (Ср) 18:39

Alex(S) хм...
1. кто ZBuffer чистить будет и инициализировать?
#define ROFL 0xDDDD

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Сообщение Alex(S) » 09.11.2006 (Чт) 10:48

|( () ( T |/| |( писал(а):VertexSizeInBytes, помойму в твоём случае он равен 16.
"sizeOfVertex = Len(v)" я не понял что за v, но sizeOfVertex тоже должен быть 16.

v - выше по коду определена как переменная типа, который я использую для матрицы (x,y,z,color)

DirectXManiac
Научи как? Я впервый раз под Директ Х что-то пишу.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 09.11.2006 (Чт) 18:16

Alex(S)
После созджания устройства
D3DDevice.SetRenderState D3DRS_ZENABLE, 1
D3DDevice.SetRenderState D3DRS_CULLMODE,D3DCULL_NONE
D3DDevice.SetRenderState D3DRS_LIGHTING, 0
и всместо этой строки
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFF&, 1#, 0
поставь
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET OR D3DCLEAR_ZBUFFER, &HFF&, 1#, 0
и покажи код матриц... камеры,перспективы, мира
#define ROFL 0xDDDD

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Сообщение Alex(S) » 09.11.2006 (Чт) 22:10

DirectXManiac
Вот матрицы:

Код: Выделить всё
Private Sub SetupMatrices()
    Dim matWorld As D3DMATRIX
   ' D3DXMatrixRotationY matWorld, 1 'Timer * 4
    g_D3DDevice.SetTransform D3DTS_WORLD, matWorld

    Dim matView As D3DMATRIX
    D3DXMatrixLookAtLH matView, vec3(3#, 15#, -20#), _
                                vec3(0#, 0#, 0#), _
                                 vec3(0#, 1#, 0#)                                 
    g_D3DDevice.SetTransform D3DTS_VIEW, matView

    Dim matProj As D3DMATRIX
    D3DXMatrixPerspectiveFovLH matProj, g_pi / 3, 1, 1, 1000
    g_D3DDevice.SetTransform D3DTS_PROJECTION, matProj
End Sub

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 09.11.2006 (Чт) 22:33

Alex(S)
Вот в чём собсно и дело! В ZBuffer - у тебя матрица поворота и всё такое а буффера глубины нету! :)
Неплохо было бы посмотреть мои примеры... Тема выше! :)
#define ROFL 0xDDDD

Alex(S)
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 06.11.2006 (Пн) 22:31

Сообщение Alex(S) » 09.11.2006 (Чт) 22:52

DirectXManiac

Спасибо за помощь, добавил все что ты написал.
На вот этой строке:
Код: Выделить всё
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET OR D3DCLEAR_ZBUFFER, &HFF&, 1#, 0

Вылезает ошибка - "Automation error"?!

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 10.11.2006 (Пт) 16:41

Alex(S)
Кинь пример можно в ЛС посмотрю! :)
#define ROFL 0xDDDD


Вернуться в Мультимедиа

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

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

    TopList