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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

41

07.02.2012, 16:08

Theoretisch schon.
Aber gerade mit sowas wie EarlyZ entfällt dieser Punkt restlos! (Vorausgestzt man rendert grob sortiert von vorne nach hinten)
Es werden nämlich ebenfalls nur die Polygone gezeichnet, die nacher auch an den Bildschirm kommen.


Genau, das ändert nichts an der Komplexität von Forward-Shading! Es geht immer nur um die sichtbaren Lichter.
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

42

07.02.2012, 18:43

Hier wird ja fleißig Diskutiert :) Aber ich bleibe erstmal bei einem einfachen Multipass oder Forward Renderer. Also das ich alles so oft mal wie Anzahl an sichtbaren Lichtquellen render ;) Ich will ja erstmal sehen wie das alle funktioniert, bevor es in die Engine kommt. Aber danach kommen erstmal Schattenvolumen.
Ich werde mal anfangen zu testen, mit einem, zwei und drei Lichtern und melde mich wenn etwas nicht geht.
Danke an die Bemühung ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

43

08.02.2012, 11:33

Wenn Du wirklich "Schattenvolumen" im Sinne von Shadow Volumes unter Benutzung des Stencil Buffers meinst, dann bist Du eh auf ein Licht pro Renderpass festgelegt. Und hast Dir nebenbei bemerkt eine ziemlich unpraktische Schattentechnik rausgesucht, die weder einfach ist noch schöne Ergebnisse bringt. Shadow Mapping ist in jeder Hinsicht überlegen und Du kannst es in begrenztem Maße sogar für mehrere Lichtquellen pro Pass einsetzen.

Dazu eine Randbemerkungen an "Spiele Programmierer": EarlyZ rettet Dich nur vor einigen Hässlichkeiten des Forward Renderers, vor anderen dagegen nicht. Lies meinen Beitrag davor. Das Zusammenfassen vieler Lichter klappt nur bei sehr gleichförmigen Lichtern ohne Schatten - sobald Schatten, Kegellichter oder exotische Sachen hinzukommen, ist der SinglePass-Ansatz bald am Ende.
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.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

44

10.02.2012, 21:47

Es ist soweit ich komm nicht weiter :/
Ich dachte mir jetzt einfach Shader aktualiesieren und Textur übergeben, und dann Shader Start DrawIndexedPrimitive(...). Das sollte eigentlich gehen. Leider nein -.- Hier der Code:

C-/C++-Quelltext

1
2
3
//Load
D3DXCreateEffectFromFile(Direct3D::Instance().GetDevice(), "Light.fx", 0, 0,
        D3DXFX_NOT_CLONEABLE | D3DXSHADER_NO_PRESHADER, 0, &g_pEffect, NULL);

Render:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
D3D->LightEnable(0, FALSE);

    mWorld = MapHandler->PhysicBodyhandler->GetMatrix(nd);
    D3D.SetTransform(D3DTS_WORLD, mWorld);

    // Licht
    UpdateLight(mWorld,m_pCamera);
door->Render(g_pEffect);
D3D->LightEnable(0, TRUE);

DIe Funktion UpdateLight:

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
bool CGame::UpdateLight(Matrix World, CCamera* cam )
{
    D3DXMATRIX world, view, proj;
    D3DXMATRIX xRot, yRot;
    Matrix worldViewProjectionMatrix;
    Matrix worldInverseTransposeMatrix;

    // Calculate combined world-view-projection matrix.
    worldViewProjectionMatrix = World * cam->GetV() * cam->GetP();

    worldInverseTransposeMatrix = MatrixInvert(World);
    worldInverseTransposeMatrix = MatrixTranspose(worldInverseTransposeMatrix);

    // Set the matrices for the shader.
    g_pEffect->SetMatrix("worldMatrix", (const D3DXMATRIX*)&World);
    g_pEffect->SetMatrix("worldInverseTransposeMatrix", (const D3DXMATRIX*)&worldInverseTransposeMatrix);
    g_pEffect->SetMatrix("worldViewProjectionMatrix", (const D3DXMATRIX*)&worldViewProjectionMatrix);

    // Set the camera position.
    g_pEffect->SetValue("cameraPos", m_pCamera->GetCameraPos(), sizeof(m_pCamera->GetCameraPos()));

    float                        g_sceneAmbient[4] = {0.2f, 0.2f, 0.2f, 1.0f};

    // Set the scene global ambient term.
    g_pEffect->SetValue("globalAmbient", &g_sceneAmbient, sizeof(g_sceneAmbient));

    // Set the lighting parameters for the shader.
    g_pEffect->SetValue("light.dir", Vector3(0,0,1), sizeof(Vector3(0,0,1)));
    g_pEffect->SetValue("light.pos", m_pCamera->GetCameraPos(), sizeof(m_pCamera->GetCameraPos()));
    g_pEffect->SetValue("light.ambient", Vector3(1.0f, 1.0f, 1.0f), sizeof(Vector3(1.0f, 1.0f, 1.0f)));
    g_pEffect->SetValue("light.diffuse", Vector3(1.0f, 1.0f, 1.0f), sizeof(Vector3(1.0f, 1.0f, 1.0f)));
    g_pEffect->SetValue("light.specular", Vector3(1.0f, 1.0f, 1.0f ), sizeof(Vector3( 1.0f, 1.0f, 1.0f )));
    g_pEffect->SetFloat("light.spotInnerCone", D3DXToRadian(20.0f));
    g_pEffect->SetFloat("light.spotOuterCone", D3DXToRadian(30.0f));
    g_pEffect->SetFloat("light.radius", 10.0f);

    // Set the material parameters for the shader.
    g_pEffect->SetValue("material.ambient", Vector3( 0.19225f, 0.19225f, 0.19225f), sizeof(Vector3( 0.19225f, 0.19225f, 0.19225f)));
    g_pEffect->SetValue("material.diffuse", Vector3(0.50754f, 0.50754f, 0.50754f), sizeof(Vector3(0.50754f, 0.50754f, 0.50754f)));
    g_pEffect->SetValue("material.emissive", Vector3( 0.0f, 0.0f, 0.0f), sizeof(Vector3( 0.0f, 0.0f, 0.0f)));
    g_pEffect->SetValue("material.specular", Vector3(0.508273f, 0.508273f, 0.508273f), sizeof(Vector3(0.508273f, 0.508273f, 0.508273f)));
    g_pEffect->SetFloat("material.shininess",  51.2f);

    // Bind the textures to the shader.
    g_pEffect->SetTexture("colorMapTexture", door->m_pEffects->apTexture[0]);

    return true;
}

