• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

OpenGL i SFML - segmentation fault.

0 głosów
534 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez Michał Gibas Pasjonat (19,630 p.)

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!

komentarz 22 marca 2017 przez adrian17 Mentor (355,180 p.)
Dodaj do CFLAGS -fsanitize=address, przy crashu powinieneś dostać ładny komunikat, gdzie konkretnie do tego doszło.
komentarz 22 marca 2017 przez Michał Gibas Pasjonat (19,630 p.)

Już naprawiłem błąd tylko teraz mam problem z shaderami... Chcę używać wersji 1.50 GLSL ale pisze mi: 

Error compiling shader type 35633: '0:2(10): error: GLSL 3.30 is not supported. Supported versions are: 1.00 ES, 1.10, 1.20, and 1.30, or 3.00 ES, 3.10 ES

Co zrobić w tym przypadku?

komentarz 22 marca 2017 przez adrian17 Mentor (355,180 p.)
Pokaż jeszcze kod shadera.
komentarz 22 marca 2017 przez Michał Gibas Pasjonat (19,630 p.)
//vertex shader:

#version 150 core

in vec2 position;

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

//fragment shader

#version 150 core

out vec4 outColor;

void main()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

Wszystko robię z tutoriala: https://open.gl/

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 349 wizyt
pytanie zadane 18 listopada 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)
0 głosów
1 odpowiedź 299 wizyt
+1 głos
1 odpowiedź 410 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...