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

Anonymous

unregistriert

1

02.05.2005, 12:15

Problem mit AlphaBlending in C#

Hi!

Ich ackere auch gerade das Buch durch und setzte die Beispiele dabei in C# um, das heisst, in verwende Managed DirectX. Bisher hat immer alles absolut tadellos funktioniert.
Aber bei AlphaBlending komme ich nicht weiter (wobei ich davon ausgehe, daß es nicht mit C# oder .Net zu tun hat): Das Problem ist: Es wird ein nicht "ge-alpha-t". Ich bin am den Planet-Beispiel und alles funktioniert - außer, daß meine Planeten nicht durchsichtig werden, sondern solid bleiben. Ich habe praktisch 2 Wochen rumprobiert und an allen möglich Werten gedreht - hat jemand einen Verdacht, was da los sein könnte?

(Der mitgelieferte Beispiel funktioniert, also liegt es wohl auch nicht an der Grafikkarte).

Ciao und Danke,
Wolfram

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

02.05.2005, 17:05

ohne code wird es ganz schwer dir zu helfen. poste doch einfach mal die interessanten stellen...

Anonymous

unregistriert

3

02.05.2005, 17:11

Wo liegen die Vorteile von C# im Gegensatz zu C++??

(Hat zwar nichts mit dem Eigentlichen Post zu tun, würd mich aber mal interessieren...)

Anonymous

unregistriert

4

02.05.2005, 17:16

C# Vorteile

Die größten Vorteile von C# und besonders Managed DirectX:

- Managed, das heisst, man braucht sich um die Speicherverwaltung genau gar nicht zu kümmern.
- MDX ist sehr, sehr sauber durchgetypt, es gibt für alles Enumerationen und man bewegt sich immer Typsicher. Das heisst, man kann praktisch kaum Fehler machen, was die Verwendung von Variablen-Typen abgeht. Das wird alles beim Compilieren schon aufgedeckt.
- Insgesamt fühle ich mich da sehr wohl, in C# programmiert sich streckenweise praktisch von selber.

Ich will aber auch Nachteile nicht verschweigen:
- Managed DX ist 5% langsamer (die ist mir das aber Wert)
- .. ähm.. ja, mehr fällt mir auch schon gar nicht mehr ein :-)

Anonymous

unregistriert

5

02.05.2005, 17:22

Die spannenden Stellen

