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

Индексирование массивов в пиксельном шейдере

#0
11:48, 20 фев. 2018

Я выяснил, что не все массивы одинаково полезны. В dx9 в пиксельном шейдере их нельзя просто так взять и проиндексировать. Они раскладываются компилятором в регистры, которые очень быстро заканчиваются. Я работаю на Unity и поэтому не долго думая пересобрал тестовый проект под dx11 и shader model 4.0
Так вот, в этом режиме в зависимости от видео карты проект может запустится в режиме dx11 или в dx11 level 10 (или что-то типа того, от карты зависит). И если это не dx11, то в пиксельном шейдере возникает та же проблема, что и в dx9.
Вопрос в том, как узнать ТОЧНО, можно ли индексировать или нет? С какой версии API пиксельный может работать с массивами? Гугл не помог, буду рад хотя бы ссылкам на документацию.


#1
12:10, 20 фев. 2018

Если вы имеете в виду что-то типа такого:

Texture2D        g_txMats[]  : register(t1);
uint matIndex;
float3 mat = g_txMats[matIndex].Sample(g_sampler, input.tex).rgb;
То это можно делать только в D3D12 Shader Model 5.1

#2
12:14, 20 фев. 2018

Нет, я про обычный float4[] myArray;

#3
13:11, 20 фев. 2018

Bonus
4.0 ?

#4
13:17, 20 фев. 2018

Ну да, вот из документации Unity:
#pragma target 4.0
DX11 shader model 4.0.
Not supported on DX11 9.x (WinPhone), OpenGL ES 2.0/3.0/3.1, Metal.
Supported on DX11+, OpenGL 3.2+, OpenGL ES 3.1+AEP, Vulkan, PS4/XB1 consoles.
Has geometry shaders and everything that es3.0 target has.

При этом на GeForce 9800GTX+ индексирование не работает, но сам шейдер нормально собирается, просто массив раскладывается в переменные и забивает все регистры.

#5
14:02, 20 фев. 2018

Bonus
> Not supported on DX11 9.x (WinPhone), OpenGL ES 2.0/3.0/3.1, Metal.

о как, metal в пролёте ?

#6
14:19, 20 фев. 2018

Судя по документации Metal у них начинается с #pragma target 4.5
#pragma target 4.5 (or es3.1)
OpenGL ES 3.1 capabilities (DX11 SM5.0 on D3D platforms, just without tessellation shaders).
Not supported on DX11 before SM5.0, OpenGL before 4.3 (i.e. Mac), OpenGL ES 2.0/3.0.
Supported on DX11+ SM5.0, OpenGL 4.3+, OpenGL ES 3.1, Metal, Vulkan, PS4/XB1 consoles.
Has compute shaders, random access texture writes, atomics etc. No geometry or tessellation shaders.

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

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