Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

20.11.2010, 13:59

[Erledigt] Parallax Occlusion Mapping - sieht in flachen Winkeln bescheiden aus

Hi Leute!
Ich habe mich an POM gewagt und den Shader aus dem Artikel auf Gamedev.net genommen.
Der HLSL-Code sieht alles in allem so aus:

HLSL-Quelltext

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
////////////////////////////////////////////////////////////////// 
//POM Shader 

////////////////////////////////////////////////////////////////// 
//Includes 
#include"Constants.fx" 
#include"Sampler.fx" 
#include"Textures.fx" 
#include"Lighting.fx" 


////////////////////////////////////////////////////////////////// 
//Layout 
struct VSInput 
{ 
uint IID : SV_InstanceID; //ID der Model-Instanz 
float3 vPosition : POSITION0; //Vertexposition im ModelSpace 
float3 vNormal : NORMAL0; //Vertexnormale im ModelSpace 
float3 vTangent : TANGENT0; //Vertextangente im ModelSpace 
float2 vTextureCoord : TEXCOORD0; //Vertex-Texturkoordinaten 
}; 

struct PSInput 
{ 
uint IID : INSTANCEID; //ID der Model-Instanz 
float4 vPosition : SV_Position; //Fertig transformierte Pixelposition 
float3 vWorldPosition : POSITION0; //Position des Pixels im WorldSpace 
float3 vViewDir : VIEWDIR0; //Normalisierter Vektor von Kamera in Richtung des Pixels im WorldSpace 
float3 vNormal : NORMAL0; //Normale des Pixels im WorldSpace 
float3 vTangent : TANGENT0; //Tangente des Pixels im WorldSpace 
float3 vBinormal : BINORMAL0; //Binormale des Pixels im WorldSpace 
float2 vTextureCoord : TEXCOORD0; //Texturkoordinaten des Pixels 

//# 
float3 vViewDirTS : VIEWDIRTS0; //Normalisierter Vektor von Kamera in Richtung des Pixels im TangentSpace 
float3 vNormalTS : NORMALTS0; //Normale des Pixels im TangentSpace 
//# 
}; 

struct PSOutput 
{ 
float4 Color : SV_Target0; //Fertig berechnete Farbe des Pixels 
}; 

//VertexShader 
PSInput VertexShaderProc(VSInput In) 
{ 
PSInput Out; 

Out.IID= In.IID; 

float4 vWorldPosition= mul(float4(In.vPosition, 1.0), Instance[In.IID].mWorld); 
Out.vPosition= mul(vWorldPosition, mViewProjection); 

Out.vWorldPosition= vWorldPosition.xyz; 
Out.vViewDir= normalize(Out.vWorldPosition - vCameraPosition); 
float3 vNormal= mul(In.vNormal, (float3x3)Instance[In.IID].mWorld); 
Out.vNormal= vNormal; 

Out.vTangent= mul(In.vTangent, (float3x3)Instance[In.IID].mWorld); 
Out.vBinormal= cross(Out.vNormal, Out.vTangent); 

Out.vTextureCoord= In.vTextureCoord; 

//# 
//Blickrichtung und Normale im TangentSpace benötigt 
row_major float3x3 mTBN= {Out.vTangent, Out.vBinormal, Out.vNormal}; 
Out.vViewDirTS= mul(mTBN, -Out.vViewDir); 
Out.vNormalTS= mul(mTBN, Out.vNormal); 
//# 

return(Out); 
} 

