https://ibb.co/82WMNCt
Я написал фрагментный шейдер, который выбирает разные текстуры для каждой ячейки вороной. Прямо сейчас я перебираю все позиции для каждого пикселя, что супер неэффективно.
Любые советы о том, как оптимизировать это? Мне нужно запустить 2 x 1080p с 1000 "ячеек" - это мой максимальный процессор для box2d.
Может быть, нарисовать ячейки внутри вершинного шейдера, а затем сэмплировать их? Я новичок в этом, любые советы приветствуются!
странные размеры (* 20 и т.д.) из-за моего большого мира box2d для тестирования.
ура, A
Texture2DArray texArray <string uiname="Texture Array";>;
Texture2D tex <string uiname="Texture";>;
int id;
int scale= 20;
float4x4 tWVP: WORLDVIEWPROJECTION;
SamplerState linearSampler : IMMUTABLE
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
cbuffer cbPerDraw : register( b0 )
{
float4x4 tVP : LAYERVIEWPROJECTION;
};
cbuffer cbPerObj : register( b1 )
{
float4x4 tW : WORLD;
};
StructuredBuffer<float2> posBuffer;
StructuredBuffer<int> idBuffer;
struct vsInput
{
float4 PosO : POSITION;
float4 TexCd : TEXCOORD0;
};
struct psInput
{
float4 PosWVP: SV_Position;
float4 TexCd: TEXCOORD0;
};
psInput VS(vsInput In)
{
return In;
}
float4 PS(psInput In): SV_Target
{
uint count, stride;
posBuffer.GetDimensions(count, stride);
float minDist = 100;
float2 uvRaw = In.TexCd.xy;
float2 uv = ( uvRaw -.5) * 20;
float4 col = 1;
uint id;
for (uint i=0; i<count; i++)
{
id = idBuffer[i];
float2 p = posBuffer[i]*1;
float d = length(uv-p) * .2;
if (d < minDist)
{
minDist = d;
col = texArray.SampleLevel(linearSampler, float3(uvRaw - p *0.05, i), 0);
}
}
return col;
}
technique10 Constant
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetPixelShader( CompileShader( ps_5_0, PS() ) );
}
}
[1]: https://ibb.co/82WMNCt