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

11.12.2010, 23:53

Mesh wir beim erstellen eines Vertex Shaders nicht mehr angezeigt[gelöst]

Hi
Ich versuche schon seit einiger Zeit mich in Shader richtig einzuarbeiten. Ich versuche im Moment einen Licht Shader auf den einfachen "Teapot" aus dem DirectX SDK anzuwenden. Es wird aber nur der geleerte Bildschirm angezeigt.
Hier erstmal der Shadercode:

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
struct VS_INPUT
{
    float4 PositionIn : POSITION;
    float3 NormalIn   : NORMAL;
    float4 DiffuseIn  : COLOR0;
};

struct VS_OUTPUT
{
    float4 PositionOut : POSITION;
    float4 DiffuseOut   : COLOR0;
};

float4x4 ShaderMatrix : register(c0);
float4x4 WorldMatrix : register(c4);
float4   DiffuseLightColor : register(c10);
float4   LightDirection : register(c12);

VS_OUTPUT main(const VS_INPUT VertexIn)
{
    VS_OUTPUT VertexOut;
    float3 transformedNormal = normalize(mul(VertexIn.NormalIn,WorldMatrix));
    float dp = dot(transformedNormal, -LightDirection);
    if(dp < 0.0f)
        dp = 0.0f;
    float4 diffuse = mul(dp, VertexIn.DiffuseIn);
    VertexOut.DiffuseOut = diffuse * DiffuseLightColor;
    VertexOut.PositionOut = mul(VertexIn.PositionIn, ShaderMatrix);
    
    return VertexOut;
}

Die Game.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
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
#include "Framework.h"

CGame::CGame()
{
    Trans = D3DXVECTOR3(0.0f,0.0f,0.0f);
}
HRESULT CGame::Load()
{
    LPD3DXBUFFER pMtrlBuffer;

    if(FAILED(D3DXCreateTeapot(framework.init.GetDevice(),&Player,&pMtrlBuffer)))
    {
        framework.log.WriteToLog("Fehler beim Laden des Mesh:");
    }

    framework.vshader[0].Create(framework.init.GetDevice(), TEXT("Diff_DirLight.hlsl"));

    framework.DirLight.SetAmbientColor(D3DXCOLOR(1.0f,0.0f,0.0f,0.0f));
    framework.DirLight.SetDiffuseColor(D3DXCOLOR(1.0f,0.0f,0.0f,0.0f));
    framework.DirLight.SetSpecularColor(D3DXCOLOR(1.0f,0.0f,0.0f,0.0f), 10.0f);

    return 0;
}

CGame::~CGame()
{
    SAFE_RELEASE(Player);
}

HRESULT CGame::Move(float Secs)
{
    return 0;
}
HRESULT CGame::Render(float Secs)
{
    D3DXMATRIX ProjectionMatrix;
    D3DXMATRIX TranslationMatrix;
    D3DXMATRIX WorldMatrix;
    D3DXMATRIX Rotation;
    D3DXMATRIX Cam;

    D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, D3DXToRadian(60.f),1.f,1.f,100.f); 

    D3DXMatrixTranslation(&TranslationMatrix,Trans.x,Trans.y,Trans.z);
    D3DXMatrixRotationX(&Rotation,0.0f);

    WorldMatrix = TranslationMatrix*Rotation;

    D3DXMatrixLookAtLH(&Cam, 
                       &D3DXVECTOR3(0.0f,0.0f,-8.0f),
                       &D3DXVECTOR3(0.0f,0.0f,1.0f),
                       &D3DXVECTOR3(0.0f,1.0f,0.0f));

    framework.init.GetDevice()->SetTransform(D3DTS_VIEW, &Cam); 
    framework.init.GetDevice()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);
    framework.init.GetDevice()->SetTransform(D3DTS_WORLD, &WorldMatrix);

    //Gesamtmatrix fuer den Shader berechnen
    D3DXMATRIX ShaderMatrix =  WorldMatrix * Cam;

    //und diese transponieren.
    D3DXMatrixTranspose(&ShaderMatrix, &ShaderMatrix);

    //uebergeben der Konstanten an den Shader
    framework.init.GetDevice()->SetVertexShaderConstantF( 0, (float*)&ShaderMatrix, 4 );
    D3DXMATRIX TransposedWorldMatrix;
    D3DXMatrixTranspose(&TransposedWorldMatrix, &WorldMatrix);
    framework.init.GetDevice()->SetVertexShaderConstantF( 4, (float*)&TransposedWorldMatrix, 4 );



    framework.dxFuncs.BeginRendering(framework.init.GetDevice(),0xFF00FF00);

    //Bewegen der Lichtrichtung
    D3DXVECTOR3 LightDirection = D3DXVECTOR3(0.0f,0.0f,0.0f);
    //Normalisieren fuer den Shader
    D3DXVec3Normalize(&LightDirection,&LightDirection);
    //uebergeben an die Lichtquelle
    framework.DirLight.SetDirection(LightDirection);

    //Nun das Licht einschalten
    framework.Lighting.TurnLightOn(framework.init.GetDevice(),&framework.DirLight);

    framework.init.GetDevice()->SetFVF(UT_FVF);
    
    framework.init.GetDevice()->SetVertexShader(framework.vshader[0].Get());
    Player->DrawSubset(0);

    framework.dxFuncs.EndRendering(framework.init.GetDevice());

    return 0;
}

Und zu guter Letzt noch die 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
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
CVertexShader::CVertexShader()
{

    m_lpShader = NULL;
    m_bUsingHLSL = false;

}

