2015-09-19 11 views
0

Я не уверен, что мой вопрос достаточно ясен, поэтому объяснения: Я работаю над движком voxel с помощью opengl, он работает нормально, но я хочу немного улучшить его с некоторыми оптимизациями. Я начал использовать VBO для вершин куба, я заработал несколько кадров в секунду, так что это здорово. Но сейчас я хочу сделать то же самое thiong с цветом куба, и я не нашел ответ, пожалуйста, мне, потому что у меня есть особенности, необходимые:Есть ли способ использовать одно значение ввода в Opengl с помощью vbo и не равномерно?

  • Я использую только 3 поплавка для цвета, так что даже если он работает, glVertexAttribPointer() не кажется хорошим способом, потому что, если я его использую, мне нужно использовать 108 float per cube против 3.

  • Я хочу нарисовать МНОГИЕ кубы, поэтому используйте glUniform3f isn «Нехорошо ни потому, что отправить 3 поплавка на кубики было бы очень медленным, чтобы много кубов рисовать.

Так с контекстом мой вопрос, есть ли способ для хранения значений в памяти GPU (как VBO), и когда я рисовать куб я бы сказал лишь шейдера, где находятся эти ценности ?

Спасибо за чтение, и может быть отвечать :)

+0

Вы могли например, сортируйте свои кубы по цвету, а затем используйте форму для цвета/текстуры. – dari

+0

Прежде всего, цвет должен быть 3 байта, а не 3 поплавка, это экономит 75%. Вы можете отсортировать их, но вы также можете выполнить поиск в таблице цветов, что уменьшит ваши данные до количества разных цветов. Например, если вы укажете только 256 цветов, вы можете назначить цвет каждой вершине только на 1 байт, в 3 раза меньше информации, чем сам цвет. Вы также можете нарисовать кубы с инстанцированным рендерингом, а затем предоставить один цвет для каждого экземпляра или, еще лучше, один индекс для цвета для каждого экземпляра. Это все возможные варианты, вопрос: насколько OpenGL вы знаете? Меняются ли цвета? –

+0

Сортировка кубов по цвету - хорошая идея, я об этом не думал, поэтому спасибо :). – Rahotop

ответ

0
glVertexAttribDivisor(attribute, 1) 

говорит OpenGL, что #attribute имеет одно значение примитивным, а не на вершине. Если вы увеличите число от 1 до N, вы можете иметь 1 значение для каждого N примитивов. Полезно для указания цвета (или чего-либо еще) один раз, а не повторения.

Также glDrawArraysInstanced/glDrawElementsInstanced может быть полезным. Оба эти нарисовать множество точек/линии/треугольников N раз, а в вашем шейдере вы можете использовать gl_InstanceID как целое число, которое будет рассчитывать куб/что # 0, # 1, ...

Надеется, что это помогает

+0

Если бы я понял, это может быть лучшим вариантом. Я просто не уверен, как я должен его использовать, я имею в виду, что такое атрибут? и, как и другие функции opengl, я думаю, что я должен привязать объект, но какой? с чем glBind? – Rahotop

+0

OK, если вы не понимаете, что такое атрибут, купите себе копию OpenGL SuperBible и начните читать! Нет смысла пытаться оптимизировать любую программу, если вы не понимаете, как работает базовая система. –

+0

Я прочитал учебник об Opengl 3.3, но это действительно неполно, я имею в виду, что автор объясняет, как начать с Opengl, но это все. Таким образом, даже с базовыми сведениями я знаю, что атрибут является индексом Opengl objet, то, что я не понял, является тем, какой объект я должен отправить здесь в свой индекс? Естественно, я бы сказал, что мне нужно отправить индекс vbo цвета, но я не уверен в этом, так ли это правильно? – Rahotop

 Смежные вопросы

  • Нет связанных вопросов^_^