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:

Shader:
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.
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:

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