Witam!
Napisałem program, który ma wyświetlić na ekranie biały trójkąt. Kompilator i linker nie wywala żadnych warningów ani errorów. Jednak po uruchomieniu program się wylewa (segmentation fault).
Oto mój kod:
#include <GL/glew.h>
#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <streambuf>
#include <fstream>
char* loadShaderFromFile(const std::string& filename);
int main(void)
{
glewInit();
sf::ContextSettings settings;
settings.depthBits = 24;
settings.stencilBits = 8;
settings.antialiasingLevel = 4;
settings.majorVersion = 3;
settings.minorVersion = 2;
// create the window
sf::Window window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, settings);
window.setVerticalSyncEnabled(true);
window.setActive(true);
float vertices[] = {
0.0f, 0.5f, // Vertex 1 (X, Y)
0.5f, -0.5f, // Vertex 2 (X, Y)
-0.5f, -0.5f // Vertex 3 (X, Y)
};
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
char* vertSource = loadShaderFromFile("vshader.vert");
char* fragSource = loadShaderFromFile("fshader.frag");
glShaderSource(vertShader, 1, &vertSource, NULL);
glShaderSource(fragShader, 1, &fragSource, NULL);
GLint status;
glCompileShader(vertShader);
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &status);
if(status!=GL_TRUE)
{
puts("Shader compilation error!");
return -1;
}
glCompileShader(fragShader);
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);
if(status!=GL_TRUE)
{
puts("Shader compilation error!");
return -1;
}
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertShader);
glAttachShader(shaderProgram, fragShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(posAttrib);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
bool running = true;
while (running)
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
// end the program
running = false;
}
else if (event.type == sf::Event::Resized)
{
// adjust the viewport when the window is resized
glViewport(0, 0, event.size.width, event.size.height);
}
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
window.display();
}
return 0;
}
char* loadShaderFromFile(const std::string& filename)
{
std::ifstream file(filename);
std::string str((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
return (char*)str.c_str();
}
Kompiluję na linuxsie Mint 18. Tu jeszcze mój Makefile:
CC=g++
CFLAGS= -std=c++11 -Wall -pedantic -g
LIBS= -lGLEW -lGLU -lGL -lsfml-graphics -lsfml-window -lsfml-system
OUTPUTFILE= out
all:
$(CC) $(CFLAGS) main.cpp -o $(OUTPUTFILE) $(LIBS)
Z góry dziękuję za pomoc!