Я пытаюсь визуализировать несколько моделей, загруженных из файлов OBJ, с помощью одного VBO с использованием VAO. Помимо VBO у меня есть еще два буфера — CBO (цвета) и IBO (индексы).
Все модели, которые я загружаю в код ниже, представляют собой простые кубы (8 вершин, 12 примитивных граней) с некоторыми изменениями в масштабировании, вращении и перемещении, чтобы я мог визуализировать различия.< /p>
Объем памяти для каждого типа буфера следующий:
VBO — 1000 вершины, каждая из которых состоит из 3 компонентов float32 (т. е. 3*4 = 12 байт на вершину)
CBO – 1000 цветов, каждый из которых состоит из 4 компоненты float32 (RGBA, поэтому 4*4 = 16 байт на цвет)
IBO — 1000 граней, каждая из которых состоит из 3 компонентов uint32 (так что 3*4 = 12 байт на примитивную грань)
Изначально я выделил полный размер и сразу использую glBufferSubData() загрузить мою статическую модель. В отличие от динамической, статическую модель я не буду менять до завершения программы. Я перебираю динамическую модель. Каждая динамическая модель в настоящее время имеет тот же размер в байтах (включая количество вершин, цветов и граней), что и статическая.
Каждый раз, когда пользователь нажимает определенную клавишу, я увеличиваю индекс, который выбирает следующую динамическую модель (все загружается с помощью PyWavefront).
Когда я запускаю свой код, я получаю
в качестве исходного вида. Однако при нажатии клавиши отображается, что я переключаю динамические модели (
), я не могу отобразить какие-либо визуальные изменения на экране. Я ожидаю увидеть
а затем
рядом с первоначально отрендеренной моделью. Изображение ниже должно показать, как я представляю (отчасти) мой окончательный рендер для одной из динамических моделей:
[img]https: //i.sstatic.net/6ZMnqZBM.png[/img]
Я пытаюсь визуализировать несколько моделей, загруженных из файлов OBJ, с помощью одного VBO с использованием VAO. Помимо VBO у меня есть еще два буфера — CBO (цвета) и IBO (индексы). [code]import pygame from pathlib import Path from pygame.locals import * from OpenGL.GL import * from OpenGL.GL import shaders import numpy as np import pywavefront from math import sin, cos, tan, atan2
def initialize(): global model_static global vbo, cbo, ibo, vao global program global modelToCameraMatrixUnif, cameraToClipMatrixUnif, cameraToClipMatrix
# Note that this and the transformation matrix below are both # ROW-MAJOR ordered. Thus, it is necessary to pass a transpose # of the matrix to the glUniform assignment function. cameraToClipMatrix[0][0] = fFrustumScale cameraToClipMatrix[1][1] = fFrustumScale cameraToClipMatrix[2][2] = (fzFar + fzNear) / (fzNear - fzFar) cameraToClipMatrix[2][3] = -1.0 cameraToClipMatrix[3][2] = (2 * fzFar * fzNear) / (fzNear - fzFar)
while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() quit()
if event.type == pygame.KEYUP: if event.key == pygame.K_u: idx = (idx + 1) % 2 print(idx)
if idx != idx_prev: print('Switching dynamic content ({})'.format(idx))
update_vbo(idx) update_cbo(idx) update_ibo(idx)
idx_prev = idx
render()
frame_count += 1
if __name__ == '__main__': main() [/code] Все модели, которые я загружаю в код ниже, представляют собой простые кубы (8 вершин, 12 примитивных граней) с некоторыми изменениями в масштабировании, вращении и перемещении, чтобы я мог визуализировать различия.< /p> Объем памяти для каждого типа буфера следующий: [list] [*][b]VBO[/b] — 1000 вершины, каждая из которых состоит из 3 компонентов float32 (т. е. 3*4 = 12 байт на вершину) [*][b]CBO[/b] – 1000 цветов, каждый из которых состоит из 4 компоненты float32 (RGBA, поэтому 4*4 = 16 байт на цвет) [*][b]IBO[/b] — 1000 граней, каждая из которых состоит из 3 компонентов uint32 (так что 3*4 = 12 байт на примитивную грань) [/list] Изначально я выделил полный размер и сразу использую glBufferSubData() загрузить мою статическую модель. В отличие от [b]динамической[/b], [b]статическую[/b] модель я не буду менять до завершения программы. Я перебираю [b]динамическую[/b] модель. Каждая динамическая модель в настоящее время имеет тот же размер в байтах (включая количество вершин, цветов и граней), что и статическая. Каждый раз, когда пользователь нажимает определенную клавишу, я увеличиваю индекс, который выбирает следующую динамическую модель (все загружается с помощью PyWavefront). Когда я запускаю свой код, я получаю [img]https://i.sstatic.net/xFbd0mui.png[/img]
в качестве исходного вида. Однако при нажатии клавиши отображается, что я переключаю динамические модели ([code]print()[/code]), я не могу отобразить какие-либо визуальные изменения на экране. Я ожидаю увидеть [img]https://i.sstatic.net/v8GITego.png[/img]
а затем [img]https://i.sstatic.net/JSXkHP2C.png[/img]
рядом с первоначально отрендеренной моделью. Изображение ниже должно показать, как я представляю (отчасти) мой окончательный рендер для одной из динамических моделей: [img]https: //i.sstatic.net/6ZMnqZBM.png[/img]
Я пишу программу, используя Qt5 и OpenGL. Это интерактивная 3D-среда, которая позволяет пользователю в любой момент импортировать несколько триангулированных сеток (помимо прочего). Изначально я использовал конвейер с фиксированными функциями, но...
Я пишу программу, используя Qt5 и OpenGL. Это интерактивная 3D-среда, которая позволяет пользователю в любой момент импортировать несколько триангулированных сеток (помимо прочего). Изначально я использовал конвейер с фиксированными функциями, но...
Недавно я изучил концепцию шейдера, объекта массива вершин (VAO) и объекта буфера вершин (VBO). При реализации этих концепций в простой игре я столкнулся с проблемой, из-за которой игра вылетала, ничего не отображая.
Каждый прототип объекта имеет...
Я пытаюсь провести рефакторинг простой программы, которая рисует треугольник, используя координаты вершин и цвета вершин, помещенные в два отдельных буфера, чтобы использовать один буфер и два вызова glBufferSubData.
Я уже некоторое время пытаюсь заставить объект массива отображаться в окне. Похоже, функции GLEW не работают. Результатом должен быть треугольник, отображаемый в окне вывода. Возможно, функции устарели или какая-то функция отсутствует.