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

D3D11: слоты и массивы

Страницы: 1 2 Следующая »
#0
4:01, 3 фев. 2016

В Direct3D11 есть несколько функций, частично похожих по сигнатуре.

IASetVertexBuffers
IASetIndexBuffer
VSSetConstantBuffers
PSSetShaderResources
PSSetSamplers
У всех у них есть параметры "индекс слота" и "указатель на массив". Думаю смысл этих параметров для всех этих функций примерно один и тот же. Хочу разобраться в этом на примере PSSetShaderResources через которую обычно передают текстуры.

Так вот. Например есть две текстуры.

Их можно передать вот так:

deviceContext->PSSetShaderResources(0, 2, textureArray)

или вот так:

deviceContext->PSSetShaderResources(0, 1, &texture)
deviceContext->PSSetShaderResources(1, 1, &reflectionTexture)

Интересно когда использовать первый, а когда второй вариант.

По ограничению понятно только частично. Понятно, что количество слотов ограничено. Тогда размер массива, который передается в третьем параметре в виде указателя чем-то ограничен?


#1
7:42, 3 фев. 2016

Как что использовать ю, зависит от задачи. Можно все вкладывать, затем передать все за 1 вызов.
Очевидно, что размер массива должен быть не больше разницы между числом элементов, переданным вторым параметром и начальным слотом.

#2
7:58, 3 фев. 2016

Digan
> deviceContext->PSSetShaderResources(0, 2, textureArray)
начиная со слота 0 задать 2 ссылки на ресурсы
textureArray - массив, то есть указатель на 0 элемент, поэтому без &.

Digan
> deviceContext->PSSetShaderResources(0, 1, &texture)
начиная со слота 0 задать 1 ссылку на ресурс
texture - переменная(не указатель при объявлении), поэтому &.

Digan
> deviceContext->PSSetShaderResources(1, 1, &reflectionTexture)
начиная со слота 1 задать 1 ссылку на ресурс

Andrey
> Как что использовать, зависит от задачи
+1

#3
9:01, 3 фев. 2016

k119_55524
Спасибо, я все это как бы знаю) Вопрос то в другом был.
Andrey
> Как что использовать ю, зависит от задачи.
Это и есть самое интересное. Для каких задач используется один вариант, а для каких второй? Есть какие-то рекомендации на этот счет? Ну буду я все текстуры передавать массивом через один вызов PSSetShaderResources, слот всегда один будет использоваться. На кой тогда остальные слоты нужны если можно все в виде массива в один передавать?

#4
9:21, 3 фев. 2016

Digan
> Это и есть самое интересное. Для каких задач используется один вариант, а для каких второй? Есть какие-то рекомендации на этот счет?
Вообще лучше стараться передавать пачками за 1 вызов. Это рекомендация по оптимизации.
>слот всегда один будет использоваться. На кой тогда остальные слоты нужны если можно все в виде массива в один передавать?
Ты неправильно понял или вообще не понял, пост 2 читал? там же объяснили. Еще раз,

deviceContext->PSSetShaderResources(0, 2, textureArray)
тут будет использоваться 2 слота, 0-й - слот и 1-й слот. В 0-й слот пойдет textureArray[0], в 1-й textureArray[1]. Вообще читай msdn.
#5
10:00, 3 фев. 2016

Andrey
> Еще раз

Это твоё ключевое слово ? :)

#6
12:59, 3 фев. 2016

Andrey
> тут будет использоваться 2 слота, 0-й - слот и 1-й слот. В 0-й слот пойдет
> textureArray[0], в 1-й textureArray[1].
Я неправильно понял значит пост.
Значит размер массива передаваемого массива ограничен доступным количеством слотов? Я правильно понял?
Если максимальное количество слотов для шейдер ресурсов 128, то получается в одном шейдере можно использовать 128 текстур (вряд ли кто-то столько использует для одного шейдера)? Или я что-то путаю?

Еще поправьте если я что-то не правильно понял. Получается разница в одном или нескольких вызовах PSSetShaderResources только в представлении текстур в шейдере?
Если пишем:

deviceContext->PSSetShaderResources(0, 2, textureArray)
то в шейдере они будут представлены как:
Texture2D textureArray[2];

Если пишем:

deviceContext->PSSetShaderResources(0, 1, &texture)
deviceContext->PSSetShaderResources(1, 1, &reflectionTexture)
то в шейдере их нужно уже описывать как:
Texture2D texture;
Texture2D reflectionTexture;
Это верно?

Andrey
> Вообще читай msdn.
Читал. Видимо мое знание английского не дотягивает, чтобы правильно понять что там написано. Я почему-то думал, что в один слот весь массив ресурсов передается. Поэтому недопонимание вышло.

#7
13:13, 3 фев. 2016

Digan
Если ты пытаешься использовать TextureArray, то ты делаешь это не правильно.

> то в шейдере их нужно уже описывать как:
> Texture2D texture;
> Texture2D reflectionTexture;

А регистры кто выставлять будет?
По сути оба твои способа эквивалентны, только в одном случае ты делаешь это за один вызов, в другом за два.

#8
13:16, 3 фев. 2016

Слоты хранят ссылки на буферы. Буферы могут быть текстурами, сетками, индексами, константами, массивами текстур.

Digan
> deviceContext->PSSetShaderResources(0, 2, textureArray)
инициализируется два слота ссылками на два буфера в памяти

> то в шейдере они будут представлены как:
> Texture2D textureArray[2];
объявляется массив текстур(размером 2), а ссылка на него хранится в 1(одном) слоте.

#9
13:20, 3 фев. 2016

Executor
> А регистры кто выставлять будет?

А они сами по порядку выставляются :)

#10
13:38, 3 фев. 2016

innuendo
> А они сами по порядку выставляются :)

Это задокументировано?

#11
13:44, 3 фев. 2016

Executor
> А регистры кто выставлять будет?
Executor
> Это задокументировано?
http://www.gamedev.ru/code/terms/HLSL

Если не указывать регистр явно, а поручить эту работу компилятору, то данные будут размещены в регистрах по порядку.

Поэтому и не выставляю.
k119_55524
> инициализируется два слота ссылками на два буфера в памяти

> объявляется массив текстур(размером 2), а ссылка на него хранится в 1(одном)
> слоте.
Так тут у меня небольшая путаницы возникла. Если в слотах ссылки на буферы, то при deviceContext->PSSetShaderResources(0, 2, textureArray) в каждом из двух слотов по ссылке на отдельный буфер (текстуру). Так?
Объявляя в шейдере Texture2D textureArray[2] для работы переданными текстурами уже получается что в одном слоте ссылка на обе текстуры. Кое-то не соответствие на мой взгляд.

#12
13:53, 3 фев. 2016

Digan
> Объявляя в шейдере Texture2D textureArray[2] для работы переданными текстурами
> уже получается что в одном слоте ссылка на обе текстуры. Кое-то не соответствие
> на мой взгляд.
Нет. Вообще никогда не используй массивы ресурсов в шейдерах, и тогда таких вопросов не будет.

#13
14:24, 3 фев. 2016

Digan
> Поэтому и не выставляю.

Я думаю эта информация не корректна.

> Объявляя в шейдере Texture2D textureArray[2] для работы переданными текстурами
> уже получается что в одном слоте ссылка на обе текстуры.

Каждый элемент занимает свой слот.
Ты точно не путаешь с Texture2DArray?

#14
14:27, 3 фев. 2016

Digan
> Поэтому и не выставляю.
А потом будешь собирать зубы после того, как компилятор выкинет пару неиспользованных ресурсов...

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

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