If you have ever used the default Noise node in Nuke for skies, domes, environment maps, or full frame textures, you already know the issue. The noise looks fine in the middle, but as soon as it wraps horizontally, you get a sharp visible seam. That seam instantly breaks realism, especially in lat-long or spherical projections.
This happens because standard 2D noise does not understand wrapping. The left edge and the right edge of the image have no relationship to each other. They are just different samples, so when the texture loops, the discontinuity becomes obvious.

Now imagine using that noise for sky replacements, atmospheric passes, volumetric projections, or even procedural textures driving other effects. The seam becomes impossible to hide.
So what is the solution.
Instead of treating the image as a flat rectangle, this BlinkScript treats the image as a sphere.
Every pixel is converted from UV space into latitude and longitude. From there, we compute a 3D direction vector on a sphere. That direction is what we sample the noise with.
Because we are sampling noise in 3D space on a sphere, the left edge and the right edge naturally meet. There is no jump. No seam. The noise wraps perfectly.
That is the core idea behind this BlinkScript.
Let me break it down in simple terms.
First, we normalize pixel coordinates into UVs.
Then UVs are converted into longitude and latitude.
Longitude runs from minus pi to plus pi.
Latitude runs from minus pi over two to plus pi over two.

From those angles, we generate a direction vector using sine and cosine. This gives us a point on a unit sphere.
That sphere direction becomes the input to an FBM noise function. Since the noise is sampled in continuous 3D space, it is inherently seamless when projected back into a lat-long image.
On top of that, this script adds a full FBM stack. You get octaves, lacunarity, gain, and time-based animation. There is also an extra high frequency detail layer that adds richness without introducing seams.
Color handling is flexible too. You can run it as a single grayscale noise tinted by a color, or as decorrelated RGB noise where each channel has its own variation without visible breakup.
The script also exposes image width and height explicitly. This avoids relying on internal resolution calls and keeps the math stable, especially when used in different contexts or proxy modes.
Finally, saturation and gamma controls let you shape the output directly, so the noise is usable as a final texture, not just a utility pass.
The result is simple but powerful.