Tja, was sind jetzt die spannenden Stellen? Nachdem ich schon quasi an allen gedreht habe, finde ich fast alles spannend. Aber versuchen wir es mal mit diesen Teilen:

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
        public override void SetRenderStates()
        {
            gD3DDevice.RenderState.DitherEnable = true;
            gD3DDevice.RenderState.ZBufferEnable = false; //ZBuffer hier ausschalten!


            // Bilineare Texturfilter mit linearem MIP-Mapping

            gD3DDevice.SamplerState[0].MinFilter = TextureFilter.Linear;
            gD3DDevice.SamplerState[0].MagFilter = TextureFilter.Linear;
            gD3DDevice.SamplerState[0].MipFilter = TextureFilter.Linear;

            // Direct3D soll den Alphakanal der Texturen und den Alphawert der Streufarbe verwenden.

            gD3DDevice.TextureState[0].AlphaOperation = TextureOperation.Modulate;
            gD3DDevice.TextureState[0].AlphaArgument1 = TextureArgument.Current;
            gD3DDevice.TextureState[0].AlphaArgument2 = TextureArgument.TextureColor;
        }


        public override void Render(float fNumSecsPassed)
        {           
            Matrix mCamera;
            Light PointLight;

            // Zeichnen

            try
            {
                // NUR!! Bildpuffer leeren und Szene beginnen

                gD3DDevice.Clear(ClearFlags.Target,
                    Color.Black.ToArgb(),
                    1.0f,
                    0);

                gD3DDevice.BeginScene();

                // Die Kamera schaut schräg von oben auf das Geschehen.

                mCamera = my3DHelpers.tbMatrixCamera(
                    gvCamera,                           // Position

                    new Vector3(0.0f, 0.0f, 0.0f),      // Blickrichtung

                    new Vector3(0.0f, 1.0f, 0.0f));     // Oben ist oben

                gD3DDevice.SetTransform(TransformType.View, mCamera);

                // Das Sternenfeld zeichnen. Dazu muss die Beleuchtung ausgeschaltet werden.

                // Alpha-Blending können wir auch nicht brauchen und erst recht keine Textur.

                gD3DDevice.RenderState.Lighting=false;
                gD3DDevice.RenderState.AlphaBlendEnable=false;

                gD3DDevice.SetTexture(0, null);

                gD3DDevice.SetTransform(TransformType.World, Matrix.Identity);
                gD3DDevice.VertexFormat = CustomVertex.PositionColored.Format;
                gD3DDevice.DrawUserPrimitives(
                    PrimitiveType.PointList,
                    gNumStars,
                    gStars);


                // Beleuchtung wieder einschalten und Punktlicht setzen

                gD3DDevice.RenderState.Lighting=true;

                // Da in der Methode "Move" das Planeten-Array immer neu gemacht wird,

                // ist hier Planet 0 immer die Sonne!

                // Das Punktlicht wird nun erstellt. Es ist genau in der Mitte.

                PointLight = new Light();
                PointLight.Type         = LightType.Point;              // Punktlicht

                PointLight.Diffuse      = my3DHelpers.floats2Color(1.0f, 1.0f, 0.75f);  // Gelbe Streufarbe

                PointLight.Ambient      = my3DHelpers.floats2Color(1.0f, 1.0f, 0.75f);  // Gelbe Hintergrundfarbe

                PointLight.Position     = gPlanets[0].vPosition;        // Die Position der Sonne

                PointLight.Range        = 1000.0f;                      // 1000 Einheiten Reichweite

                PointLight.Attenuation0 = 1.0f;                         // Lichtabschwächung

                PointLight.Attenuation1 = 0.0f;                         // ...

                PointLight.Attenuation2 = 0.0f;                         // ...


                // Licht einsetzen und aktivieren

                my3DHelpers.SetLight(gD3DDevice,0,PointLight);
                gD3DDevice.Lights[0].Enabled=true;

                // Renderstates für Alpha-Blending

                gD3DDevice.RenderState.AlphaBlendEnable = true;
                gD3DDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
                gD3DDevice.RenderState.AlphaDestinationBlend = Blend.InvSourceAlpha;

                // Die Planeten nach ihrer Entfernung sortieren

                Array.Sort(gPlanets);

                // Die Planeten zeichnen

                for(int iPlanet = 0; iPlanet < 6; iPlanet++)
                {
                    if(gPlanets[iPlanet].iType == 0)
                        RenderSun(iPlanet); // Es ist die Sonne

                    else
                        RenderPlanet(iPlanet); // Es ist ein normaler Planet.

                }

                // Szene beenden

                gD3DDevice.EndScene();

                // Der große Moment: den Bildpuffer sichtbar machen

                gD3DDevice.Present();
            }
            catch (DirectXException exp)
            {
                MessageBox.Show(exp.ErrorString);
            }


        private void RenderPlanet(int iPlanet)
        {
            Matrix mWorld;
            // Mit einer Matrix wird der Planet an seine Position gebracht und nebenbei noch

            // ein wenig rotiert. Zuerst skalieren wir ihn auf seine angegebene Größe.

            mWorld = 
                Matrix.Scaling(my3DHelpers.tbVector3SameXYZ(gPlanets[iPlanet].fRadius)) *
                Matrix.RotationAxis(Vector3.Normalize(new Vector3(0.5f, 1.0f, 0.25f)), gfTime) *
                Matrix.Translation(gPlanets[iPlanet].vPosition);
            gD3DDevice.SetTransform(TransformType.World, mWorld);
    
            // Das Material für diesen Planet erstellen. Die Glanzfarbe wird vernachlässigt,

            // da die Glanzberechnung deaktiviert ist.

            Material mat = new Material();
            mat.Diffuse     = my3DHelpers.floats2Color(1.0f, 1.0f, 1.0f);       // Weiße Streufarbe

            mat.Ambient     = my3DHelpers.floats2Color(0.25f, 0.25f, 0.25f);    // Dunkelgraue Hintergrundfarbe

            mat.Emissive    = my3DHelpers.floats2Color(0.0f, 0.0f, 0.0f);       // Keine Eigenfarbe

    
            // Das Material einsetzen

            gD3DDevice.Material=mat;
    
            // Textur setzen

            gD3DDevice.SetTexture(0, gPlanets[iPlanet].texture);
    
            // Den Planet zuerst von der Rückseite zeichnen, danach von der Vorderseite

            gD3DDevice.RenderState.CullMode = Cull.Clockwise;
            gPlanetModel.DrawSubset(0);
            gD3DDevice.RenderState.CullMode = Cull.CounterClockwise;
            gPlanetModel.DrawSubset(0);
        }



Irgendwo muss ich hier was grundsätzliches vergessen...

Werbeanzeige