Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C# / SlimDX / HLSL] Perlin noise in Compute Shader 5?

Pagina: 1
Acties:

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Hey :).

Ik ben onlangs begonnen met SlimDX om het één en ander te leren over DirectX 11. Nu ben ik bezig met een perlin noise Compute Shader te schrijven maar zit met een probleem waar ik na 3 dagen nog steeds niet uit ben. En blijkbaar zijn er maar weinig artikels i.v.m CS 4/5. Omdat ik geen voorbeeld kon vinden van een compute shader Perlin noise implementatie heb ik besloten om de pixel shader implementatie van GPU Gems 2 te porten.

De shader lijkt te werken, echter krijg ik deze output:

Afbeeldingslocatie: http://i.cubeupload.com/tAhVSn.png

Shader:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#define NumOfThreadsX 16
#define NumOfThreadsY 16
#define NumOfThreadsZ 1

// ===========================================================================
// ===========================================================================

Texture2D<float> PermTexture : register(t0);
Texture2D<float> GradTexture : register(t1);
RWTexture2D<float4> OutputTexture : register(u0);

struct ComputeShaderInput
{
    uint3 GroupThreadID     : SV_GroupThreadID;
    uint3 GroupID           : SV_GroupID;
    uint3 DispatchThreadID  : SV_DispatchThreadID;
};

// ===========================================================================
// ===========================================================================

float Perm(float x)
{
    //return tex1D(permSampler, x / 256.0) * 256;
    return PermTexture[int2(x, 0)] * 256;
}

float Grad(float x, float3 p)
{
    //return dot(tex1D(gradSampler, x), p);
    return dot(GradTexture[int2(x, 0)], p);
}

float3 Fade(float3 t)
{
    return t * t * t * (t * (t * 6 - 15) + 10);
}

float Noise3D(float3 p)
{
    float3 P = fmod(floor(p), 256.0);
    p -= floor(p);
    float3 f = Fade(p);

    // HASH COORDINATES FOR 6 OF THE 8 CUBE CORNERS
    float A  = Perm(P.x) + P.y;
    float AA = Perm(A) + P.z;
    float AB = Perm(A + 1) + P.z;
    float B  = Perm(P.x + 1) + P.y;
    float BA = Perm(B) + P.z;
    float BB = Perm(B + 1) + P.z;

    // AND ADD BLENDED RESULTS FROM 8 CORNERS OF CUBE
    return lerp(
        lerp(lerp(Grad(Perm(AA), p),
                  Grad(Perm(BA), p + float3(-1, 0, 0)), f.x),
             lerp(Grad(Perm(AB), p + float3(0, -1, 0)),
                  Grad(Perm(BB), p + float3(-1, -1, 0)), f.x), f.y),
        lerp(lerp(Grad(Perm(AA + 1), p + float3(0, 0, -1)),
                  Grad(Perm(BA + 1), p + float3(-1, 0, -1)), f.x),
             lerp(Grad(Perm(AB + 1), p + float3(0, -1, -1)),
                  Grad(Perm(BB + 1), p + float3(-1, -1, -1)), f.x), f.y),
        f.z);
}


[numthreads(NumOfThreadsX, NumOfThreadsY, NumOfThreadsZ)]
void MainCS(ComputeShaderInput input)
{
    /*float frequency = 0.04f;
    float persistence = 1.0f;
    float lacunarity = 2.0f;
    int octaves = 1;*/

    int2 index = input.DispatchThreadID.xy;
    float signal = Noise3D(float3(index, 0) / 256);
    
    OutputTexture[index] = float4(signal, signal, signal, 1.0);
}


De textures worden zo gegenereerd: http://pastebin.com/h3X2djtX

Iemand enig idee wat ik hier fout doe? Is er een betere manier om textures te laden van een array in SlimDX? Alvast bedankt.

[ Voor 66% gewijzigd door Hyperz op 04-04-2011 15:53 ]

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD