https://stackoverflow.com/a/14365737/478380

о, так что я все еще пытаюсь заставить это работать. Важными частями моего кода являются:

def __init__(self, vertices, normals, triangles):
    self.bufferVertices = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(vertices), ADT.voidDataPointer(vertices), GL_STATIC_DRAW_ARB)
    self.vertices = vertices
    self.bufferNormals = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(normals), ADT.voidDataPointer(normals), GL_STATIC_DRAW_ARB)
    self.normals = normals
    self.bufferTriangles = glGenBuffersARB(1)

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
    glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)

    self.triangles = triangles
    glDisableClientState(GL_VERTEX_ARRAY) **(Not sure if any of the following influence in any way)** 
    glDisableClientState(GL_NORMAL_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)

Я не думаю, что здесь что-то не так из того, что я читал о VBO. Так что теперь у меня есть буфера вершин, нормалей (еще не использованных) и индексов треугольников. Теперь для фактического розыгрыша:

def draw(self, type):
    glDisableClientState(GL_VERTEX_ARRAY)  
    glDisableClientState(GL_NORMAL_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0)
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)
    **Again above line not sure if they have any use.**        
    glEnableClientState(GL_VERTEX_ARRAY)         
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
    glVertexPointer(3, GL_FLOAT, 0, None)

    glEnableClientState(GL_NORMAL_ARRAY);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
    glNormalPointer(GL_FLOAT, 0, None)

    if type == GL_POINTS:    
        #glDrawArrays( GL_POINTS, 0, len(self.vertices) );    
        glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)
    else:
        #glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)**(If I uncomment this doesnt seem to make any difference?!)**
        #glDrawArrays( GL_TRIANGLES, 0, len(self.triangles) );  
        glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)**(What does it draw now since GL_ELEMENT_ARRAY_BUFFER_ARB is binded to 0 ?!)**

Теперь glDrawArrays работает. Но в случае, когда я должен нарисовать свои треугольники, он не рисует треугольники, которые я определил в bufferTriangles (это нормально из того, что я прочитал, так как drawArrays не использует индексы? Или я здесь не прав?). Проблема в том, что если я пытаюсь использовать glDrawElements, все вылетает с:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000003150ebbc
Crashed Thread:  0

Thread 0 Crashed:
0   com.apple.GeForce8xxxGLDriver   0x1a3e7050 gldGetTextureLevel + 743600
1   com.apple.GeForce8xxxGLDriver   0x1a3e7563 gldGetTextureLevel + 744899
2   GLEngine                        0x1a206eee gleDrawArraysOrElements_VBO_Exec + 1950

Теперь, чего мне здесь не хватает? Из того, что я могу понять, я, вероятно, пропускаю плохой указатель где-то Обратите внимание, что даже если я пытаюсь использовать glDrawElements (type, 24, GL_UNSIGNED_INT, 0), он все равно дает сбой, даже если количество определенных треугольников намного больше, поэтому я не думаю, что это имеет какое-либо отношение к размеру.

С уважением, Богдан

РЕДАКТИРОВАТЬ: Итак, теперь я сделал дополнительную проверку, и вот моя текущая ситуация: я изменил len (треугольники) на ADT.byteCount, решения пока нет. Итак, я проверил все данные, которые я получал, и это выглядит так: массив вершин содержит ~ 60000 * 3 = 180000 записей вершин типа GL_Float, как и массив нормали. Поскольку вершин всего <62535, я использую сокращение без знака для треугольников. Поэтому у меня Лен (треугольники) составляет ~ 135000. Я также изменил glDrawElements (GL_TRIANGLES, len (self.triangles),GL_UNSIGNED_SHORT, 0). Я также проверил, и все данные из массива треугольников находятся в диапазоне от 0 до 62534, так как я подумал, что, может быть, какой-то индекс, выходящий за пределы диапазона, упал через впадину. Что еще может быть не так? Да, и как работает glDrawElements (GL_POINTS, ...)? Также нужны какие-то индексы?

EDIT2 Я обновил код выше и, как там сказано, теперь элементы draw рисуют мой GL_POINTS, но я не уверен, где он получает индексы? Или они не нужны в случае GL_POINTS? А для GL_TRIANGLES это работает следующим образом, с комментируемым glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles), но опять же, какие индексы здесь требуется, чтобы буфер элементов был связан с 0 ?! И еще одна вещь: glDrawElements не будет рисовать все точки, которые делает glDrawArrays. Для лучшего объяснения:

glDrawArrays( GL_POINTS, 0, len(self.vertices) );

Это правильно рисует все мои очки:

glDrawElements(type, len(self.vertices), GL_UNSIGNED_SHORT, 0)

Кажется, это заметно рисует меньше точек, чем glDrawArrays. Теперь забавно то, что если я передам в качестве размера что-то вроде 10 * len (self.vertices) для рисования элементов, то он нарисует все точки (некоторые могут быть дважды или больше; могу ли я это проверить?), Но разве это не приведет к краху?

С уважением

EDIT3

Немного более точной информации о массивах:

вершины - массив поплавков,

len (вершины) = 180000 byteCount (вершины) = 720000

треугольники - массив numpy.uint16

len (треугольники) = 353439 byteCount (треугольники) = 706878 мин (треугольники) = 0 макс (треугольники) = 59999, поэтому они должны указывать на действительные вершины

Рисунок сделан:

glDrawElements (GL_TRIANGLES, len (self.triangles), GL_UNSIGNED_SHORT, 0)

ОБНОВИТЬ

Хорошо, только когда я подумал, я понял, как это должно работать, я попытался пропустить VBO для элементов и пошел просто:

glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

Теперь это не только работает и отлично рисует все мои треугольники, но и FPS лучше. Разве VBO не должно быть быстрее? И что может привести к тому, что вышеприведенный подход сработает, но следующее приведет к сбою:

glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, self.bufferTriangles)
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ADT.arrayByteCount(triangles), ADT.voidDataPointer(triangles), GL_STATIC_DRAW_ARB)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, 0)

Ответы на вопрос(1)

Ваш ответ на вопрос