GLSL을위한 랜덤 / 노이즈 기능


179

GPU 드라이버 공급 업체는 일반적으로 noiseXGLSL에서 구현하기 를 귀찮게하지 않기 때문에 GPU 셰이더 내에서 사용하도록 최적화 된 "그래픽 랜덤 스위스 군용 칼" 유틸리티 기능 세트를 찾고 있습니다. GLSL을 선호하지만 모든 언어가 나를 위해 코드를 작성하면 GLSL로 직접 번역해도 괜찮습니다.

특히, 나는 기대할 것이다 :

a) 의사 난수 함수 -M 차원 시드에서 계산 된 [-1,1] 또는 [0,1]에 대한 N 차원의 균일 분포 (이상적으로는 값이 있지만 시드를 억제해도 괜찮습니다) 균일 한 결과 분포를 위해 0..1). 다음과 같은 것 :

float random  (T seed);
vec2  random2 (T seed);
vec3  random3 (T seed);
vec4  random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.

b) Perlin Noise와 같은 연속적인 노이즈-다시 한번, N- 차원, +-균등 분포, 제한된 값 세트 및 잘 보임 (Perlin 레벨과 같은 모양을 구성하는 일부 옵션도 유용 할 수 있음). 다음과 같은 서명을 기대합니다.

float noise  (T coord, TT seed);
vec2  noise2 (T coord, TT seed);
// ...

난수 생성 이론에 그다지 많지 않으므로 미리 만들어진 솔루션 을 간절히 원 하지만 "아주 훌륭하고 효율적인 1D rand ()가 있습니다. 그 위에 좋은 N- 차원 rand ()를 만드는 방법 ... " .

답변:


263

매우 단순한 의사 난수처럼 보이는 물건을 위해 인터넷에서 찾은이 oneliner를 사용합니다.

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

원하는 PRNG를 사용하여 노이즈 텍스처를 생성 한 다음 일반적인 방식으로 업로드하고 셰이더의 값을 샘플링 할 수도 있습니다. 원하는 경우 나중에 코드 샘플을 파낼 수 있습니다.

또한 Stefan Gustavson의 Perlin 및 Simplex 노이즈의 GLSL 구현에 대해서도이 파일 을 확인하십시오 .


14
당신은 어떻게 사용 vec2 co합니까? 그것은 범위입니까? 씨?
Ross

12
이 알고리즘 (예를 들어, S3의 ARM 말리)와 낮은 밀도 부동 소수점 조각 쉐이더주의 stackoverflow.com/questions/11293628/... . github.com/ashima/webgl-noise 프로젝트는 문제를 lowp이하지 않는 것 같습니다.
PT

4
FWIW, 여기에 설명 된 기능은 여기에 더 자세히 설명되어 있습니다 .
Loomchild

3
참고 : 그 기능의 분포는 끔찍합니다.
Tara

3
나는 GLSL에서 새로 왔으며 co.xy, 대신에 왜 사용 되는지 설명 할 수 co있습니까?
kelin

83

간단한 정수 해시 함수를 사용하고 결과를 float의 가수에 삽입 할 수 있다는 것이 나에게 발생합니다. IIRC의 GLSL 사양은 32 비트 부호없는 정수와 IEEE binary32 float 표현을 보장하므로 완벽하게 이식 가능해야합니다.

나는 지금 이것을 시도했다. 결과는 매우 좋습니다 : 시도한 모든 입력에 대해 정적 인 것처럼 보이며 패턴이 전혀 보이지 않습니다. 대조적으로 인기있는 sin / fract 스 니펫은 동일한 입력이 주어지면 GPU의 대각선을 상당히 뚜렷하게 나타냅니다.

한 가지 단점은 GLSL v3.30이 필요하다는 것입니다. 그리고 그것은 충분히 빠르지 만, 나는 경험적으로 그 성능을 정량화하지 않았습니다. AMD의 Shader Analyzer는 HD5870에서 vec2 버전에 대해 클럭 당 13.33 픽셀을 청구합니다. sin / fract 스 니펫의 경우 클럭 당 16 픽셀과 대조됩니다. 따라서 조금 느려집니다.

여기 내 구현이 있습니다. 나는 자신의 기능을 쉽게 파생시킬 수 있도록 아이디어를 다양한 순열로 남겼습니다.

/*
    static.frag
    by Spatial
    05 July 2013
*/

#version 330 core

uniform float time;
out vec4 fragment;