Und als letztes noch die Funktion door->Render(...)

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
void Model::Render(ID3DXEffect* RenderEffect)
{
    DWORD   dwOldFVF;
    // Altes Vertexformat speichern
    Direct3D& D3D = Direct3D::Instance( );
    dwOldFVF = D3D.GetFVF( );

    // Vertexformat sowie Vertex- und Index-Buffer setzen
    D3D.SetFVF( m_dwFVF );
    D3D->SetStreamSource( 0, m_pVertexBuffer->GetVB( ), 0, m_pVertexBuffer->GetVertexSize( ) );
    D3D->SetIndices( m_pIndexBuffer->GetIB( ) );

    D3DMATERIAL9    Material;
        Material.Diffuse    = Color(0.75f, 0.75f, 0.75f);
    Material.Ambient    = Color(0.25f, 0.25f, 0.25f);
    Material.Emissive   = Color(0.0f, 0.0f, 0.0f);
    Material.Power = 10;
    D3D->SetMaterial(&Material);
    D3D->SetTexture(0,m_pEffects[0].apTexture[0]);
    RenderEffect->GetTexture(0,&m_pEffects[0].apTexture[0]);
    D3D->SetTexture(0,m_pEffects[0].apTexture[0]);
                D3D->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
                D3D->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT);
                D3D->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
                D3D->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); // just use alpha from stage 0
                D3D->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
D3D->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
                // Rendern
    static UINT totalPasses;
    static D3DXHANDLE hTechnique;
    hTechnique = RenderEffect->GetTechniqueByName("PerPixelSpotLighting");
    // Render the cube.
    if (SUCCEEDED(RenderEffect->SetTechnique(hTechnique)))
    {
        if (SUCCEEDED(RenderEffect->Begin(&totalPasses, 0)))
        {
            for (UINT pass = 0; pass < totalPasses; ++pass)
            {
                if (SUCCEEDED(RenderEffect->BeginPass(pass)))
                {
                   D3D->DrawIndexedPrimitive( m_pEffects[0].Header.PrimitiveType, 
                                                    0, 
                                                    m_pEffects[0].Header.dwMinIndex, 
                                                    m_pEffects[0].Header.dwNumVertices, 
                                                    m_pEffects[0].Header.dwStartIndex, 
                                                    m_pEffects[0].Header.dwNumPrimitives );
                   Beep(200,10);
                    RenderEffect->EndPass();
                }
            }

            RenderEffect->End();
        }
    }

    // Capture aufrufen, um die Tabellen in Direct3D zu aktualisieren
    D3D.Capture( );

    // Das alte Vertexformat wieder setzen
    D3D.SetFVF( dwOldFVF );
}

Das Problem ist das nichts angezeigt wird. Also die Tür wird einfach nicht gerendert. Debugger sagt nichts.
Wenn ich alles ohne Effekt render ist die Tür schwarz, wie erwartet.
Ich wäre echt froh wenn jemand den Code durchließt. Wenn ich den Perpixel Light hinbekommen habe dann nehme ich erstmal Urlaub :thumbsup:

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

45

11.02.2012, 12:47

Hat wirklich keiner eine Idee? Ich bin echt verzweifelt habe die ganze Nacht durchprobiert ohne Erfolg.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

46

11.02.2012, 13:01

Schaus dir doch einfach mal in Pix an.
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

47

11.02.2012, 15:13

Pix?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

49

11.02.2012, 18:24

Also um den Fehler zu finden richtig? Ich glaube das es einfach an einer blend Einstellung liegt aber nein anscheinend nicht :( Ich werde pix austesten und dann nochmal bescheid sagen. Aber wer den Fehler findet immer gerne schreiben :) danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

50

11.02.2012, 20:19

So ich habe jetzt Pix benutzt. Und da wo meine Tür gerendert wird sind auch einträge aber ob das Fehler sind weiß ich nicht. Ich hgebe mal ein paar Bilder dazu :) Der Rot makierte bereich ist da wo der Shader die Daten bekommt der Rest ist glaube ich selbst erklärend. Das Mesh (rechts) stimmt. So sieht meine Tür aus. Allerdings erscheint nichts auf dem Bildschirm :cursing:
Danke für jegliche Hilfe :)
PS Ist es schlimm das ich auf einem anderen PC mit Vista bin? Ich glaube nicht. Jedenfalls die Daten sind Identisch also alles ist wie auf mein Schrumpel XP :P
EDIT: Noch ein Bild wo ich auf die Tür gucke. Laut Pix sollte man die Tür sehen sie ist ja im Viewport drinne. Und dann noch eins mit dem Renderbild. Genau geradeaus sollte die Tür sein.
»FSA« hat folgende Bilder angehängt:
  • Aufzeichnen.JPG
  • Aufzeichnen.JPG
  • Aufzeichnen.JPG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »FSA« (11.02.2012, 21:06)


Werbeanzeige

Ähnliche Themen