いいね、その方向に行こう。
「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)
返ってくる result256 は 256×256 のガウス平滑済みデータ。
Roblox の Heightmap、テクスチャ生成、Terrain 書き込みなどにそのまま使える。
🟦 もし「バイリニアで拡大したい」「σを変えたい」などあれば
関数の中の
- 最近傍補間部分
- ガウスカーネル生成部分
だけ差し替えれば、すぐにカスタムできるようにしてある。
必要なら、
- バイリニア版
- ガウスの separable(横→縦)高速版
- GPU(ComputeShader)風の高速化ロジック
- Roblox Terrain に直接書き込む例
なども作れるよ。