// A single iteration of Bob Jenkins' One-At-A-Time hashing algorithm.
uint hash( uint x ) {
    x += ( x << 10u );
    x ^= ( x >>  6u );
    x += ( x <<  3u );
    x ^= ( x >> 11u );
    x += ( x << 15u );
    return x;
}



// Compound versions of the hashing algorithm I whipped together.
uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y)                         ); }
uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z)             ); }
uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }



// Construct a float with half-open range [0:1] using low 23 bits.
// All zeroes yields 0.0, all ones yields the next smallest representable value below 1.0.
float floatConstruct( uint m ) {
    const uint ieeeMantissa = 0x007FFFFFu; // binary32 mantissa bitmask
    const uint ieeeOne      = 0x3F800000u; // 1.0 in IEEE binary32

    m &= ieeeMantissa;                     // Keep only mantissa bits (fractional part)
    m |= ieeeOne;                          // Add fractional part to 1.0

    float  f = uintBitsToFloat( m );       // Range [1:2]
    return f - 1.0;                        // Range [0:1]
}



// Pseudo-random value in half-open range [0:1].
float random( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
float random( vec2  v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float random( vec3  v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float random( vec4  v ) { return floatConstruct(hash(floatBitsToUint(v))); }





void main()
{
    vec3  inputs = vec3( gl_FragCoord.xy, time ); // Spatial and temporal inputs
    float rand   = random( inputs );              // Random per-pixel value
    vec3  luma   = vec3( rand );                  // Expand to RGB

    fragment = vec4( luma, 1.0 );
}

스크린 샷 :

static.frag의 랜덤 (vec3) 출력

이미지 편집 프로그램에서 스크린 샷을 검사했습니다. 256 개의 색상이 있으며 평균값은 127입니다. 이는 분포가 균일하고 예상 범위를 포함 함을 의미합니다.


17
좋은 아이디어와 구현을 위해 +1. 256 색이 있고 평균값이 127이므로 분포가 균일해야합니다 (엄격한 의미에서). 그것은 균일 할 수 있지만, 우리는 아직 그것을 모른다고 생각합니다. 예를 들어 종 곡선 분포는 동일한 평균 및 색상 수를 가질 수 있지만 균일하지는 않습니다.
LarsH

@LarsH가 제공 한 이유로 이것을 아래로 투표했습니다.
Autumnsault

균일 성이 필요 하지 않은 대부분의 응용 프로그램에는 충분합니다 . :-)
itmuckel

5
히스토그램에 대한 인식으로 인해 매우 균일 한 것 같습니다 ... 균일 성이 필요한 대부분의 응용 프로그램에도 충분하다고 말하고 싶습니다. (다른 것보다 적게 생성되는 것으로 보이는 유일한 값은 0과 255입니다)
leviathanbadger

감사. 내 확률은 녹슨 것입니다. GCN 명령어 세트를 살펴보면 최신 하드웨어에서는 명령어 세트에서 비트 필드 작업을 직접 지원하기 때문에 매우 빠릅니다. 이전 하드웨어에서 테스트를 수행했습니다.
공간

73

Gustavson의 구현은 1D 텍스처를 사용합니다.

아닙니다. 2005 년 이후가 아닙니다. 사람들이 구 버전 다운로드를 고집하는 것뿐입니다. 제공 한 링크에있는 버전은 8 비트 2D 텍스처 만 사용합니다.

Ashima의 Ian McEwan과 새 버전은 텍스처를 사용하지 않지만 텍스처 대역폭이 많은 일반 데스크탑 플랫폼에서 속도의 약 절반 속도로 실행됩니다. 모바일 플랫폼에서 텍스처링은 종종 병목 현상으로 인해 텍스처리스 버전이 더 빠를 수 있습니다.

적극적으로 유지 관리되는 소스 저장소는 다음과 같습니다.

https://github.com/ashima/webgl-noise

텍스처리스 및 텍스처 사용 버전의 노이즈 컬렉션이 여기 있습니다 (2D 텍스처 만 사용).

http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip

질문이 있으시면 언제든지 저에게 직접 이메일을 보내주십시오 (내 이메일 주소는 classicnoise*.glsl소스 에서 찾을 수 있습니다 ).


4
예, 내가 언급 한 구현은 @dep에 연결된 davidcornette.com의 코드에서 1D 텍스처를 사용합니다 : glBindTexture(GL_TEXTURE_1D, *texID);등. 당신이 내 대답에서 인용했기 때문에 "제공 한 링크"가 무엇을 의미하는지 명확하지 않습니다. 그러나 그 대답은 구현과 관련이 없습니다. 나는 내가 말하는 것을 명확히하고 당신이 제공 한 새로운 정보를 반영하기 위해 대답을 업데이트 할 것입니다. 이전 버전을 다운로드 할 때 사람들을 "고집"으로 특성화하는 것은 왜곡되지 않습니다.
LarsH

1
추신 : David Cornette에게 연락하고 ( davidcornette.com에 연락처 정보가 있음 ) 소스 repo에 연결하기 위해 davidcornette.com/glsl/links.html 에서 자신의 링크를 변경하도록 요청할 수 있습니다 . 나도 이메일을 보내겠다.
LarsH

1
PPS 어떤 버전이 8 비트 2D 텍스처 만 사용하는지 명확히 할 수 있습니까? 특정 플랫폼에 적합한 옵션 인 것 같습니다 ...
LarsH

31

골드 노이즈

// Gold Noise ©2015 dcerisano@standard3d.com
// - based on the Golden Ratio
// - uniform normalized distribution
// - fastest static noise generator function (also runs at low precision)

float PHI = 1.61803398874989484820459;  // Φ = Golden Ratio   

float gold_noise(in vec2 xy, in float seed){
       return fract(tan(distance(xy*PHI, xy)*seed)*xy.x);
}

지금 브라우저에서 골드 노이즈를보십시오!

여기에 이미지 설명을 입력하십시오

이 함수는 2017 년 9 월 9 일 현재 @appas 'answer의 현재 함수에 대한 임의 분포를 개선했습니다.

여기에 이미지 설명을 입력하십시오

@appas 함수도 시드가 제공되지 않아 (uv는 시드가 아니고 – 모든 프레임에 동일), 낮은 정밀도 칩셋에서 작동하지 않기 때문에 불완전합니다. 골드 노이즈는 기본적으로 낮은 정밀도로 실행됩니다 (훨씬 빠름).


이것을 게시 해 주셔서 감사합니다. 예를 들어 shadertoy.com에 실행 가능한 버전을 게시하여 사람들이 브라우저에서 사용해 볼 수 있습니까?
LarsH

@snb Shadertoy.com은 이번 달에 유지 보수 작업을 진행 중이며 인내심을 가지십시오. 또한 코드의 비이성적 인 시드 값에 대한 요구 사항을 명확하게 문서화했습니다. 골드 노이즈는 스칼라를 반환하기 때문에 스칼라를 사용하여 벡터를 구성하는 것은 쉽지 않으며 코드에도 문서화되어 있습니다.
Dominic Cerisano

7
나는 이것이 다른 소음 기능과 다르다고 생각하지 않습니다. 이것이 특별한 특성을 가지고 있음을 증명하는 것은 무엇입니까? 비합리적인 숫자를 사용한다고해서 특별하지는 않습니다.
M.kazem Akhgary 11

2
@Dominic : "유사한 기능에 대한 우수한 분포가 있습니다": 이것은 입증되어야합니다. tan ()은 실제로 상태가 좋지 않습니다. pi / 2 근처의 tan () 및 0 근처의 sqrt ()는 모든 fract (non-linear * big)가 덜 중요한 비트를 기반으로하기 때문에 다른 하드웨어에서 다른 결과를 생성 할 가능성이 높습니다. 입력 값이 작거나 높으면 영향을 미칩니다. 또한 비트 다이나믹은 위치에 따라 크게 다를 수 있습니다.
Fabrice NEYRET

2
NB : 오늘날 GLSL에는 정수가 있으므로 더 이상 유사한 성능으로 품질 분배 (및 동적)가 필요한 경우 "심각한"int 기반 해시 생성기를 사용하지 않는 이유가 없습니다. (매우 저렴한 기기 제외).
Fabrice NEYRET

12

멋진 구현 설명도 있습니다 여기에 소음 펄린 같은 외모,하지만 "어떤 설정, 즉하지 질감도 균일 한 배열을 필요로하지 않습니다. 그냥 쉐이더 소스 코드에 추가하고 당신이 원하는 목적지를 호출"고 McEwan은과 @StefanGustavson에 의해.

@dep에 연결된 Gustavson의 이전 구현 이 GLSL ES (WebGL의 셰이더 언어) 에서 지원되지 않는 1D 텍스처를 사용한다는 점에서 특히 유용합니다 .


1
이것은 OP의 b) 잡음 유형 요청에 대한 가장 좋은 답변입니다! 직접 링크 github.com/ashima/webgl-noise 입니다. GLSL 120 코드로 준비된 2D, 3D 및 4D 버전이 있습니다.
362515

3

이것을 사용하십시오 :

highp float rand(vec2 co)
{
    highp float a = 12.9898;
    highp float b = 78.233;
    highp float c = 43758.5453;
    highp float dt= dot(co.xy ,vec2(a,b));
    highp float sn= mod(dt,3.14);
    return fract(sin(sn) * c);
}

이것을 사용하지 마십시오 :

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

OpenGL ES 2.0의 정식 단일 라이너 GLSL rand () 개선 에서 설명을 찾을 수 있습니다.


나는 기사를 훑어 보았지만 여전히 확실하지 않다 .pi mod의 근사치 3.14 입니까?
Kaan E.

2

GPU에 대한이 3d 노이즈 버전을 찾았습니다.

#ifndef __noise_hlsl_
#define __noise_hlsl_

// hash based 3d value noise
// function taken from https://www.shadertoy.com/view/XslGRr
// Created by inigo quilez - iq/2013
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

// ported from GLSL to HLSL

float hash( float n )
{
    return frac(sin(n)*43758.5453);
}

float noise( float3 x )
{
    // The noise function returns a value in the range -1.0f -> 1.0f

    float3 p = floor(x);
    float3 f = frac(x);

    f       = f*f*(3.0-2.0*f);
    float n = p.x + p.y*57.0 + 113.0*p.z;

    return lerp(lerp(lerp( hash(n+0.0), hash(n+1.0),f.x),
                   lerp( hash(n+57.0), hash(n+58.0),f.x),f.y),
               lerp(lerp( hash(n+113.0), hash(n+114.0),f.x),
                   lerp( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);
}

#endif

1
골드 노이즈 (위)는 훨씬 적은 연산을 수행하고 단 하나의 해시 만 수행하므로 분명히 가장 빠릅니다. 이것은 중첩 선형 보간 (lerps)을 수행하는 동안 해시 함수를 8 번 호출합니다. 또한 이것은 특히 낮은 정밀도에서 분포가 열등합니다.
Dominic Cerisano

1
오 좋은 점은 Inigo Quilez의 shadertoh의 펄린 노이즈 유형 그래프입니다. 좋은 코드 도미닉은 그것을 확인 l8r
com.prehensible

@Fabrice 당신은 OP의 질문, 내 대답, 내 코드 또는 내 의견을 이해하지 못하는 것 같습니다. Gold Noise는 OPs 정의에 의해 연속적입니다. UV와 시드를 받아 셰이더를 제공하여 증명합니다. 귀하의 의견에 관한 모든 것이 잘못되었습니다. 의사 랜덤 노이즈 함수와 해시 함수를 혼동하지 마십시오. 그들은 동일하지 않습니다. 노이즈 함수는 해시 함수 (실제 전체 해싱 지점)와 같은 고유 식별자를 생성 할 필요가 없습니다.
Dominic Cerisano

제발, 도미니크 제발, 제발 그렇지 않은 동안 이해한다고 생각되는 용어에 대해 주장하기 전에 자세히 읽어보고 더 배우십시오. 이 용어들은 완전히 정확하고 문학에 잘 정의되어있을뿐만 아니라, 현장에서 일을하고있을뿐 아니라, OP는 그가 본 사례를 통해 그 용어를 이해했음을 증명합니다. 힌트 : "연속적"+ "소음"+ "like Perlin". en.wikipedia.org/wiki/Perlin_noise
Fabrice NEYRET

연속은 루프 절을 추가하는 경우에만 발생하며, 많은 노이즈 함수는 특히 그래픽의 비트 반올림으로 인해 특정 방식으로 루프되고 저하됩니다. 얘들 아, 당신과의 의사 소통이 중요합니다. 중요한 연구에 시간을 사용하십시오.
com.prehensible

1

1d Perlin의 직선, 들쭉날쭉 한 버전, 본질적으로 임의의 lfo 지그재그.

half  rn(float xx){         
    half x0=floor(xx);
    half x1=x0+1;
    half v0 = frac(sin (x0*.014686)*31718.927+x0);
    half v1 = frac(sin (x1*.014686)*31718.927+x1);          

    return (v0*(1-frac(xx))+v1*(frac(xx)))*2-1*sin(xx);
}

또한 shadertoy 소유자 inigo quilez perlin tutorial 웹 사이트 및 voronoi 등에서 1-2-3-4d perlin 노이즈를 발견했으며, 그에 대한 빠른 구현 및 코드가 있습니다.


1

해시 : 요즘 webGL2.0이 있으므로 (w) GLSL에서 정수를 사용할 수 있습니다. -> 휴대용 포터블 해시 (못생긴 플로트 해시와 비슷한 비용)를 위해 이제 "심각한"해싱 기술을 사용할 수 있습니다. IQ는 https://www.shadertoy.com/view/XlXcW4 (및 그 이상) 에서 일부를 구현했습니다.

예 :

  const uint k = 1103515245U;  // GLIB C
//const uint k = 134775813U;   // Delphi and Turbo Pascal
//const uint k = 20170906U;    // Today's date (use three days ago's dateif you want a prime)
//const uint k = 1664525U;     // Numerical Recipes

vec3 hash( uvec3 x )
{
    x = ((x>>8U)^x.yzx)*k;
    x = ((x>>8U)^x.yzx)*k;
    x = ((x>>8U)^x.yzx)*k;

    return vec3(x)*(1.0/float(0xffffffffU));
}

0

렌더링 된 텍스처에 화이트 노이즈를 추가하는 방법의 예를 아래에서 참조하십시오. 이것처럼, 원래의 순수한 백색 잡음 :이 솔루션은 두 개의 텍스처를 사용하는 화이트 노이즈 위키

private static final String VERTEX_SHADER =
    "uniform mat4 uMVPMatrix;\n" +
    "uniform mat4 uMVMatrix;\n" +
    "uniform mat4 uSTMatrix;\n" +
    "attribute vec4 aPosition;\n" +
    "attribute vec4 aTextureCoord;\n" +
    "varying vec2 vTextureCoord;\n" +
    "varying vec4 vInCamPosition;\n" +
    "void main() {\n" +
    "    vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
    "    gl_Position = uMVPMatrix * aPosition;\n" +
    "}\n";

private static final String FRAGMENT_SHADER =
        "precision mediump float;\n" +
        "uniform sampler2D sTextureUnit;\n" +
        "uniform sampler2D sNoiseTextureUnit;\n" +
        "uniform float uNoseFactor;\n" +
        "varying vec2 vTextureCoord;\n" +
        "varying vec4 vInCamPosition;\n" +
        "void main() {\n" +
                "    gl_FragColor = texture2D(sTextureUnit, vTextureCoord);\n" +
                "    vec4 vRandChosenColor = texture2D(sNoiseTextureUnit, fract(vTextureCoord + uNoseFactor));\n" +
                "    gl_FragColor.r += (0.05 * vRandChosenColor.r);\n" +
                "    gl_FragColor.g += (0.05 * vRandChosenColor.g);\n" +
                "    gl_FragColor.b += (0.05 * vRandChosenColor.b);\n" +
        "}\n";

공유 된 프래그먼트에는 uNoiseFactor 매개 변수가 포함되어 있으며, 이는 주 애플리케이션에 의해 모든 렌더링에서 업데이트됩니다.

float noiseValue = (float)(mRand.nextInt() % 1000)/1000;
int noiseFactorUniformHandle = GLES20.glGetUniformLocation( mProgram, "sNoiseTextureUnit");
GLES20.glUniform1f(noiseFactorUniformHandle, noiseFactor);

0

Ken Perlin의 Java 구현 중 하나를 GLSL로 변환하여 ShaderToy의 두 프로젝트에서 사용했습니다.

아래는 내가 한 GLSL 해석입니다.

int b(int N, int B) { return N>>B & 1; }
int T[] = int[](0x15,0x38,0x32,0x2c,0x0d,0x13,0x07,0x2a);
int A[] = int[](0,0,0);

int b(int i, int j, int k, int B) { return T[b(i,B)<<2 | b(j,B)<<1 | b(k,B)]; }

int shuffle(int i, int j, int k) {
    return b(i,j,k,0) + b(j,k,i,1) + b(k,i,j,2) + b(i,j,k,3) +
        b(j,k,i,4) + b(k,i,j,5) + b(i,j,k,6) + b(j,k,i,7) ;
}

float K(int a, vec3 uvw, vec3 ijk)
{
    float s = float(A[0]+A[1]+A[2])/6.0;
    float x = uvw.x - float(A[0]) + s,
        y = uvw.y - float(A[1]) + s,
        z = uvw.z - float(A[2]) + s,
        t = 0.6 - x * x - y * y - z * z;
    int h = shuffle(int(ijk.x) + A[0], int(ijk.y) + A[1], int(ijk.z) + A[2]);
    A[a]++;
    if (t < 0.0)
        return 0.0;
    int b5 = h>>5 & 1, b4 = h>>4 & 1, b3 = h>>3 & 1, b2= h>>2 & 1, b = h & 3;
    float p = b==1?x:b==2?y:z, q = b==1?y:b==2?z:x, r = b==1?z:b==2?x:y;
    p = (b5==b3 ? -p : p); q = (b5==b4 ? -q : q); r = (b5!=(b4^b3) ? -r : r);
    t *= t;
    return 8.0 * t * t * (p + (b==0 ? q+r : b2==0 ? q : r));
}

float noise(float x, float y, float z)
{
    float s = (x + y + z) / 3.0;  
    vec3 ijk = vec3(int(floor(x+s)), int(floor(y+s)), int(floor(z+s)));
    s = float(ijk.x + ijk.y + ijk.z) / 6.0;
    vec3 uvw = vec3(x - float(ijk.x) + s, y - float(ijk.y) + s, z - float(ijk.z) + s);
    A[0] = A[1] = A[2] = 0;
    int hi = uvw.x >= uvw.z ? uvw.x >= uvw.y ? 0 : 1 : uvw.y >= uvw.z ? 1 : 2;
    int lo = uvw.x <  uvw.z ? uvw.x <  uvw.y ? 0 : 1 : uvw.y <  uvw.z ? 1 : 2;
    return K(hi, uvw, ijk) + K(3 - hi - lo, uvw, ijk) + K(lo, uvw, ijk) + K(0, uvw, ijk);
}

이 소스에서 Ken Perlin의 노이즈 하드웨어 2 장 부록 B에서 번역했습니다.

https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf

게시 된 노이즈 기능을 사용하는 셰이더 토이에서 한 공개 셰이드는 다음과 같습니다.

https://www.shadertoy.com/view/3slXzM

연구 중에 소음에 관한 다른 좋은 소스는 다음과 같습니다.

https://thebookofshaders.com/11/

https://mzucker.github.io/html/perlin-noise-math-faq.html

https://rmarcus.info/blog/2018/03/04/perlin-noise.html

http://flafla2.github.io/2014/08/09/perlinnoise.html

https://mrl.nyu.edu/~perlin/noise/

https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf

https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html

노이즈에 대한 훌륭한 대화식 설명뿐만 아니라 다른 셰이더 개념도 제공하므로 셰이더를 강력히 권장합니다.

편집하다:

GLSL에서 사용 가능한 일부 하드웨어 가속 기능을 사용하여 변환 된 코드를 최적화 할 수 있습니다. 내가이 일을 끝내면이 게시물을 업데이트 할 것입니다.


또한 Perlin / Simplex Noise가 여전히 의사 랜덤임을 확신합니다. 내가 기억하는 것에서 흥미로운 점은 노이즈를 서로 다른 레벨에서 레이어링하고 "확대"하여 매우 매끄럽게 보이게한다는 것입니다. 저를 인용하지 말고 생각해보십시오.
앤드류 Meservy

@Zibri 불행히도, 나는 C 또는 .sh 명령에 익숙하지 않습니다. 그러나 함수는 단순히 의사 난수 생성기이며 잡음 함수가 아닌 것 같습니다. 또한 glsl 픽셀 셰이더는 GPU에서 직접 실행됩니다. C에서 사용 가능한 추가 라이브러리 또는 CPU 기능에 액세스 할 수 없습니다.
Andrew Meservy

셰이더 북에는 그리드 왜곡과 점당 계산 횟수 감소로 인해 Simplex Noise가 Perlin Noise의보다 효율적인 버전 인 방법에 대한 훌륭한 설명이 있습니다. 확실히 읽을만한 가치가 있습니다.
Andrew Meservy

프랙탈 브라운 운동과 voronoise에 대한 장을 참조하십시오
앤드류 Meservy

Andrew Meservy : 라이브러리가 필요하지 않습니다 ... 내 노이즈 함수는 매우 간단합니다 : 2 64 비트 정수는 상태 x (n)과 x (n-1)입니다. 간단하고 빠른 공식은 x (n + 1) = ROTR ( x (n) + x (n-1), 8). 내 자식을 복제하고 실행하면 실제로 작동합니다.
Zibri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.