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

Как передать в шейдер данные в формате float 16 ?

Страницы: 1 2 Следующая »
#0
(Правка: 4:07) 2:19, 6 авг. 2019

У меня общий размер передаваемых в шейдер данных слегка превысил 64 float'а и как следствие перестала работать прямая загрузка в корневую запись (по SetGraphicsRoot32BitConstants).
Очень не хочу геморроя с разными константными буферами (их придется делать по числу проходов на каждую модель), потому решил слека сжать данные и опять уместиться в 256 бит. Самый простой путь - перейти на HALF там где это некритично. У меня есть пара float4 векторов, я их поменял на half4 и на GPU все ОК (в смысле собирается и выполняется). Осталось понять, как мне запаковать XMFLOAT4 в этот half4. Ну или хоть поэлементно. Попробовал библиотеку HALF но там явно что-то не то. По крайней мере на GPU приходит мусор.

Кто нибудь делал передачу half'ов в шейдер?


#1
2:26, 6 авг. 2019

Эту пробовал:
https://github.com/acgessler/half_float
?

#2
3:09, 6 авг. 2019

Не, эту пока не пробовал. Но я боюсь что там тоже доморощенный формат несовместимый с half который в шейдере. Странно, что нет (или я не нашел)  какой нибудь стандартной микрософтовской реализации. Что бы не заниматься самодеятельностью.

#3
3:12, 6 авг. 2019

san
> Но я боюсь что там тоже доморощенный формат несовместимый с half который в
> шейдере.
Там же описание:

C++ implementation of a 16 bit floating-point type mimicking most of the IEEE 754 behaviour. Compatible with the half data type used as texture format by OpenGl/Direct3D.
#4
3:20, 6 авг. 2019

Ты посмотри дату последнего обновления - 8 лет назад. В шейдерах халфы появились намного позднее. Та библиотека, что я использовал, этого года. Но формат оказался несовместим с HLSL. Почему - не знаю, возможно надо что-то делать с выравниваем при передаче, там бывают фокусы. Или знак не на том месте, или еще что. Мне бы кого-то кто уже с этим сталкивался... Практически.

#5
3:39, 6 авг. 2019

san
> В шейдерах халфы появились намного позднее.
В шейдерах может и появились позже, а вот текстуры на халф флоатах были со времен DX9. И заливать их со стороны CPU (и забирать обратно на CPU) порой так же была необходимость.

#6
(Правка: 4:01) 3:48, 6 авг. 2019

Текстура это другой случай. Текстура байты хранит, ты попробуй байт через constant buffer отправить. Так что вся сложность в передаче данных через константный буфер. Там даже при float2 есть проблемы (GPU предпочитает принимать 32 бита, часто приходится извращаться).
Короче давай не будем теоретизировать. Мне нужно узнать мнение (совет) человека, который реально делал передачу half'ов в шейдер. Сам. Если таких нет, значит я буду первым. Потрачу время, потом сообщу о результатах.

#7
5:14, 6 авг. 2019

Может быть,

cbuffer cb : register(b0)
{
  min16float4 Data;
}

#8
6:13, 6 авг. 2019

прозреваю, что проблема не с конвертацией флотов, а с выравниванием и padding'ом.

#9
6:44, 6 авг. 2019

prowkan
> min16float4
не надо чекать D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT ?

ведь апи должно скрывать реализацию ?

#10
6:52, 6 авг. 2019

prowkan
> min16float4 Data;
Проблема не в том как принять в шейдере (half4 тоже работает), а в том как правильно запаковать и отправить на стороне GPU.

Suslik
>прозреваю, что проблема не с конвертацией флотов, а с выравниванием и padding'ом.
Это очень даже может быть. Но когда есть две степени свободы, то трудно понять где собственно гнется.

#11
8:53, 6 авг. 2019

san
> В шейдерах халфы появились намного позднее.
откуда дровишки?

#12
9:26, 6 авг. 2019

https://github.com/DentonW/DevIL/blob/master/DevIL/src-IL/src/il_manip.cpp

#13
(Правка: 10:20) 10:12, 6 авг. 2019
kas

раз в месяц тебе становиться скучно и заходишь на эту "помойку" как сказал великий шодан ?

> откуда дровишки?

вот ты и расскажи, как было сделано в bm, на том самом asm с суффиксами _half
зачем такое на старых ати мне было в упор непонятно :)

#14
12:59, 6 авг. 2019

https://github.com/opencv/opencv/tree/master/3rdparty/openexr/Half

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