Образцы текстур из массива в ячейки Вороного - PullRequest
0 голосов
/ 10 ноября 2019

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

1 Ответ

0 голосов
/ 13 ноября 2019

Наиболее распространенная оптимизация для генерации шума Вороного состоит в том, чтобы разделить текстуру на сетку с 1 точкой в ​​каждой ячейке, найти ячейку сетки текущего фрагмента, а затем сравнить только расстояние с этой ячейкой и ее 8 соседями. В общем, вы должны иметь возможность хранить свои точки в двумерном массиве, а затем находить индекс ячейки, разделяя и наполняя UV, используя размер ячейки. Себастьян Лаге коснулся этого в своем видео о рендеринге в облаке, вы можете проверить это здесь , он также сделал исходный код доступным на GitHub.

...