Войти
ПрограммированиеФорумГрафика

OpenGL. Запуск конвейера без буфера вершин. Поиск аналога clEnqueueNDRangeKernel.

Страницы: 1 2 Следующая »
#0
9:43, 23 июня 2017

В общем, хочу визуализировать воксели из 3D текстуры для отладки. Смотрю, как это делают другие и как - то это не комельфо.
Вот смотрите, если у меня 3D текстура с данными, по сути 3D массив, допустим размера 3dsize = dim * dim * dim. Я хочу запустить конвейер на 3dsize потоках, ну то есть, как будто у меня 3dsize индексов для отрисовки через draw call.
Мне не нужны вершины, на входе мне нужно просто 3D текстура, а геометрию кубиков для визуализации вокселей я сгенерю в геом шейдере. В общем, можно ли как - то так запустить без массива вершин на входе и что бы при этом я бы мог получить в вертексном шейдере 3D id точки внутри текстуры?


#1
11:39, 23 июня 2017

А не проще на каждый воксель по одной вершине(точке) использовать?

#2
11:47, 23 июня 2017

Без вершин вообще не получится. Можно генрироовати вершины внутри вершинного шейдера (например через gl_VertexID).
Генерировать кучу геометрии через геометрический шейдер не стоит (скорее всего и не получится) - он не для того создан.
Так что можно через instanced вывести геометрию без вершинного буфера генерируя все вершины в вершинном шейдере

#3
12:14, 23 июня 2017

stratego
> А не проще на каждый воксель по одной вершине(точке) использовать?
ну смотри, у меня и так есть огромная 3D текстура, допустим она занимает 2 гигабайта видео памяти. Если я вдобавок к этому ещё буду делать и VBO такого же размера в памяти, это будет полнейший оверхэд, да и нет у меня столько памяти на моём текущем железе :-)
steps3d
> Можно генрироовати вершины внутри вершинного шейдера (например через
> gl_VertexID).
Хмм, погоди, мне же нужно сперва как - то запустить конвейер рендера, ну допустим, через glDrawArrays, а для того, что бы его запустить, мне же как минимум нужно забиндить VBO...  Или ты предлагаешь как - то сделать VBO с одной вершиной для заглушки и запустить glDrawArrays, указав ему, что мол у меня там миллионы вершин... Хз, так же вроде не сработает ...

#4
12:22, 23 июня 2017

-=MASTER=-
> Мне не нужны вершины, на входе мне нужно просто 3D текстура, а геометрию
> кубиков для визуализации вокселей я сгенерю в геом шейдере.
В принципе так делают, только в место текстуры передают тот же набор в виде массива одномерной вершины SxSxS. Но это для привычного шейдера. Еще есть вариант пропустить то же моделирование через compute shader. Результат все равно будет в видео памяти и обратного копирования не будет. По крайней мере я на них теперь перешел и не заморачиваюсь, производительность та же.

#5
12:28, 23 июня 2017

Брр... стоп. Сколько раз "дёргаются" шейдеры во время одного draw call-а?
1. vertex shader - столько раз, сколько я указал последним параметров в glDrawArrays и лучше бы, что бы это число совпадало с кол-вом вершин (индексов) в VBO, так?
2. geom shader - столько раз, сколько примитивов
3. fragment - столько раз, сколько ты указал пикселей в glViewport

всё верно?

#6
12:30, 23 июня 2017

-=MASTER=-
> 3. fragment - столько раз, сколько ты указал пикселей в glViewport
Ну нее. На каждый пиксель который покрывает геометрия.

#7
12:32, 23 июня 2017

foxes
> Ну нее. На каждый пиксель который покрывает геометрия.
Ну да, всё рено. А кто определяет кол-во этих пикселей, которые покрываю геометрию? Растеризатор?

+ Показать
#8
12:36, 23 июня 2017

-=MASTER=-
> Растеризатор?
Видимо да. Отдельный треугольник/линия/точка не покрывают весь экран, это частный случай.

#9
12:37, 23 июня 2017

Фикус в том, что я не могу указать в glDrawArrays число вертексов, большее чем в забиндином VBO, точнее могу указать не намного больше, но этому уже чисто баги и звиги памяти, укажешь значительно больше - crash.

#10
12:38, 23 июня 2017

-=MASTER=-
> Фикус в том, что я не могу указать в glDrawArrays число вертексов, большее чем
> в забиндином VBO
Не понял проблемы? У тебя есть сегмент - чанк 16x16x16 = 4096 вокселей/вершин. По номеру gl_VertexID считаешь положение вокселя, а из вершины берешь цвет/текстуру - все это в вершинном шейдере.

#11
12:44, 23 июня 2017

foxes
> Не понял проблемы? У тебя есть сегмент - чанк 16x16x16 = 4096 вокселей/вершин.
В общем, мне нужно как то забиндить 3D текстуру вместо VBO, то есть что бы на вход vertex shader-а шла 3D текстура, а не VBO, ну точнее, её то туда передать в виде юниформа - не проблема, проблема в запуске glDrawArrays без дополнительного VBO. Ну то есть у меня есть 3D текстура вида

f->glGenTextures(1, &textureID);
f->glBindTexture(GL_TEXTURE_3D, textureID);

у неё размер допустим 16х16х16.  Как мне запустить rander pipeline без дополнительного VBO, что бы вертексный шейдер вызвался ровно  16x16x16 = 4096 раз?
В шейдере я бы уже сам определил бы 3D id...

#12
12:46, 23 июня 2017

glDrawArrays(GL_POINTS, 0, 4096)

#13
12:54, 23 июня 2017

foxes
> glDrawArrays(GL_POINTS, 0, 4096)
нде...вот я вленок )) я походу какую - то глупость вообще спросил, ща потещу кое чего...

#14
12:56, 23 июня 2017

так GL_POINTS же деприкатед вроде, не?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.