HRESULT CVertexShader::Create(LPDIRECT3DDEVICE9 lpD3DDevice, PTCHAR ptcFilename)
{
    ID3DXBuffer* pShaderBuffer = NULL;
    ID3DXBuffer* pShaderErrors = NULL;

    //Den Pfad mit der Datei verbinden
    _stprintf_s(m_tcFilepath,TEXT("%s"),ptcFilename);
    //Lnge bis zur Datei extension
    int iToExt = int(_tcslen(ptcFilename))-4;
    //Vergleichen ob extension = "hlsl" 
    int iComp = _tcscmp(ptcFilename+iToExt,TEXT("hlsl"));
    if(iComp == 0)  //wenn ja, dann HLSL
        m_bUsingHLSL = true;
    else            //ansonsten Assembler Shader
        m_bUsingHLSL = false;

    if(m_bUsingHLSL)
    {
        LPCSTR prof = framework.init.VertexShaderVersion;
        //Kompilieren des HLSL Shader
        if (FAILED(D3DXCompileShaderFromFile(m_tcFilepath, NULL, NULL, "main", prof, D3DXSHADER_DEBUG|D3DXSHADER_SKIPOPTIMIZATION, &pShaderBuffer, &pShaderErrors, NULL)))
        {
            framework.log.WriteToLog(TEXT("Fehler beim erstellen des HLSL Shaders!"));
            return 1;
        }
    }
    else
    {
        //Assemblen des Assembler Shader
        if (FAILED(D3DXAssembleShaderFromFile(m_tcFilepath, NULL, NULL, D3DXSHADER_DEBUG, &pShaderBuffer, &pShaderErrors)))
        {
            framework.log.WriteToLog(TEXT("Fehler beim erstellen des Assembler Shaders!"));
            return 1;
        }
    }
    //Vertex Shader erstellen
    if (FAILED(lpD3DDevice->CreateVertexShader((DWORD *)pShaderBuffer->GetBufferPointer(),
                                   &m_lpShader)))
    {
        framework.log.WriteToLog(TEXT("Fehler beim laden des Shaders!"));
        return E_FAIL;
    }

    //Puffer freigeben
    if(pShaderBuffer != NULL)
    {
        pShaderBuffer->Release();
        pShaderBuffer = NULL;
    }
    if(pShaderErrors != NULL)
    {
        pShaderErrors->Release();
        pShaderErrors = NULL;
    }

    return 0;
}


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


HRESULT CVertexShader::Destroy()
{
    //Shader freigeben
    if(m_lpShader != NULL)
    {
        m_lpShader->Release();
        m_lpShader = NULL;
    }

    return S_OK;
}

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

Ich hoffe das reicht an Code.
Ich hab wirklich keine Ahnung wo der Fehler liegt -.-. Der Debugger gibt keine Fehlerhaften Werte aus und der Log sagt auch nichts. Interessant ist aber das der Teapot angezeigt wird wenn ich die Zeile "framework.init.GetDevice()->SetVertexShader(framework.vshader[0].Get());" auskommentiere.
Ich hoffe ihr könnt mir weiterhelfen.

mfg
Metal ist keine Musik sondern eine Religion.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Fabian Kock« (13.12.2011, 21:23)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.12.2010, 09:29

Mit welcher Farbe löscht du deinen BackBuffer? Deine DiffuseLightColor und LightDirection sind beide 0 weswegen dein VertexShader immer schwarz als Farbe ausgeben wird. Wenn deine Clear Color auch schwarz ist dann ist klar dass du das Model nicht sehen wirst...

3

12.12.2010, 09:47

Nein meine Clearcolor hab ich extra auf grün gesetzt damit ich das objekt sehe.
Metal ist keine Musik sondern eine Religion.

4

12.12.2010, 09:53

Sehe ich das richtig, das in die Shadermatrix dann garkeine Projektion einfließt?

//Gesamtmatrix fuer den Shader berechnen
D3DXMATRIX ShaderMatrix = WorldMatrix * Cam;

Da müsste doch eigentlich noch ein * Projection hin.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

12.12.2010, 09:53

Wenn du deine Position im VertexShader Transformierst, dann fehlt da noch die Projektionsmatrix. Wenn ich das richtig verstehe dann übergibst du an ShaderMatrix nur World * Cam. Dann siehst du logischerweise nichts.

6

12.12.2010, 10:01

Ja gut :D jetzt sehe ich den Teapot aber warum ist er schwarz? Ich übergebe Direction ja 0 weil das Licht zum Nullpunkt zeigen soll weil dort mein Teapot steht.
@dot: Wo setze ich denn DiffuseLightColor auf 0?
Metal ist keine Musik sondern eine Religion.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

12.12.2010, 10:09

Oh das mit der Projektion hab ich natürlich übersehen. Dass es schwarz ist ist doch klar, Deine DiffuseLightColor und Direction sind beide 0 weil du sie nirgendwo setzt (zumindest seh ich da oben grad nicht wo du das tun würdest). Direction ist die Richtung in die das Licht zeigt und nicht der Punkt wo es hinzeigen soll...

8

12.12.2010, 10:14

hier setzte ich doch meine DiffuseLightColor auf r = 1.0f
framework.DirLight.SetDiffuseColor(D3DXCOLOR(1.0f,0.0f,0.0f,0.0f));
und welchen Wert könnte ich für Direction verwenden?
Metal ist keine Musik sondern eine Religion.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

12.12.2010, 10:53

hier setzte ich doch meine DiffuseLightColor auf r = 1.0f
framework.DirLight.SetDiffuseColor(D3DXCOLOR(1.0f,0.0f,0.0f,0.0f));

Oh ok.

und welchen Wert könnte ich für Direction verwenden?

Naja, einen Richtungsvektor der in die Richtung zeigt in die dein Licht scheinen soll eben!?

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

10

12.12.2010, 11:04

Direction zeigt nicht an den Ort, wo es hinscheinen soll, sondern die richtung, also einen vektor != 0 angeben.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige