Анализ блоков памяти - 3d программа неожиданно прервалась - PullRequest
2 голосов
/ 11 апреля 2019

Я пытаюсь поместить сетку в виртуальную реальность.

Я пытаюсь использовать эту команду: CreateObjectFromMeshMemblock

Данные, которые я вставляю, - это эти данные:

Byte No  Value
0        3     vertice count (aka first)
1        0     vertice count
2        0     vertice count
3        0     vertice count
4        3     indices count (aka second)
5        0     indices count
6        0     indices count
7        0     indices count
8        2     attr count    (aka third)
9        0     attr count
10       0     attr count
11       0     attr count
12       20    vertex size (aka fourth)
13       0     vertex size (20 because x+y+z + uvx+uvy = 5 * 4bytes = 20)
14       0     vertex size
15       0     vertex size
16       48    vertex-data offset (aka fifth)
17       0     vertex-data offset
18       0     vertex-data offset
19       0     vertex-data offset
20       108   indices-data offset (aka sixth)
21       0     indices-data offset
22       0     indices-data offset
23       0     indices-data offset
-- header success, starting vertex attribute data --
24       0     data type
25       3     cmp count
26       0     normalize flag
27       12    string length
28       112   p
29       111   o
30       115   s
31       105   i
32       116   t
33       105   i
34       111   o
35       110   n
36       0     \0
37       0     \0
38       0     \0
39       0     \0
40       1     data type
41       2     cmp count
42       0     normalize flag
43       4     string length
44       117   u 
45       118   v
46       0     \0
47       0     \0
-- offset vertex data --
48       0
49       0
50       183
51       66

52       0
53       0
54       183
55       66

56       0
57       0
58       183
59       66

60       0
61       0
62       0
63       0

64       0
65       0
66       0
67       0
 -- next vertex --
68       0
69       0
70       183
71       189

72       0
73       0
74       183
75       66

76       0
77       0
78       183
79       66

80       0
81       0
82       0
83       0

84       0
85       0
86       0
87       0
-- next vertex --
88       0
89       0
90       183
91       189

92       0
93       0
94       183
95       189

96       0
97       0
98       183
99       66

100      0
101      0
102      0
103      0

104      0
105      0
106      0 
107      0 
            -- now starting indices --
108      0 first index 
109      0 first index 
110      0 first index
111      0 first index
112      1 second index
113      0 second index
114      0 second index
115      0 second index 
116      2 third index
117      0 third index
118      0 third index
119      0 third index

К сожалению, программа, выполняющая команду с кодом ошибки 1, выполняет команду.

Есть идеи, почему?

1 Ответ

2 голосов
/ 14 апреля 2019

Анализируя ваши данные, кажется, что вы делаете:

SetMemblockInt(memblock,0,3) //3 vertices
SetMemblockInt(memblock,4,3) //3 indices
SetMemblockint(memblock,8,2) //2 attributes, pos+uv
SetMemblockInt(memblock,12,20) // number bytes per vertex
SetMemblockInt(memblock,16,48) // vertex-data offset
SetMemblockInt(memblock,20,108) // indices-data offset

для настройки заголовка, затем:

SetMemBlockInt(memblock,24,0x0C000300) // float, 3 components, no normalizing, position
SetMemblockString(memblock,28,"position")

SetMemBlockInt(memblock,40,0x04000201) // unsigned byte, 2 components, no normalizing, uv
SetMemblockString(memblock,44,"uv")

, чтобы установить информацию об атрибутах и, наконец, сбросить данные вершин / индексов, где вы используете смещения 48, 108. Кажется, смещения всего дампа правильные (если я рецензирую, ничего не пропустил), поэтому я угадаю здесь:

  • Вы используете unsigned byte в качестве типа данных для UV-координат вместо float, может быть, это ошибка?
  • Положение ваших вершин действительно подозрительно, и, возможно, ваш цикл for использует неправильные смещения / места в памяти?

Это просто предположение, и, глядя на дамп памяти, нелегко найти ошибку, может быть, если вы разместите реальный код, я мог бы сделать более правильные предположения

РЕДАКТИРОВАТЬ: Кажется, вы вынуждены использовать правильные типы данных для атрибутов вершин, хороший совет, рассмотрев типы возврата Mesh геттеров, то есть:

float GetMeshMemblockVertexNormalX( memID, vertexIndex )
float GetMeshMemblockVertexNormalY( memID, vertexIndex )
float GetMeshMemblockVertexNormalZ( memID, vertexIndex )

float GetMeshMemblockVertexU( memID, vertexIndex )
float GetMeshMemblockVertexV( memID, vertexIndex )

float GetMeshMemblockVertexX( memID, vertexIndex )
float GetMeshMemblockVertexY( memID, vertexIndex )
float GetMeshMemblockVertexZ( memID, vertexIndex )

integer GetMeshMemblockVertexAlpha( memID, vertexIndex )
integer GetMeshMemblockVertexBlue( memID, vertexIndex )
integer GetMeshMemblockVertexGreen( memID, vertexIndex )
integer GetMeshMemblockVertexRed( memID, vertexIndex )

Кроме того, убедитесь, что вы используете функции Error , чтобы узнать больше о типе ошибок, которые вы получаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...