HLSL Stream Out Записи не работают правильно - PullRequest
0 голосов
/ 30 мая 2018

Я хочу внедрить систему частиц на основе структуры потока для моего более крупного проекта.Я видел несколько статей об этом методе и строю одну частицу.Это работает почти правильно, но в геометрическом шейдере с потоком я не могу получить значение InitVel.z и age, потому что оно всегда равно 0. Если я изменяю порядок возраста (например, age перед позицией), он отлично работает для возраста, но для 6-го числа с плавающей точкойордер по-прежнему равен 0. Похоже, он выдвинул только 5 первых позиций.Я понятия не имел, что я делаю не так, потому что я пытаюсь изменить почти все (создать макет ввода для вершины, то же самое, что и объявление SO entry, изменить количество шагов для статического 28, изменить его на 32, но в этом случае он рисует хаотично, поэтому размеруспехи наверное хорошие).Я думаю, что это проблема с пределами NumEntry в объявлении Entry, но на сайте msdn я видел ограничение для directx D3D11_SO_STREAM_COUNT (4) * D3D11_SO_OUTPUT_COMPONENT_COUNT (128) не 5. Пожалуйста, вы можете посмотреть в этом коде и дать мне путь или надежду наосуществить это правильно ??Спасибо за помощьс так: например, Age + = Время из константного буфера. В геометрическом шейдере это хорошо один раз, но в рисовании шейдера это 0 и в следующий раз, если он читает в геометрии с таким же, это тоже 0.

Вершинный шейдер дляdraw

struct VertexOut
{
float3 Pos          : POSITION;
float4 Colour       : COLOR;
//uint Type         : TYPE;
};
struct Particle
{
float3 InitPos : POSITION;
float3 InitVel : VELOCITY;
float Age : AGE;
//  uint Type       : TYPE;
};

VertexOut main(Particle vin)
{
VertexOut vout;
float3 gAccelW = float3(0.0f, -0.98f, 0.0f);
float t = vin.Age;
//float b = Time/10000;
// constant Acceleration equation
vout.Pos = vin.InitVel+ (0.7f * gAccelW)*Time/100;
//vout.Pos.x = t;                           
vout.Colour = float4(1.0f, 0.0f, 0.0f, 1.0f);
//vout.Age = vout.Pos.y;
//vout.Type =  vin.Type;

return vout;
}

Геометрический шейдер для преобразования точки в линию

struct VertexOut
{
float3 Pos          : POSITION;
float4 Colour       : COLOR;
//uint Type         : TYPE;
};

struct GSOutput
{
float4 Pos      : SV_POSITION;
float4 Colour   : COLOR;
//float2 Tex        : TEXCOORD;
};

[maxvertexcount(2)]
void main(
point VertexOut gin[1],
inout LineStream< GSOutput > Output
)
{
float3 gAccelW = float3(0.0f, -0.98f, 0.0f);

//if (gin[0].Type != PT_EMITTER)
{   
float4 v[2];
v[0] = float4(gin[0].Pos, 1.0f);
v[1] = float4((gin[0].Pos + gAccelW), 1.0f);
GSOutput gout;
[unroll]
for (int i = 0; i < 2; ++i)
{
gout.Pos = mul(v[i], WVP);// mul(v[i], gViewProj);
gout.Colour = gin[0].Colour;
Output.Append(gout);
}
}
}

И пиксельный шейдер

struct GSOutput
{
float4 Pos      : SV_POSITION;
float4 Colour   : COLOR;
};

float4 main(GSOutput pin) : SV_TARGET
{
return pin.Colour;
}
...