いいね、その方向に行こう。
「16×16のバッファ → 256×256に拡大してガウス平滑」という関数を、Roblox Lua っぽい形で書いてみるね。

-- 16x16 の buffer を 256x256 に拡大してガウス平滑する
-- buffer[y][x] を想定(1始まり)

local function createGaussianKernel(size, sigma)
    local kernel = {}
    local sum = 0
    local half = math.floor(size / 2)

    for y = -half, half do
        kernel[y] = {}
        for x = -half, half do
            local v = math.exp(-(x * x + y * y) / (2 * sigma * sigma))
            kernel[y][x] = v
            sum = sum + v
        end
    end

    -- 正規化
    for y = -half, half do
        for x = -half, half do
            kernel[y][x] = kernel[y][x] / sum
        end
    end

    return kernel, half
end

local function upsampleAndGaussianSmooth16to256(buffer16)
    local srcSize = 16
    local dstSize = 256
    local scale = dstSize / srcSize

    -- まず 16x16 → 256x256 に最近傍で拡大
    local up = {}
    for y = 1, dstSize do
        up[y] = {}
        local sy = math.floor((y - 1) / scale) + 1
        if sy < 1 then sy = 1 end
        if sy > srcSize then sy = srcSize end

        for x = 1, dstSize do
            local sx = math.floor((x - 1) / scale) + 1
            if sx < 1 then sx = 1 end
            if sx > srcSize then sx = srcSize end

            up[y][x] = buffer16[sy][sx]
        end
    end

    -- ガウスカーネル生成(5x5, sigma=1.0 くらい)
    local kernelSize = 5
    local sigma = 1.0
    local kernel, half = createGaussianKernel(kernelSize, sigma)

    -- ガウス平滑
    local out = {}
    for y = 1, dstSize do
        out[y] = {}
        for x = 1, dstSize do
            local acc = 0
            for ky = -half, half do
                local yy = y + ky
                if yy < 1 then yy = 1 end
                if yy > dstSize then yy = dstSize end

                for kx = -half, half do
                    local xx = x + kx
                    if xx < 1 then xx = 1 end
                    if xx > dstSize then xx = dstSize end

                    acc = acc + up[yy][xx] * kernel[ky][kx]
                end
            end
            out[y][x] = acc
        end
    end

    return out
end
  • 入力:buffer16[y][x](1〜16)
  • 出力:256×256 の 2次元配列(ガウス平滑済み)

もし「最近傍じゃなくて最初からバイリニアで拡大したい」「カーネルサイズやσを変えたい」みたいなチューニングをしたくなったら、そこだけ差し替えていける構造にしてあるよ。

 

 

 

了解。
いまの質問は 「この関数の使い方を教えて」 という意味だね。
では、さっき提示した 16×16 → 256×256 ガウス平滑関数 を、Roblox Lua でどう使うかを分かりやすくまとめるよ。


🟦 使い方(Usage)

1. まず 16×16 のバッファを用意する

local buffer16 = {}
for y = 1, 16 do
    buffer16[y] = {}
    for x = 1, 16 do
        buffer16[y][x] = math.random()  -- 例:ランダム値
    end
end

2. 関数を呼び出す

local result256 = upsampleAndGaussianSmooth16to256(buffer16)

3. result256 は 256×256 の2次元配列になる

print(result256[1][1])      -- 左上の値
print(result256[256][256])  -- 右下の値

🟦 つまり、使い方はこれだけ

local result256 = upsampleAndGaussianSmooth16to256(buffer16)

返ってくる result256256×256 のガウス平滑済みデータ
Roblox の Heightmap、テクスチャ生成、Terrain 書き込みなどにそのまま使える。


🟦 もし「バイリニアで拡大したい」「σを変えたい」などあれば

関数の中の

  • 最近傍補間部分
  • ガウスカーネル生成部分

だけ差し替えれば、すぐにカスタムできるようにしてある。


必要なら、

  • バイリニア版
  • ガウスの separable(横→縦)高速版
  • GPU(ComputeShader)風の高速化ロジック
  • Roblox Terrain に直接書き込む例

なども作れるよ。