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

28.09.2016, 18:20

[OpenGL] Shader link Problem

Hallo an alle,

ich bin neu hier und habe gleich ein Problem mit dem Shader.
Ich bekomme beim linken des Shaders eine Fehlermeldung.

(0) : error C5145: must write to gl_Position

Hier noch der Vertexshader

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#version 330

out vec4 out_color;

void main(void)
{
    out_color = vec4(1., 1., 0., 1.);
}


und hier der Fragmentshader

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#version 330

out vec4 out_color;

void main(void)
{
    out_color = vec4(1., 1., 0., 1.);
}


mfg

sIR_pAPILEIN

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

2

28.09.2016, 22:25

Der Fehlermeldung ist eigentlich ziemlich deutlich.
Der Vertexshader muss in gl_Position schreiben.
Sollte also mindestens so aussehen:

Quellcode

1
2
3
4
5
6
#version 330

void main(void)
{
    gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
}


Zu jedem "out" im Vertexshader solltest du auch ein "in" im Fragmentshader haben, da kann es sonst auch Linkerfehler geben.

3

28.09.2016, 22:45

OH!

sehe gerade das ich den falschen Code gepostet habe, in Vertexshader seht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#version 330

layout(location = 0) in vec3 in_position;

void main(void)
{
  gl_Position = vec4(in_position, 1.0);
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.09.2016, 22:47

Zeig mal den Code wo du deine Shader Objects erzeugst und linkest... ;)

5

28.09.2016, 23:05

ok hier der Code, zum probieren habe ich das Laden aus der datei mal rauskommentiert.
glCompileSource wirft keine Fehler aus.

Muss den Code noch etwas übersichtlicher machen.

Datei: c_chader.cpp

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
c_shader::c_shader(std::string const vshaderfile, std::string const fshaderfile)
{
     loadshader(vshaderfile, GL_VERTEX_SHADER);     // rüchgabewert noch auswerden
     loadshader(fshaderfile, GL_FRAGMENT_SHADER);     // rüchgabewert noch auswerden
};

bool c_shader::loadshader(std::string const shaderfile, GLuint const shadertype)
{
    switch (shadertype)
    {
        case GL_VERTEX_SHADER:      // file ist vertexshader
        {
/*          std::ifstream file;
            file.open(shaderfile, std::ifstream::in);               // file open
            if (!file.good())
            {
                std::cerr << "ERROR: can't open the vertexshaderfile " << shaderfile << "\n";
                _ok = false;
                return false;
            }
            file.seekg(0, file.end);                    // get file size
            int length = file.tellg();
            file.seekg(0, file.beg);
            std::cerr << "Vertextshader file size : " << length << " Bytes\n";
            _vertexshadercode = new GLchar[length];     // alloc mem for sourcecode
            */
            _vertexshadercode = new GLchar[512];        // alloc mem for sourcecode
            if (_vertexshadercode == NULL)
            {
                std::cerr << "ERROR: Can't allocate memory for Vertexshadercode\n";
                //file.close();
                _ok = false;
                return false;
            }
            _vertexshadercode = "#version 330\n"
                "layout(location = 0) in vec3 in_position;\n"
                "void main(void)\n"
                "{\n"
                "gl_Position = vec4(in_position, 1.0);//w is 1.0, also notice cast to a vec4\n"
                "}\n";

/*          int pos =  0;
            while (file.good())                 // read file
            {
                char c = file.get();
                _vertexshadercode[pos++] = (GLchar)c;
                std::cerr << c;
            }
            file.close();
*/          _ok = true;
        }
        break;
        case GL_FRAGMENT_SHADER:        // file ist vertexshader
        {
/*          std::ifstream file;
            file.open(shaderfile, std::ifstream::in);
            if (!file.good())
            {
                std::cerr << "ERROR: can't open the fragmentshaderfile " << shaderfile << "\n";
                _ok = false;
                return false;
            }
            file.seekg(0, file.end);                    // get file size
            int length = file.tellg();
            file.seekg(0, file.beg);
            std::cerr << "fragmentshader file size : " << length << " Bytes\n";
            _fragmentshadercode = new GLchar[length + 1];       // alloc mem for sourcecode
*/
            _fragmentshadercode = new GLchar[512];
            if (_fragmentshadercode == NULL)
            {
                std::cerr << "ERROR: Can't allocate memory for fragmentshadercode\n";
            //  file.close();
                _ok = false;
                return false;
            }
/*          int pos = 0;
            while (file.good())                 // read file
            {
                char c = file.get();
                _fragmentshadercode[pos++] = (GLchar)c;
                std::cerr << c;
            }
            file.close();*/
            _fragmentshadercode = "#version 330\n"
                "out vec4 out_color"
                "void main(void)\n"
                "{\n"
                "out_color = vec4(1., 1., 0., 1.);\n"
                "}\n";
            _ok = true;
        }
        break;
        default:
            {
                std::cerr << "ERROR : unknown shader type\n";
                _ok = false;
                return false;
            }
    }
    return true;
};

