#MPosition
IMPOSITION!
but MPOSITION would be cool too I guess
October 2, 2023 at 10:21 PM
MPOSITION OF UNNECESSARY OBSTACLES giveaway over at tor dot com's instagram: www.instagram.com/p/Cx5iSOUpcj...
Tordotcom Publishing on Instagram: "Follow & comment for the chance to win an ARC of The Imposition ...
179 likes, 26 comments - tordotcompub on October 2, 2023: "Follow & comment for the chance to win an ARC of The Imposition of Unnecessary Obstacles by @info..."
www.instagram.com
October 2, 2023 at 10:20 PM
mposition together used the phrases that came out naturally.

Kanami: There is a part in the interlude where the guitar and bass are in harmony, where she was having trouble. She was saying this is hard to play on the bass.

Misa: Yes, there sure was.

Kanami: But speaking of playing, Play was more
January 11, 2026 at 7:06 AM
mposition together used the phrases that came out naturally.

Kanami: There is a part in the interlude where the guitar and bass are in harmony, where she was having trouble. She was saying this is hard to play on the bass.

Misa: Yes, there sure was.

Kanami: But speaking of playing, Play was more
May 17, 2025 at 6:06 AM
mposition together used the phrases that came out naturally.

Kanami: There is a part in the interlude where the guitar and bass are in harmony, where she was having trouble. She was saying this is hard to play on the bass.

Misa: Yes, there sure was.

Kanami: But speaking of playing, Play was more
July 24, 2026 at 6:06 AM
📌 Salvează această postare. Poziția corectă în „M” este unul dintre cele mai importante lucruri pe care orice părinte care poartă un bebeluș ar trebui să le cunoască.

#KiddyShop #BobaBliss #Babywearing #PurtareErgonomică #MarsupiuErgonomic #WrapElastic #Bebeluși #HipHealthy #MPosition #Parenting
July 21, 2026 at 4:24 PM
mposition together used the phrases that came out naturally.

Kanami: There is a part in the interlude where the guitar and bass are in harmony, where she was having trouble. She was saying this is hard to play on the bass.

Misa: Yes, there sure was.

Kanami: But speaking of playing, Play was more
September 17, 2025 at 6:06 AM
mposition together used the phrases that came out naturally.

Kanami: There is a part in the interlude where the guitar and bass are in harmony, where she was having trouble. She was saying this is hard to play on the bass.

Misa: Yes, there sure was.

Kanami: But speaking of playing, Play was more
August 26, 2025 at 6:06 AM
...mposition, geological activity, and even the planet's size and mass can influence its potential to support life.
November 14, 2025 at 5:03 AM
...mposition, and surface properties.

What other insights into the physical properties of asteroids can we gain from studying their thermal behavior? Let's investigate! 🚀
January 15, 2025 at 3:00 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
March 4, 2026 at 8:29 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
March 3, 2026 at 10:55 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
March 2, 2026 at 3:28 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
March 1, 2026 at 8:21 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 28, 2026 at 8:47 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 28, 2026 at 2:07 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 28, 2026 at 7:27 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 28, 2026 at 12:46 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 27, 2026 at 6:09 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 27, 2026 at 11:25 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 27, 2026 at 4:44 AM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 26, 2026 at 10:04 PM
(February 2026) Monthly WIP Screenshot Thread
uniform vec4 m_MainColor; uniform vec4 m_NoiseColor; uniform float m_NoiseSize; uniform float m_NoiseAmount; uniform float m_NoiseOscillationChance; uniform float m_NoiseOscillationForce; uniform float m_Progress; in vec3 mPosition; float hash(vec2 p) { p = fract(p * vec2(123.34, 456.21)); p += dot(p, p + 45.32); return fract(p.x * p.y); } float rand(vec2 co, float probability, float seed) { float gridSize = 10.0; vec2 gridPos = floor(co * gridSize); return step(1.0 - probability, hash(gridPos + seed)); } vec4 generateWave( float phase, float frequency, float width, float opacity ) { vec4 waveColor = m_MainColor; float waveProgress = pow(abs(sin((phase + m_Progress * frequency) + (mPosition.y))), 1.0 / width); waveColor.a *= waveProgress; waveColor.a *= opacity; waveColor.rgb *= smoothstep(0.0, 0.8, waveColor.a); return waveColor; } void main(){ vec4 wavesColor = generateWave(0.0, 0.05, 0.1000, 0.4) + generateWave(0.3, 0.02, 0.0750, 0.4) + generateWave(0.7, 0.08, 0.2000, 0.4) + generateWave(0.0, 0.10, 0.0100, 0.6) + generateWave(0.0, 0.20, 0.0001, 1.0); float noiseAmount = m_NoiseAmount; float noiseOscillation = rand(vec2(0.0), m_NoiseOscillationChance, m_Progress) * m_NoiseOscillationForce; noiseAmount += noiseOscillation; float randomValue = rand(mPosition.xy / m_NoiseSize, noiseAmount, m_Progress); float noiseInfluence = max(randomValue - wavesColor.a, 0.0); vec4 noiseColor = m_NoiseColor * noiseInfluence; gl_FragColor = wavesColor + noiseColor; } This is the fragment shader I am using. The most notable difference with respect to the pseudo-random functions I have found on the web was the usage of hashing + step threshold rather than sinusoidal functions. Using sin, the wavy artifacts are evident at low resolutions, while I needed my randomness to look like a random grid of binary 0-1 values.
hub.jmonkeyengine.org
February 22, 2026 at 6:43 PM