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

11

14.10.2016, 16:52

Habe jetzt den Shaderquellcode in 2 Dateien ausgelagert und bekomme nun einen Syntaxerror beim compilieren der Vertexshaders.

0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"

**** --> Ohne diesen Zeilen tritt der Fehler auch auf.

FragmentShadercode laden:

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
                 case GL_VERTEX_SHADER:     // file ist vertexshader
        {
            std::ifstream file(shaderfile);
            if (!file.good())
            {
                std::cerr << "ERROR: can't open the vertexshaderfile\n";
                exit(-500);
            }
            file.seekg(0, file.end);
            _vertexfilesize = file.tellg();
            file.seekg(0, file.beg);
            _vertexfilesize++;                                    // ****
            _vertexshadercode = new (char[_vertexfilesize]);
            /*if (!_vertexshadercode)
            {
                std::cerr << "ERROR: can't allocate vertexshaderdatamemory\n";
                exit(-501);
            }*/
                        file.read(_vertexshadercode, _vertexfilesize);
            file.close();
            _vertexshadercode[_vertexfilesize - 1] = '\0';        // ****
            _ok = true;

/*          _vertexfilesize = 1024;
            _vertexshadercode = new GLchar[_vertexfilesize];
            _vertexshadercode =
                "#version 330\n"

                "layout(location = 0) in vec3 in_position;\n"
                "layout(location = 1) in vec3 in_color;\n"
                "layout(location = 2) in vec2 in_tex0;\n"

                "uniform mat4 model;\n"
                "uniform mat4 view;\n"
                "uniform mat4 proj;\n"

                "out vec4 color;\n"
                "out vec2 texcol0;\n"

                "void main()\n"
                "{\n"
                "   gl_Position = model * proj * view * vec4(in_position, 1.0);\n"
                "   color = vec4(in_color, 1.0);\n"
                "   texcol0 = in_tex0;\n"
                "}\n";
                _ok = true;
*/
        }
        break;
        case GL_FRAGMENT_SHADER:        // file ist vertexshader
        {
            std::ifstream file(shaderfile);
            if (!file.good())
            {
                std::cerr << "ERROR: can't open the fragmentshaderfile\n";
                exit(-500);
            }
            file.seekg(0, file.end);
            _fragmentfilesize = file.tellg();
            file.seekg(0, file.beg);
            _fragmentfilesize++;
            _fragmentshadercode = new (GLchar[_fragmentfilesize]);
            /*if (!_fragmentshadercode)
            {
                std::cerr << "ERROR: can't allocate fragmentshaderdatamemory\n";
                exit(-501);
            }*/
            _fragmentshadercode[_fragmentfilesize] = '\0';
                        file.read(_fragmentshadercode, _fragmentfilesize);
            file.close();
            _ok = true;

/*          _fragmentfilesize = 1024;
            _fragmentshadercode = new GLchar[_fragmentfilesize];
            _fragmentshadercode =
                "#version 330\n"

                "out vec4 out_color;\n"
                "in vec4 color;\n"
                "in vec2 texcol0;\n"

                "uniform sampler2D tex0;\n"

                "void main()\n"
                "{\n"
                "   out_color = texture(tex0, texcol0)  * vec4(0.7, 0.7, 1.0, 1.0);// * color;\n"
                "}\n";

            _ok = true;*/


Vertexshaderdatei:

C-/C++-Quelltext

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

layout(location = 0) in vec3 in_position;
layout(location = 1) in vec3 in_color;
layout(location = 2) in vec2 in_tex0;

uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

out vec4 color;
out vec2 texcol0;

void main()
{
    gl_Position = model * proj * view * vec4(in_position, 1.0);
    color = vec4(in_color, 1.0);
    texcol0 = in_tex0;
}


Fragmentshaderdatei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#version 330

out vec4 out_color;
in vec4 color;
in vec2 texcol0;

uniform sampler2D tex0;

void main()
{
    out_color = texture(tex0, texcol0)  * vec4(0.7, 0.7, 1.0, 1.0);
};

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sIR_pAPILEIN« (14.10.2016, 18:41)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

14.10.2016, 17:12

Vielleicht habe ich was übersehen, aber ich sehe nicht, wo du die Shader-Datei liest. Du reservierst zwar Speicher, aber befüllst ihn nicht. Dein String enthält dann nur Müll, der gerade zufällig dort im Speicher steht, und natürlich lässt sich das nicht als Shader kompilieren.

PS: Deine beiden Prüfungen, ob “new“ einen Nullzeiger liefert, sind Quatsch, da das niemals passiert. Wenn nicht genug Speicher frei ist, wird eine Exception geworfen.

PPS: Benutze std::string statt “new“!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

14.10.2016, 17:17

Abgesehen davon sei darauf hingewiesen, dass die Checks auf Nullpointer nach dem new sinnlos sind, da new eine Exception wirft, wenn es fehlschlägt und nicht Null returned... ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

14.10.2016, 17:17

Hab ich auch schon geschrieben ;)

15

14.10.2016, 18:48

Hatte das lesen des Dateiinhaltes in der Tat nicht drin, habs im Post weiter vorn eingefügt, nun ist es eingebaut und der Fehler immer noch gemeldet. Der Dateiinhalt wird auch geladen und jeweils in der Variable _vertexshadercode bzw _fragmentshadercode abgelegt. Habe ihm mir vor glShaderSource in die Konsole ausgeben lassen.

16

16.10.2016, 10:56

Du überschreibst das letzte Zeichen des Codes... Und beim Fragment Shader schreibst du in nicht-allozierten Speicher (falscher Array-Index). Du solltest vielleicht mal ein C++-Buch lesen, damit du solche Anfängerfehler nicht mehr machst.

Und abgesehen davon hast du quasi den gleichen Code 2 mal, du könntest auch stattdessen einfach eine Variable verwenden und die dann entsprechend einer von den beiden Shader-Code-Variablen zuweisen.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Magogan« (16.10.2016, 11:05)


Werbeanzeige

Ähnliche Themen