A fully procedural, animated, seam-free noise that is perfect for skies, domes, spherical projections, volumetric looks, and any situation where standard noise nodes fall apart.
If you have ever fought noise seams in Nuke, this approach completely changes the game.
In the next step, you can plug this into sky replacements, drive atmospheric depth, or even use it as a base for cloud and nebula tools.
set cut_paste_input [stack 0]
version 16.0 v1
Group {
inputs 0
name Seamless_noise
help "for more tools visit\nwww.topicroomsvfx.com"
selected true
xpos -808
ypos -358
addUserKnob {20 User l Seamless_noise}
addUserKnob {41 Resolution T NoOp1.Resolution}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Time l Animate T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Time}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Gain l Gain T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Gain}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Gamma l Gamma T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Gamma}
addUserKnob {41 "FBMNoise_LatLongSeamless_Fixed_v2_Noise Scale" l "Noise Scale" T "BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Noise Scale"}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Amplitude l Amplitude T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Amplitude}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Octaves l Octaves T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Octaves}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Lacunarity l Lacunarity T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Lacunarity}
addUserKnob {41 "FBMNoise_LatLongSeamless_Fixed_v2_Detail Amount" l "Detail Amount" T "BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Detail Amount"}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_SingleColor l SingleColor T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_SingleColor}
addUserKnob {41 FBMNoise_LatLongSeamless_Fixed_v2_Seed l Seed T BlinkScript1.FBMNoise_LatLongSeamless_Fixed_v2_Seed}
}
BlinkScript {
inputs 0
recompileCount 10
ProgramGroup 1
KernelDescription "3 \"FBMNoise_LatLongSeamless_Fixed_v2\" iterate componentWise 513ae9cfaa4e5119e9165293d75a10d317f5559e87b90d5e71963f72697328e3 1 \"dst\" Write Point 15 \"Color\" Float 3 ZmZmP2ZmZj9mZmY/AAAAAA== \"SingleColor\" Int 1 AAAAAA== \"Noise Scale\" Float 1 AACAPw== \"Octaves\" Int 1 BQAAAA== \"Lacunarity\" Float 1 AAAAQA== \"Gain\" Float 1 AAAAPw== \"Detail Amount\" Float 1 mpkZPw== \"Time\" Float 1 AAAAAA== \"Amplitude\" Float 1 AACAPw== \"Gamma\" Float 1 AACAPw== \"Saturation\" Float 1 AACAPw== \"Seed\" Int 1 OQUAAA== \"Components\" Int 1 AwAAAA== \"Image Width\" Float 1 AACgRA== \"Image Height\" Float 1 AAA0RA== 15 \"color\" 3 1 Default \"singleColor\" 1 1 Default \"noiseScale\" 1 1 Default \"octaves\" 1 1 Default \"lacunarity\" 1 1 Default \"gain\" 1 1 Default \"detailAmount\" 1 1 Default \"time\" 1 1 Default \"amplitude\" 1 1 Default \"gamma\" 1 1 Default \"saturation\" 1 1 Default \"seed\" 1 1 Default \"maxComps\" 1 1 Default \"imageWidth\" 1 1 Default \"imageHeight\" 1 1 Default 0"
kernelSource "/// FBMNoise_LatLongSeamless_Fixed_v2 : lat-long sampling, seam-free on sphere, with image size params\nkernel FBMNoise_LatLongSeamless_Fixed_v2 : ImageComputationKernel<eComponentWise>\n\{\n Image<eWrite, eAccessPoint> dst;\n\n param:\n float3 color; // tint when singleColor is true\n int singleColor; // 0 = RGB decorrelated, 1 = single scalar * color\n float noiseScale; // radius multiplier for sampling on sphere (controls feature size)\n int octaves; // base fbm octaves\n float lacunarity; // freq multiplier\n float gain; // amp multiplier\n float detailAmount; // extra high-frequency detail (0..1)\n float time; // animate noise\n float amplitude; // final amplitude multiplier\n float gamma; // >0\n float saturation; // 0..inf\n int seed; // random seed\n int maxComps; // usually 3\n float imageWidth; // explicit image width\n float imageHeight; // explicit image height\n\n local:\n void define()\n \{\n defineParam(color, \"Color\", float3(0.9f,0.9f,0.9f));\n defineParam(singleColor, \"SingleColor\", 0);\n defineParam(noiseScale, \"Noise Scale\", 1.0f);\n defineParam(octaves, \"Octaves\", 5);\n defineParam(lacunarity, \"Lacunarity\", 2.0f);\n defineParam(gain, \"Gain\", 0.5f);\n defineParam(detailAmount,\"Detail Amount\",0.6f);\n defineParam(time, \"Time\", 0.0f);\n defineParam(amplitude, \"Amplitude\", 1.0f);\n defineParam(gamma, \"Gamma\", 1.0f);\n defineParam(saturation, \"Saturation\", 1.0f);\n defineParam(seed, \"Seed\", 1337);\n defineParam(maxComps, \"Components\", 3);\n defineParam(imageWidth, \"Image Width\", 1280.0f);\n defineParam(imageHeight, \"Image Height\", 720.0f);\n \}\n\n void init() \{ \}\n\n void process(int3 pos)\n \{\n if (pos.z >= maxComps) \{ dst() = 0.0f; return; \}\n\n float px = float(pos.x);\n float py = float(pos.y);\n\n float width = imageWidth;\n float height = imageHeight;\n if (width <= 0.0f) width = 1.0f;\n if (height <= 0.0f) height = 1.0f;\n\n float u = px / width;\n float v = py / height;\n\n // use literals to avoid an extra PI variable\n float lon = u * 6.283185307179586f - 3.141592653589793f; // u * 2PI - PI\n float lat = v * 3.141592653589793f - 1.5707963267948966f; // v * PI - PI/2\n\n float clat = cos(lat);\n float dirx = clat * cos(lon);\n float diry = sin(lat);\n float dirz = clat * sin(lon);\n\n float sx_base = dirx * noiseScale;\n float sy_base = diry * noiseScale;\n float sz_base = dirz * noiseScale;\n\n float channelOffsetZ = 0.0f;\n if (singleColor == 0) \{\n if (pos.z == 0) channelOffsetZ = 0.0f;\n else if (pos.z == 1) channelOffsetZ = 10.0f;\n else if (pos.z == 2) channelOffsetZ = 20.0f;\n else channelOffsetZ = float(pos.z) * 7.0f;\n \} else \{\n channelOffsetZ = 0.0f;\n \}\n\n float Kx = 127.1f;\n float Ky = 311.7f;\n float Kz = 74.7f;\n float C = 43758.5453123f;\n\n float sum = 0.0f;\n float amp = 1.0f;\n float freq = 1.0f;\n\n for (int o = 0; o < octaves; ++o)\n \{\n float sx = sx_base * freq;\n float sy = sy_base * freq;\n float sz = sz_base * freq + time + channelOffsetZ + float(o) * 17.0f;\n\n float ix = floor(sx);\n float iy = floor(sy);\n float iz = floor(sz);\n\n float fx = sx - ix;\n float fy = sy - iy;\n float fz = sz - iz;\n\n float wx = fx * fx * (3.0f - 2.0f * fx);\n float wy = fy * fy * (3.0f - 2.0f * fy);\n float wz = fz * fz * (3.0f - 2.0f * fz);\n\n float n;\n float s;\n n = (ix + 0.0f) * Kx + (iy + 0.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v000 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 0.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v100 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 1.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v010 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 1.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v110 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 0.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v001 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 0.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v101 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 1.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v011 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 1.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v111 = s - floor(s);\n\n float nx00 = v000 + (v100 - v000) * wx;\n float nx10 = v010 + (v110 - v010) * wx;\n float nx01 = v001 + (v101 - v001) * wx;\n float nx11 = v011 + (v111 - v011) * wx;\n\n float nxy0 = nx00 + (nx10 - nx00) * wy;\n float nxy1 = nx01 + (nx11 - nx01) * wy;\n\n float nxyz = nxy0 + (nxy1 - nxy0) * wz;\n\n sum += amp * nxyz;\n\n freq *= lacunarity;\n amp *= gain;\n \}\n\n if (detailAmount > 0.0001f)\n \{\n float detailSum = 0.0f;\n float dAmp = 1.0f;\n float dFreq = 4.0f;\n int detailOcts = 3;\n for (int di = 0; di < detailOcts; ++di)\n \{\n float sx = sx_base * dFreq + float(di) * 13.0f + float(seed) * 0.01f;\n float sy = sy_base * dFreq + float(di) * 17.0f + float(seed) * 0.02f;\n float sz = sz_base * dFreq + time + float(di) * 19.0f + float(seed) * 0.03f;\n\n float ix = floor(sx);\n float iy = floor(sy);\n float iz = floor(sz);\n\n float fx = sx - ix;\n float fy = sy - iy;\n float fz = sz - iz;\n\n float wx = fx * fx * (3.0f - 2.0f * fx);\n float wy = fy * fy * (3.0f - 2.0f * fy);\n float wz = fz * fz * (3.0f - 2.0f * fz);\n\n float n = (ix + 0.0f) * Kx + (iy + 0.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n float s = sin(n) * C; float v000 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 0.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v100 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 1.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v010 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 1.0f) * Ky + (iz + 0.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v110 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 0.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v001 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 0.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v101 = s - floor(s);\n n = (ix + 0.0f) * Kx + (iy + 1.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v011 = s - floor(s);\n n = (ix + 1.0f) * Kx + (iy + 1.0f) * Ky + (iz + 1.0f) * Kz + float(seed) * 0.0001f;\n s = sin(n) * C; float v111 = s - floor(s);\n\n float nx00 = v000 + (v100 - v000) * wx;\n float nx10 = v010 + (v110 - v010) * wx;\n float nx01 = v001 + (v101 - v001) * wx;\n float nx11 = v011 + (v111 - v011) * wx;\n\n float nxy0 = nx00 + (nx10 - nx00) * wy;\n float nxy1 = nx01 + (nx11 - nx01) * wy;\n\n float nxyz = nxy0 + (nxy1 - nxy0) * wz;\n\n detailSum += dAmp * nxyz;\n\n dFreq *= 2.0f;\n dAmp *= 0.5f;\n \}\n sum += detailSum * detailAmount * 0.5f;\n \}\n\n float value = sum * 0.5f;\n float outVal = value * amplitude;\n if (outVal < 0.0f) outVal = 0.0f;\n if (outVal > 1.0f) outVal = 1.0f;\n\n float3 outColor;\n if (singleColor != 0)\n \{\n outColor.x = outVal * color.x;\n outColor.y = outVal * color.y;\n outColor.z = outVal * color.z;\n \}\n else\n \{\n if (pos.z == 0) \{\n outColor.x = outVal;\n float ng = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 10.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n ng = ng - floor(ng);\n outColor.y = ng;\n float nb = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 20.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n nb = nb - floor(nb);\n outColor.z = nb;\n \}\n else if (pos.z == 1) \{\n outColor.y = outVal;\n float nr = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 0.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n nr = nr - floor(nr);\n outColor.x = nr;\n float nb = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 20.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n nb = nb - floor(nb);\n outColor.z = nb;\n \}\n else if (pos.z == 2) \{\n outColor.z = outVal;\n float nr = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 0.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n nr = nr - floor(nr);\n outColor.x = nr;\n float ng = sin((floor(sx_base * 4.0f) * Kx + floor(sy_base * 4.0f) * Ky + floor((sz_base + 10.0f) * 4.0f) * Kz + float(seed) * 0.0001f)) * C;\n ng = ng - floor(ng);\n outColor.y = ng;\n \} else \{\n outColor.x = outVal;\n outColor.y = outVal;\n outColor.z = outVal;\n \}\n \}\n\n float lum = outColor.x * 0.2126f + outColor.y * 0.7152f + outColor.z * 0.0722f;\n float3 satColor;\n satColor.x = lum + (outColor.x - lum) * saturation;\n satColor.y = lum + (outColor.y - lum) * saturation;\n satColor.z = lum + (outColor.z - lum) * saturation;\n outColor = satColor;\n\n if (gamma <= 0.0001f) gamma = 0.0001f;\n float invGamma = 1.0f / gamma;\n outColor.x = pow(outColor.x, invGamma);\n outColor.y = pow(outColor.y, invGamma);\n outColor.z = pow(outColor.z, invGamma);\n\n if (pos.z == 0) dst() = outColor.x;\n else if (pos.z == 1) dst() = outColor.y;\n else if (pos.z == 2) dst() = outColor.z;\n else dst() = outColor.x;\n \}\n // end local\n\};"
rebuild ""
FBMNoise_LatLongSeamless_Fixed_v2_Color {1 1 1}
FBMNoise_LatLongSeamless_Fixed_v2_SingleColor 2
FBMNoise_LatLongSeamless_Fixed_v2_Gain 0.555
FBMNoise_LatLongSeamless_Fixed_v2_Time 0.55
FBMNoise_LatLongSeamless_Fixed_v2_Gamma 0.23
FBMNoise_LatLongSeamless_Fixed_v2_Seed 2737
"FBMNoise_LatLongSeamless_Fixed_v2_Image Width" {{parent.NoOp1.Resolution.w}}
"FBMNoise_LatLongSeamless_Fixed_v2_Image Height" {{parent.NoOp1.Resolution.h}}
rebuild_finalise ""
name BlinkScript1
xpos -115
ypos -68
}
set Ned7d4800 [stack 0]
Shuffle2 {
fromInput1 {
{0}
B
}
fromInput2 {
{0}
B
}
mappings "4 rgba.red 0 0 rgba.red 0 0 white -1 -1 rgba.alpha 0 3 rgba.green 0 1 rgba.green 0 1 rgba.blue 0 2 rgba.blue 0 2"
name Shuffle1
xpos -115
ypos 4
}
Output {
name Output1
xpos -151
ypos 119
}
NoOp {
inputs 0
name NoOp1
xpos 14
ypos -33
addUserKnob {20 User}
addUserKnob {14 Resolution R 0 100}
Resolution {1280 720}
}
push $Ned7d4800
Viewer {
frame 59
frame_range 1-100
monitorOutNDISenderName "NukeX - 01 - Viewer1"
monitorOutOutputTransform rec709
name Viewer1
xpos 92
ypos 94
}
end_group