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

1

31.07.2010, 19:51

Problem mit Vertexshader

Hi
Ich wollte mal meine objekte ein wenig schattieren und hab dazu versucht mich mal mit shadern auseinanderzusetzen:
VertexShader.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once

#include "Framework.h"

class CVertexShader
{
public:
    CVertexShader();
    virtual ~CVertexShader();

    HRESULT Create(LPDIRECT3DDEVICE9 d3ddevice);
    HRESULT Destroy();

    LPDIRECT3DVERTEXSHADER9 Get();

protected:
    LPDIRECT3DVERTEXSHADER9 m_lpShader;
    TCHAR Filepath[200];

    bool UsingHLSL;
};

VertexShader.cpp

C-/C++-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
#include "Framework.h"

CVertexShader::CVertexShader()
{
    m_lpShader = NULL;
    UsingHLSL = false;
}

HRESULT CVertexShader::Create(LPDIRECT3DDEVICE9 d3ddevice)
{
    ID3DXBuffer* pShaderBuffer;
    ID3DXBuffer* pShaderErrors;

        if(FAILED(D3DXAssembleShaderFromFile("Shader.vsh",NULL,NULL,D3DXSHADER_DEBUG,&pShaderBuffer,&pShaderErrors)))
        {
            MessageBox(NULL,"Fehler beim erstellen des Assembler shaders","Fehler",MB_OK);
        }
        if(FAILED(d3ddevice->CreateVertexShader((DWORD*)pShaderBuffer->GetBufferPointer(),&m_lpShader)))
        {
            MessageBox(NULL,"Fehler beim erstellen des VertexShaders","Fehler",MB_OK);
        }

        if(pShaderBuffer != NULL)
            pShaderBuffer->Release();
        if(pShaderErrors != NULL)
            pShaderErrors->Release();
    return 0;
}

LPDIRECT3DVERTEXSHADER9 CVertexShader::Get()
{
    return m_lpShader;
}

HRESULT CVertexShader::Destroy()
{
    if(m_lpShader != NULL)
    {
        m_lpShader->Release();
        m_lpShader = NULL;
    }
    return 0;
}

CVertexShader::~CVertexShader()
{
    Destroy();
}


und hier der aufruf in der Game.cpp:

C-/C++-Quelltext

1
2
3
4
5
CVertexShader vshader;
...
vshader.Create(cd3d.GetDevice());

    Gehöft->DrawSubset(0);

Aber statt das er das macht was er soll wirft er die Fehlermeldung:
"Fehler beim erstellen des Assembler shaders" aus. Ich dachte zuerst die Datei liegt nicht im richtigen verzeichnis aber des liegt bei der solution -.-

Gruß

Fabian

EDIT:
hab den Shadercode vergessen. Ist Assembler Shader:
Shader.vsh

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vs_1_1

dcl_position v0
dcl_normal v3
dcl_color v5

m4x4 oPos, v0, c0

dp3 r1.x, v3, c4
dp3 r1.y, v3, c5
dp3 r1.z, v3, c6

dp3r1.w, r1, r1
rsq r1.w, r1.w
mul r1, r1, r1.w

mul oD0, v5, -r1.z
Metal ist keine Musik sondern eine Religion.

2

31.07.2010, 20:01

Sehr nützlich wärs, wenn du die pShaderErrors mal auswertest, die du der Funktion übergibst. Und warum schreibst du deinen Shader in Assembler? Es gibt doch extra die HLSL für ?!

3

01.08.2010, 15:02

Irgendwie gibt es immer einen Laufzeitfehler wenn ich versuche pShaderErrors auszuwerten. Und bei HLSL kommt genau der selbe Fehler
Metal ist keine Musik sondern eine Religion.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

4

01.08.2010, 15:29

Dann versuch's doch mal mit dem Debugger...

Zitat

ppErrorMsgs [out]
LPD3DXBUFFER

Returns a buffer containing a listing of errors and warnings that were encountered during the compile. These are the same messages the debugger displays when running in debug mode. This value may be NULL.


Ansonsten könntest du ja mal herausfinden was genau die Funktion zurückliefert (Gibt ja nur 3 Möglichkeiten: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA, E_OUTOFMEMORY)

http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx
Signaturen werden überbewertet

5

01.08.2010, 18:52

Das hier geht aber nicht:

C-/C++-Quelltext

1
2
3
mbstowcs_s(NULL,(wchar_t *)g_tcGeneralTxtBuffer,MAX_PATH,(char*)pShaderErrors->GetBufferPointer(),MAX_PATH);
_stprintf_s(g_tcLogTxtBuffer,TEXT("CVertexShader::Create() D3DXCompileShaderFromFile(%s) failed!-->%s"), m_tcFilepath, g_tcGeneralTxtBuffer);
MessageBox(NULL,g_tcLogTxtBuffer,"Fehler",MB_OK);


Dann kommt der laufzeitfehler und der debugger sagt mir das pShaderErrors = 0x00000000 ist. ALso irgendwie nicht aufgelöst.
Metal ist keine Musik sondern eine Religion.

Werbeanzeige