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

14.05.2011, 17:09

Shaders nutzen

Hallo Freunde.
Ich hab jetzt ein kleines Spiel programmiert.

Was ich habe in C++ Visual Studio:
Klasse GROUND
Klasse CUBE

Ich habe eine einfache Grundfläche und zwei Würfel erzeugt.
Die Klassen Grund(.h/.cpp) und Cube(.h/.cpp) sind nur rein für berechnungen zuständig und Informationen über die Position und Größe der Objekte, keinerlei OpenGL-Zeug.
Die Zeichnung der der Grundfläche und der Würfel erfolgt in der Main in der display()-Funktion.

Hier meine Kernfrage:
Wie kann ich die Grundfläche und die Würfel als Shader-Objekte nutzen?
Müssen dann auch die Klassen Methoden haben, die die Objekte zeichnen, oder kann das in der Main bleiben?


Vielen Dank Freunde für eure Antworten..

Ground.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef __GROUND_H__
#define __GROUND_H__

class Ground{
private:
    double size;

public:
    // the constructor
    Ground(double size);

    // setter
    void setSize(double size);

    // getter
    double getSize();
};

#endif



Cube.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
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
#ifndef __CUBE_H__
#define __CUBE_H__

class Cube{
private:
    double size;
    double stepsX;
    double stepsZ;
    double x;
    double y;
    double z;
    int collisionX;
    int collisionZ;

public:
    // the constructor
    Cube(double size);

    // class methods
    void move();
    void changeDirectionX();
    void changeDirectionZ();
    bool touches(Cube* that);
    bool notTouches(Cube* that);
    bool isLeftOf(Cube* that);
    bool isAbove(Cube* that);

    // setter
    void setSize(double size);
    void setStepsX(double stepsX);
    void setStepsZ(double stepsZ);
    void setX(double x);
    void setY(double y);
    void setZ(double z);
    void setCollisionX(int collisionX);
    void setCollisionZ(int collisionZ);

    // getter
    double getSize();
    double getStepsX();
    double getStepsZ();
    double getX();
    double getY();
    double getZ();
    int getCollisionX();
    int getCollisionZ();

};

#endif



Einen Würfel zeichne ich z.B. so hier:

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
void cube (Cube* cub, GLuint texture) {
    glBindTexture( GL_TEXTURE_2D, texture ); //bind our texture
    glRotatef( angle, 1.0f, 1.0f, 1.0f );

    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX(), 0.0, cub->getZ());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX(), cub->getSize(), cub->getZ());
    glEnd ();

    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX(), 0.0, cub->getZ());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX(), cub->getSize(), cub->getZ()-cub->getSize());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX(), cub->getSize(), cub->getZ());
    glEnd ();
    
    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ()-cub->getSize());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX(), cub->getSize(), cub->getZ()-cub->getSize());
    glEnd ();

    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ());
    glEnd ();

    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX(), 0.0, cub->getZ());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ()-cub->getSize());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), 0.0, cub->getZ());
    glEnd ();

    glBegin (GL_QUADS);
        glTexCoord3f (0.0, 0.0, 0.0);       glVertex3f (cub->getX(), cub->getSize(), cub->getZ());
        glTexCoord3f (-1.0, 0.0, 0.0);      glVertex3f (cub->getX(), cub->getSize(), cub->getZ()-cub->getSize());
        glTexCoord3f (-1.0, +1.0, 0.0);     glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ()-cub->getSize());
        glTexCoord3f (0.0, +1.0, 0.0);      glVertex3f (cub->getX()-cub->getSize(), cub->getSize(), cub->getZ());
    glEnd ();
}
»glor361« hat folgendes Bild angehängt:
  • ground_cube_opengl.jpg

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »glor361« (14.05.2011, 18:38)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.05.2011, 18:35

Ich versteh dein Problem nicht ganz? Wenn du deine Objekte mit Shadern rendern willst dann musst du eben beim Rendern Shader verwenden!?

3

14.05.2011, 18:41

Das Rendern habe ich auch in meiner Main-Datei gemacht.
Aber kann ich denn meine Klassen beibehalten und die Renderfunktion auch mit in die Klasse einbinden mit Shadern?
Geht das?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

14.05.2011, 18:49

Öhm, ja, warum so das nicht gehn? Mir ist nicht wirklich klar wo genau jetzt dein Problem liegt^^

5

14.05.2011, 18:52

Ich weiß einfach nicht anzufangen, wenn ich meine vorhandenen Klassen als Shader Objekte nutzen möchte!
Wenn ich z.B. habe:

C-/C++-Quelltext

1
myVertexShader->load("simple.vert");


muss dann meine klasse in simple.vert stehen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.05.2011, 18:56

Ist dir eigentlich grundsätzlich klar wie Shader funktionieren!?

7

14.05.2011, 18:58

nicht wirklich!
ich hab noch nicht das prinzip verstanden. denn wenn ich mir eine klasse definieren kann und auch dies als solchen machen kann!

aber wenn man keine klassen schreiben kann, kann man wohl shaders machen und z.B. eine Collision-Detection reinproggen!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

14.05.2011, 19:04

Na dann beschäftige dich erstmal mit Shadern. Wenn du noch keine Ahnung hast wie Shader funktionieren ist jede weitere Diskussion hier doch sinnlos!? Ein entsprechendes Tutorial findest du z.B. hier. Ich bin mir sicher dass sich deine Fragen dann auch erübrigen werden...

9

14.05.2011, 19:27

danke für den tipp mit dem tutorial.

aber noch ne frage:
ich müsste ja meine ganze klasse umschreiben in diese GLSL sprache. und auch die collision-detection müsst ich da drin machen.
gibt es denn einen weg, wo ich meine cpp-Klassen beibehalte und zusätzlich halt für die shaders was coden muss?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

14.05.2011, 19:39

Du hast einfach eine vollkommen falsche Vorstellung davon was Shader sind. Beschäftige dich mit Shadern, dann wirst du sehen dass deine Fragen jeglicher Grundlage entbehren...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (14.05.2011, 19:48)


Werbeanzeige

Ähnliche Themen