//PixelShader 
PSOutput PixelShaderProc(PSInput In) 
{ 
PSOutput Out; 

//# 
//Parallax Occlusion Mapping 
float fParallaxLimit= length(In.vViewDirTS.xy) / In.vViewDirTS.z; 
const float fHeightMapScale= 0.1; 
fParallaxLimit*= fHeightMapScale; 

float2 vOffset = normalize( -In.vViewDirTS.xy ); 
vOffset = vOffset * fParallaxLimit; 
float3 E = normalize( In.vViewDirTS ); 
float3 N = normalize( In.vNormalTS ); 

const int nMinSamples= 16; 
const int nMaxSamples= 128; 
int nNumSamples = (int)lerp( nMinSamples, nMaxSamples, dot( E, N ) ); 
float fStepSize = 1.0 / (float)nNumSamples; 

float2 dx, dy; 
dx = ddx( In.vTextureCoord ); 
dy = ddy( In.vTextureCoord ); 

float2 vOffsetStep = fStepSize * vOffset; 
float2 vCurrOffset = float2( 0, 0 ); 
float2 vLastOffset = float2( 0, 0 ); 
float2 vFinalOffset = float2( 0, 0 ); 

float4 vCurrSample; 
float4 vLastSample; 

float stepHeight = 1.0; 
int nCurrSample = 0; 

while ( nCurrSample < nNumSamples ) 
{ 
vCurrSample = TexNormalHeight.SampleGrad( TextureSamplerWrap, In.vTextureCoord + vCurrOffset, dx, dy ); 
if ( vCurrSample.a > stepHeight ) 
{ 
float Ua = (vLastSample.a - (stepHeight+fStepSize)) / ( fStepSize + (vCurrSample.a - vLastSample.a)); 
vFinalOffset = vLastOffset + Ua * vOffsetStep; 

vCurrSample = TexNormalHeight.SampleGrad( TextureSamplerWrap, In.vTextureCoord + vFinalOffset, dx, dy ); 
nCurrSample = nNumSamples + 1; 
} 
else 
{ 
nCurrSample++; 
stepHeight -= fStepSize; 
vLastOffset = vCurrOffset; 
vCurrOffset += vOffsetStep; 
vLastSample = vCurrSample; 
} 
} 

In.vTextureCoord+= vFinalOffset; 
//# 

//NormalMapping 
row_major float3x3 mTBN= {In.vTangent, In.vBinormal, In.vNormal}; 
float3 vNormal= normalize(mul(TexNormalHeight.Sample(TextureSamplerWrap, In.vTextureCoord).rgb * 2.0 - 1.0, mTBN)); 

//Illumination 
float3 DiffuseLight= float3(0, 0, 0); 
float3 SpecularLight= float3(0, 0, 0); 
LightSource Light; 
uint LightIndex; 

//Light #0 (Directional) 
LightIndex= Instance[In.IID].aLightIndices[0].LID; 
if(LightIndex != 0xFFFFFFFF) 
{ 
Light= aLights[LightIndex]; 
DiffuseLight+= DirectionalLightDiffuse(Light, vNormal); 
SpecularLight+= DirectionalLightSpecular(Light, vNormal, MatSpecularColorPower.a, In.vViewDir); 
} 
//Color-Sources 
float4 ColorAlpha= MatColorAlpha; 
float4 SpecularColorPower= MatSpecularColorPower; 
float4 EmissiveAmbient= MatEmissiveAmbient; 
float4 MirrorColorSaturation= MatMirrorColorSaturation; 

ColorAlpha*= TexColorAlpha.Sample(TextureSamplerWrap, In.vTextureCoord); 

Out.Color= float4(0, 0, 0, 1); 
Out.Color.rgb+= AmbientLight.rgb * EmissiveAmbient.a * ColorAlpha.rgb; 
Out.Color.rgb+= DiffuseLight * ColorAlpha.rgb; 
Out.Color.rgb+= SpecularLight * SpecularColorPower.rgb; 

return(Out); 
}


Allerdings sieht das bei flachen Winkeln ziemlich bescheiden aus: starkes Aliasing. Wie kann man das verbessern?

EDIT: Ich habe eine kleine Test-Anwendung zusammengestellt. Im Ordner Data\Shaders liegt der POM-Shader. Zum testen kann der verändert werden.
Hier der Downloadlink: EDIT2: Link ist offline.
»BlazeX« hat folgendes Bild angehängt:
  • POM aliasing.jpg

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlazeX« (24.11.2010, 14:37) aus folgendem Grund: Erledigt


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

21.11.2010, 12:08

Gut, dass du die d3dx11_42.dll mitlieferst, wo es doch statt dessen die d3dx11_43.dll braucht.
Und die CEGUIBase.dll fehlt ebenfalls.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

21.11.2010, 14:35

davon abgesehen dass das die falsche dll ist - Die darf er auch eigentlich gar nicht mitliefern da musst DU das entsprechende redist installieren ;)

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

21.11.2010, 15:18

Also gut, ich glaube, ich habe jetzt alle nötigen DLLs drin.
Der Link bleibt der selbe.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

21.11.2010, 18:05

d3dx10_43.dll fehlt.
Was ist das denn für ein Linking, sag mal? Das sind ja grauenhafte Abhängigkeiten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

21.11.2010, 21:57

Ich hab zwar noch keine Ahnung von der Materie, aber habs mir mal runtergeladen und bei mir funktionierts.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

21.11.2010, 22:41

Wenn du willst dass es auch bei flachen Winkeln noch gut aussieht musst du dein Sampling intelligenter machen. Ansätze dazu gibts hier und hier.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

22.11.2010, 13:08

Ah danke dot, solche Papers habe ich gesucht!
Mal sehen, was ich daraus machen kann.

@BlueCobold: Du müsstest das aktuelle DirectX Redistributable installieren!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.11.2010, 13:11

Da du aber sowieso D3D11 verwendest würd ich mir an deiner Stelle auch mal Tesselation anschaun. Wär interessant Tesselation vs. Parallax Mapping zu testen, könnte mir vorstellen dass ersteres neben der natürlich viel besseren visuellen Qualität evtl. auch Performancevorteile hat :)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

22.11.2010, 13:18

Trotz all des (ohne Zweifel nützlichen) Lesestoffes glaube ich, dass Du auch mal Deine TBN-Matrix abklopfen solltest. Die linke Seite des Würfels sieht sehr nach unten gestreckt aus... ich glaube, Deine Tangenten sind im Arsch.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige