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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

29.04.2011, 16:25

OpenGL: Zusammenhang zwischen glCullFace und Beleuchtungs Modell?!

Hi,
Ich habe versucht in meiner Engine das Update auf die Material Einstellungen pro Objekt zu optimieren, in dem diese nicht erneut aufgerufen werden, wenn es sich um die selben Material Einstellungen handelt, wie beim vorherigen Objekt.
Allerdings funktioniert jetzt das Triangle-Culling (glCullFace) nicht mehr richtig. Anscheinend ist das in Anbhängigkeit mit den Positionen der Fixed-Function Lichtquellen.

Meine Material-Setup Funktion sieht wie folgt aus. Welchen Teil davon muss immer aufgerufen werden, damit das mit den Lichtquellen zusammen funktioniert?

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
void OpenGLDriver::setupMaterialStates(const scene::MaterialNode* Object)
{
    const SMaterialStates* Material = &Object->getMaterial();
    
    /* Check for equality to optimize render path */
    if (Material->equalWithLastSettings(LastMaterial_))
    {
        setupShaderTable(Object);
        return;
    }
    else
        LastMaterial_ = Material;
    
    /* Face culling & polygon mode */
    switch (Material->RenderFace)
    {
        case video::FACE_FRONT:
        {
            glEnable(GL_CULL_FACE);
            glCullFace(GL_FRONT);
            glPolygonMode(GL_BACK, GL_POINT + Material->RenderModeFront);
        }
        break;
        
        case video::FACE_BACK:
        {
            glEnable(GL_CULL_FACE);
            glCullFace(GL_BACK);
            glPolygonMode(GL_FRONT, GL_POINT + Material->RenderModeBack);
        }
        break;
        
        case video::FACE_BOTH:
        {
            glDisable(GL_CULL_FACE);
            glPolygonMode(GL_BACK, GL_POINT + Material->RenderModeFront);
            glPolygonMode(GL_FRONT, GL_POINT + Material->RenderModeBack);
        }
        break;
    }
    
    /* Fog effect */
    setGlRenderState(GL_FOG, __isFog && Material->isFog);
    
    /* Color material */
    setGlRenderState(GL_COLOR_MATERIAL, Material->isColorMaterial);
    
    /* Lighting material */
    if (__isLighting && Material->isLighting)
    {
        glEnable(GL_LIGHTING);
        
        /* Shininess */
        glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Material->Shininess);
        
        /* Diffuse color */
        Material->ColorDiffuse.getFloatArray(TempColor_);
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, TempColor_);
        
        /* Ambient color */
        Material->ColorAmbient.getFloatArray(TempColor_);
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, TempColor_);
        
        /* Specular color */
        Material->ColorSpecular.getFloatArray(TempColor_);
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, TempColor_);
        
        /* Emission color */
        Material->ColorEmission.getFloatArray(TempColor_);
        glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, TempColor_);
    }
    else
        glDisable(GL_LIGHTING);
    
    /* Depth function */
    if (Material->isZBuffer)
    {
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GLCompareList[Material->DepthMethod]);
    }
    else
        glDisable(GL_DEPTH_TEST);
    
    /* Blending function */
    if (Material->isBlending)
    {
        glEnable(GL_BLEND);
        glBlendFunc(GLBlendingList[Material->BlendSource], GLBlendingList[Material->BlendTarget]);
    }
    else
        glDisable(GL_BLEND);
    
    /* Polygon offset */
    if (Material->isPolygonOffset)
    {
        glEnable(GL_POLYGON_OFFSET_FILL);
        glPolygonOffset(Material->OffsetFactor, Material->OffsetUnits);
    }
    else
        glDisable(GL_POLYGON_OFFSET_FILL);
    
    /* Alpha function */
    glAlphaFunc(GLCompareList[Material->AlphaMethod], Material->AlphaReference);
    
    /* Shader */
    setupShaderTable(Object);
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (30.04.2011, 14:39)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

29.04.2011, 16:27

Mal ab von der eigentlichen Frage: Liegt da tatsächlich ein messbarer und sinnvoller Performance-Unterschied zu Deiner alten Version?
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

29.04.2011, 16:33

Allerdings funktioniert jetzt das Triangle-Culling (glCullFace) nicht mehr richtig.

Inwiefern!?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

4

29.04.2011, 16:47

Mal ab von der eigentlichen Frage: Liegt da tatsächlich ein messbarer und sinnvoller Performance-Unterschied zu Deiner alten Version?

Natürlich, bis zu 10 FPS konnte ich in einem Test schon messen. Dadruch spart man sich jede Menge wiederholte OpenGL Funktionsaufrufe, bei dem jedes Mal Daten vom RAM in den VRAM kopiert werden.

@dot: das Culling wird umgekehrt. Front culling wird auf einmal zu Back culling. Auch die Beleuchtung richtet sich darauf ein, so als würden die Normalen invertiert werden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

29.04.2011, 16:52

@dot: das Culling wird umgekehrt. Front culling wird auf einmal zu Back culling. Auch die Beleuchtung richtet sich darauf ein, so als würden die Normalen invertiert werden.

Das kann irgendwie nicht sein außer du verwendest irgendwo glFrontFace()!?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

29.04.2011, 16:54

Mal ab von der eigentlichen Frage: Liegt da tatsächlich ein messbarer und sinnvoller Performance-Unterschied zu Deiner alten Version?

Natürlich, bis zu 10 FPS konnte ich in einem Test schon messen.

Und das ist in Relation zu was? Zu 15 FPS? Zu 500 FPS? Und wie genau misst Du das, wenn Du doch Fehler beim Face-Culling hast und somit die Werte gar nicht vergleichbar sind?
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]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

29.04.2011, 16:57

@BlueCobold: Hab in nem Test mit 1000x1000 Teapots (über 22.000.000 Dreiecke) den Render Prozess von 33 FPS auf 43 FPS erhöhen können ;)

@dot: Ich hab die Funktion "glFrontFace" nur an einer Stelle in meiner Renderer Klasse. Wenn ich das auskommentiere hab ich aber immer noch das selbe Problem.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

29.04.2011, 16:59

Also hatte jeder Teapot 20 Polygone und alle das gleiche Material? Dann ist mir das Ergebnis natürlich klar... 1.000.000 weniger Material-Einstellungen im Vergleich zu 22.000.000 Polygonen (1.000.000 Drawcalls oder sogar nur einen?) ist in der Tat ziemlich sicher Performance-schwerwiegend. Allerdings zweifel ich die Aussagekraft dieses Tests für allgemeinen Nutzen an.
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]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

29.04.2011, 17:02

Sry nicht 1000 sondern 100x100 Objekte. Und ja jedes hat ein eigenes Material. Allerdings ist mein Problem das mit dem Culling nicht die Performance ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

29.04.2011, 17:04

Richtig, das ist ein anderes Thema. Ich bin lediglich neugierig. Solche Tests macht ja selten mal jemand. Daher interessiert mich auch wie aussagekräftig und wie effektiv die Optimierung ist.
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]

Werbeanzeige

Ähnliche Themen