Итак, я успешно нарисовал ряд строк, используя два VBOs для вершин и один для индексов. Списки Python являются:Pyopengl - несколько строк, сделанных из VBO, однако индексированный цвет VBO не работает
vertices = [
[0,1],[0,2],[0,3], # Axes 1
[1,4],[1,5],[1,6], # Axes 2
[2,10],[2,11],[2,12] # Axes 3
]
indexes = [
0,4,4,7, # Line 1
1,4,4,8, # Line 2
3,6,6,9 # Line 3
]
Я затем преобразовать их в Numpy массив и Асо в РВО:
vertexarray = np.array(vertices, dtype=np.float32)
indexarray = np.array(indexes, dtype=np.int32)
vertexvbo = glvbo.VBO(vertexarray)
indexvbo = glvbo.VBO(indexarray, target=GL_ELEMENT_ARRAY_BUFFER)
А потом я связываю и сделать эти строки с помощью:
glLineWidth(1)
glColor4f(1,1,1,1)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_BLEND)
glEnableClientState(GL_VERTEX_ARRAY)
vertexvbo.bind()
indexvbo.bind()
glVertexPointer(2, GL_FLOAT, 0, None)
glDrawElements(GL_LINES, len(indexarray), GL_UNSIGNED_INT, None)
glDisableClientState(GL_VERTEX_ARRAY)
glDisable(GL_BLEND)
As на этом рисунке показано (жирные белые линии - это просто оси, которые рисуются с использованием стандартных команд OpenGL):
Теперь проблема возникает, когда я пытаюсь их покрасить. В каждой из 3-х линий состоит из 2 меньших линий, создать цветовой массив размером 3:
colors = []
for i in range(0,3):
r = random.uniform(0.1,1)
g = random.uniform(0.1,1)
b = random.uniform(0.1,1)
color = [r,g,b,0.7]
colors.append(color)
, а затем цветовой индекс массива со следующими значениями:
colorindexes = [
0,0,0,0, # Line 1
1,1,1,1, # Line 2
2,2,2,2 # Line 3
]
Я тогда преобразующие их в Numpy массивов и создавать о:
colorarray = np.array(colors, dtype=np.float32)
colorindexarray = np.array(colorindexes, dtype=np.int32)
colorvbo = glvbo.VBO(colorarray)
colorindexvbo = glvbo.VBO(colorindexarray, target=GL_ELEMENT_ARRAY_BUFFER)
для того, чтобы затем связать и использовать эту VBO добавить следующий код перед строкой glEnableClientState (GL_VERTEX_ARRAY) из предыдущего кода:
glEnableClientState(GL_COLOR_ARRAY)
colorvbo.bind()
colorindexvbo.bind()
glColorPointer(4, GL_FLOAT, 0, None)
Однако линии не окрашивать должным образом, как показано в следующем рисунке, (данные для линий является случайным, так что эти линии не должны пересекаться в тех же точках, что и в предыдущем снимке):
Я полностью смущен вашим использованием слова «индекс цвета» здесь. В некоторых местах ваш код, кажется, использует их в [правильном смысле] (http://web.agelid.com/protect/utile/documentation/OpenGL/OpenGL%204%20-%20Color%20Index%20Mode.htm) (например, альтернативный режим цвета RGB [A]), но в других местах вы используете их как буфер массива элементов (например, индексы для рисования вершин). Можете ли вы точно определить, что вы пытаетесь сделать здесь? Индексы цвета будут установлены с помощью вызова 'glIndexPointer (...)', но я не уверен, что вы действительно используете термин «индекс цвета» правильно. –
Я имею в виду индекс в список цветовых кортежей. Там, где каждая из двух сегментов имеет другой цвет и, следовательно, разные значения цветового индекса. В основном я пытаюсь найти способ, при котором я могу покрасить каждую из строк отдельно, если вы нарисованы из VBO вершин. Помните, что в моем полном коде я рисую миллионы строк ... –
Также почему я не могу использовать функцию 'glColorPointer (...)' здесь [http://www.opengl.org/sdk/docs /man2/xhtml/glColorPointer.xml), я использовал это раньше, когда рисовал линии из неиндексированного VBO? –