Ben laatst aan het proberen geweest om de Fixed Function Pipeline de deur uit te gooien, en die te vervangen door Programmable Shaders, HLSL dus.
Maar het gaat nog niet zo lekker. Elke keer als ik probeer om ID3DXEffect::Begin te gebruiken, crasht het programma. En ik heb geen idee waarom. Hier is de code die met de shaders te maken heeft:
Als ik alle dingen één voor één weg ga commenten, blijft over dat Begin() de fouten veroorzaakt. De fout post ik hier even niet, het is gewoon een standaard 'has stopped working'-fout. Dan nog even het shaderbestand:
Had ook nog de shadercompiler op debug gezet, maar die vond het allemaal wel goed:
Wat dus gaar is, is dat als ik het venster (met de daarop gelockte viewport) niet beweeg, dat alles goedgaat. Pas als ik messages op het programma afgooi (WM_SIZE bijvoorbeeld), loopt 'ie vast.
Erg vervelend natuurlijk, zeker als je niet weet wat je verkeerd doet. Is hier nog iemand die een helder idee heeft?
Maar het gaat nog niet zo lekker. Elke keer als ik probeer om ID3DXEffect::Begin te gebruiken, crasht het programma. En ik heb geen idee waarom. Hier is de code die met de shaders te maken heeft:
C++:
1
2
3
4
5
6
7
8
9
10
11
| // De shaders laden en daarmee tekenen FX->SetTechnique(tech); FX->SetMatrix(matrix,&(matView*matProjection)); UINT numPasses = 0; FX->Begin(&numPasses,0); for(UINT i = 0; i < numPasses; ++i) { FX->BeginPass(i); d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 3*numfaces-numoffsets, 0, numfaces); FX->EndPass(); } FX->End(); |
Als ik alle dingen één voor één weg ga commenten, blijft over dat Begin() de fouten veroorzaakt. De fout post ik hier even niet, het is gewoon een standaard 'has stopped working'-fout. Dan nog even het shaderbestand:
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
| uniform extern float4x4 WVP : WORLDVIEWPROJ; ///////////////////////////////////////////////////////////////////// // Structs struct OutputVS { float4 position : POSITION; }; struct OutputPS { float4 color : COLOR0; }; ///////////////////////////////////////////////////////////////////// // Shaders OutputVS TransformVS(float3 posL : POSITION0) { OutputVS outVS = (OutputVS)0; outVS.position = mul(WVP, float3(1.0f,1.0f,0.0f)); return outVS; } OutputPS TransformPS() { OutputPS outPS = (OutputPS)0; outPS.color = float4(0.0f, 1.0f, 0.0f, 1.0f); // Simpel groen returnen return outPS; } ///////////////////////////////////////////////////////////////////// // Techniques technique testtechnique { pass P0 { VertexShader = compile vs_2_0 TransformVS(); PixelShader = compile ps_2_0 TransformPS(); } } |
Had ook nog de shadercompiler op debug gezet, maar die vond het allemaal wel goed:
C++:
1
2
3
4
5
6
7
| D3DXCreateEffectFromFile(d3ddev,"shaders.fx",0,0,D3DXSHADER_DEBUG,0,&FX,&error); if(error) { MessageBox(hwnd,(char*)error->GetBufferPointer(),"Error",MB_ICONERROR); } else { tech = FX->GetTechniqueByName("testtechnique"); matrix = FX->GetParameterByName(0,"WVP"); } |
Wat dus gaar is, is dat als ik het venster (met de daarop gelockte viewport) niet beweeg, dat alles goedgaat. Pas als ik messages op het programma afgooi (WM_SIZE bijvoorbeeld), loopt 'ie vast.
Erg vervelend natuurlijk, zeker als je niet weet wat je verkeerd doet. Is hier nog iemand die een helder idee heeft?
