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!