void c_shader::getError(GLuint const shaderid)
{
    if (shaderid > 0)
    {
        GLint isCompiled = 0;
        glGetShaderiv(shaderid, GL_COMPILE_STATUS, &isCompiled);
        if (isCompiled == GL_FALSE)
        {
            GLint maxLength = 0;
            glGetShaderiv(shaderid, GL_INFO_LOG_LENGTH, &maxLength);

            // The maxLength includes the NULL character
            std::vector<GLchar> errorLog(maxLength);
            glGetShaderInfoLog(shaderid, maxLength, &maxLength, &errorLog[0]);

            std::cerr << "\n\n Vertshader error \n";
            for (auto i : errorLog)
                std::cerr << i;

            std::cerr << "\n";

            // Provide the infolog in whatever manor you deem best.
            // Exit with failure.
            glDeleteShader(shaderid); // Don't leak the shader.
            _ok = false;
        }
    }

    if (shaderid == 0)
    {
        //Note the different functions here: glGetProgram* instead of glGetShader*.
        GLint isLinked = 0;
        glGetProgramiv(_programID, GL_LINK_STATUS, (int *)&isLinked);
        if (isLinked == GL_FALSE)
        {
            GLint maxLength = 0;
            glGetProgramiv(_programID, GL_INFO_LOG_LENGTH, &maxLength);

            //The maxLength includes the NULL character
            std::vector<GLchar> infoLog(maxLength);
            glGetProgramInfoLog(_programID, maxLength, &maxLength, &infoLog[0]);

            std::cerr << "Linkshader faild : \n\n" << maxLength << " ";

            for (auto i : infoLog)
                std::cerr << i;

            std::cerr << "\n";

            //We don't need the program anymore.
            glDeleteProgram(_programID);
            //Don't leak shaders either.
            glDeleteShader(_vertexshaderID);
            glDeleteShader(_fragmentshaderID);

            //Use the infoLog as you see fit.

            _ok = false;

            //In this simple program, we'll just leave
            //return;
        }
    }
};

void c_shader::link()
{
    _programID = glCreateProgram();
    if (_programID == 0)
    {
        std::cerr << "ERROR: Can't create shaderprogram\n";
        _ok = false;
        return;
    }
    glAttachShader(_programID, _vertexshaderID);
    glAttachShader(_programID, _fragmentshaderID);
    glLinkProgram(_programID);
    getError(0);
};

void c_shader::compile()
{
    if (_vertexshadercode != NULL)
    {
        _vertexshaderID = glCreateShader(GL_VERTEX_SHADER);
        if (_vertexshaderID == 0)
        {
            std::cerr << "ERROR: Can't create vertexshader\n";
            _ok = false;
            return;
        }
        glShaderSource(_vertexshaderID, 0, &_vertexshadercode, (GLint *)sizeof(_vertexshadercode));
        glCompileShader(_vertexshaderID);
        getError(_vertexshaderID);
        this->isOK();
        if (!_ok)
            return;
    }

    if (_fragmentshadercode != NULL)
    {
        _fragmentshaderID = glCreateShader(GL_FRAGMENT_SHADER);
        if (_fragmentshaderID == 0)
        {
            std::cerr << "ERROR: Can't create vertexshader\n";
            _ok = false;
            return;
        }
        glShaderSource(_fragmentshaderID, 0, &_fragmentshadercode, (GLint *)sizeof(_fragmentshadercode));
        glCompileShader(_fragmentshaderID);
        getError(_fragmentshaderID);
        this->isOK();
        if (!_ok)
            return;
    }

};



Der Shaderinit. wird so aufgerufen

C-/C++-Quelltext

1
2
3
    test_shader = new c_shader("data\\shaders\\test.vert", "data\\shaders\\test.frag");
    test_shader->compile();
    test_shader->link();

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sIR_pAPILEIN« (29.09.2016, 07:20)


6

29.09.2016, 08:28

Quellcode

1
glShaderSource(_fragmentshaderID, 0, &_fragmentshadercode, (GLint *)sizeof(_fragmentshadercode));


Der letzte Parameter muss ein Pointer auf eine GLint sein, nicht ein Pointer auf die Adresse 0x4 (32 Bit) oder 0x8 (64 Bit). Und du musst schon einen Shader kompilieren, nicht 0...

Quellcode

1
2
GLint size = strlen(_fragmentshadercode);
glShaderSource(_fragmentshaderID, 1, &_fragmentshadercode, &size);


Wo zur Hölle hast du den Code her? Den hat irgendwer programmiert, der kaum Ahnung von C und C++ hatte. Ich würde mir ein anderes Tutorial suchen.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Magogan« (29.09.2016, 08:41)


7

30.09.2016, 17:57

So jetzt geht es, thx @ Magogan.

Habe mir jetzt mal dieses Tutorial (s) rausgesucht.

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


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

30.09.2016, 18:19

Niemals Video Tutorials nehmen, es sei denn sie kommen von bekannten Entwicklern.

Here you go, modernes OpenGL.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

9

01.10.2016, 11:06

Sobald du den Code aus einer Datei lädst, wird das so auch nicht funktionieren, weil du nämlich dann keinen nullterminierten String hast. D.h. du musst die Dateigröße als Parameter verwenden statt strlen(code).
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

10

03.10.2016, 14:39

Mit den Shaders funktioniert soweit, das ich Texture drastellen kann, als nächstes kommen Tastatur und Mauseingaben (Transformationen...). Ich verwende da "glm".

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sIR_pAPILEIN« (03.10.2016, 19:03)


Werbeanzeige

Ähnliche Themen