Я пытаюсь реализовать обратный БПФ в вычислительном шейдере HLSL и не понимаю, как работает новая функция inversebits. Шейдер запускается под Unity3D, но это не должно иметь значения.Как работает функция обратных вызовов HLSL SM5?
Проблема заключается в том, что полученная текстура остается черной, за исключением крайнего левого или двух пикселей в каждой строке. Мне кажется, как будто функция reversebits не вернет правильные индексы.
Мой очень простой код выглядит следующим образом:
#pragma kernel BitReverseHorizontal
Texture2D<float4> inTex;
RWTexture2D<float4> outTex;
uint2 getTextureThreadPosition(uint3 groupID, uint3 threadID) {
\t uint2 pos;
\t
\t pos.x = (groupID.x * 16) + threadID.x;
\t pos.y = (groupID.y * 16) + threadID.y;
\t
\t return pos;
}
[numthreads(16,16,1)]
void BitReverseHorizontal (uint3 threadID : SV_GroupThreadID, uint3 groupID : SV_GroupID)
{
uint2 pos = getTextureThreadPosition(groupID, threadID);
uint xPos = reversebits(pos.x);
uint2 revPos = uint2(xPos, pos.y);
float4 values;
values.x = inTex[pos].x;
values.y = inTex[pos].y;
values.z = inTex[revPos].z;
values.w = 0.0f;
outTex[revPos] = values;
}
Я играл с этим на некоторое время, и обнаружил, что если я заменить строку reversebits с этим один здесь:
uint xPos = reversebits(pos.x << 23);
это работает. Хотя я понятия не имею, почему. Может быть, просто совпадение. Может кто-нибудь, пожалуйста, объясните мне, как я должен правильно использовать функцию reversebits?
Не то, что он отвечает на ваш вопрос, но вы написали функцию, которая вычисляет SV_DispatchThreadID. –