Guten Morgen,
ich melde mich seit einiger zeit auch mal wieder zu Wort. Nach dem ich zu Weihnachten OpenGL Superbible bekommen habe wollte ich damit jetzt auch mal wieder ein wenig Programmieren. Nach dem ich leider mit dem erstellen der dazu gehörigen Lib gescheitert bin habe ich mich gleich noch ein wenig mit dem Erstellen eines Fensters und der Windowapi beschäftigt. Das erstellen eines Fensters und das weiß über rendern läuft ohne Probleme.
Doch nun zu meinem Problem. Ich wollte jetzt mit Hilfe von einem einfachen Shader ein Dreieck rendern. Ich habe mich unter anderem an diesem Tutorial orientiert.
Shader
http://antongerdelan.net/opengl/shaders.html
Vertexbuffer
http://antongerdelan.net/opengl/vertexbuffers.html
Jetzt noch ein wenig Code
Erstellen des Buffers
|
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
|
bool GraphicClass::CreateVBO(std::shared_ptr<ObjectClass> Object)
{
Object->VBO_vertice = 0;
glGenBuffers(1, &Object->VBO_vertice);
glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
glBufferData(GL_ARRAY_BUFFER, Object->vertice.size() * sizeof (GLfloat), &Object->vertice, GL_STATIC_DRAW);
Object->VBO_color = 0;
glGenBuffers(1, &Object->VBO_color);
glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);
glBufferData(GL_ARRAY_BUFFER, Object->color.size() * sizeof (GLfloat), &Object->color, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
Object->VAO = 0;
glGenVertexArrays(1, &Object->VAO); glBindVertexArray(Object->VAO);
glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
return true;
}
|
Erstellen des Shaders
|
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
|
bool GraphicClass::NewShader(std::string ShaderName, std::string &VS, std::string &FS)
{
std::shared_ptr<GraphicClass::ShaderClass> Shader{ new GraphicClass::ShaderClass{ VS, FS } };
if(!Shader)
{
return false;
}
this->Shaders.insert(std::map<std::string, std::shared_ptr<GraphicClass::ShaderClass>>::value_type(ShaderName,Shader));
return true;
}
GraphicClass::ShaderClass::ShaderClass(std::string &VS, std::string &FS)
{
const char*c_str;
this->Program = glCreateProgram();
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &(c_str = FS.c_str()), NULL);
glCompileShader(fs);
#ifdef _DEBUG
Print_shader_info_log(fs);
#endif
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &(c_str = VS.c_str()), NULL);
glCompileShader(vs);
#ifdef _DEBUG
Print_shader_info_log(vs);
#endif
glAttachShader(this->Program, vs);
glAttachShader(this->Program, fs);
glBindAttribLocation(this->Program, 0, "vertex_position");
glBindAttribLocation(this->Program, 1, "vertex_colour");
glLinkProgram(this->Program);
#ifdef _DEBUG
Print_programme_info_log();
Logfile.log("Shader wurde erstellt", this->Program);
#endif
}
|
Das Rendern
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
void GraphicClass::WindowClass::Render(std::shared_ptr<ObjectClass> Object, GLint Shader) const
{
wglMakeCurrent(this->DC, this->renderingContext);
glUseProgram(Shader);
glBindVertexArray(Object->VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
|
Ich kann natrürlich auch alles andere an Quellcode zur verfügung stellen
Ich bedanke mich jetzt schon einmal
EDIT:
Jetzt kann man auch den Code lesen
Hier noch einmal die Shader
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
|
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_colour;
out vec3 colour;
void main ()
{
colour = vertex_colour;
gl_Position = vec4 (vertex_position, 1.0);
}
|
|
Quellcode
|
1
2
3
4
5
6
7
8
|
]
in vec3 colour;
out vec4 frag_colour;
void main ()
{
frag_colour = vec4 (colour, 1.0);
}
|