Ubuntu 15.04 Mesa и реализация SDL

Прошло некоторое время с тех пор, как мне нужно было задать вопрос,

Я пробую SDL2 и OpenGL (3.3, что является пределом совместимости с mesa), потому что GLSL меня действительно интересует, однако на моей рабочей машине я очень быстро понял, что заставить что-то работать непросто. В каждом учебнике, который я использовал, и даже в самих демонстрациях Mesa используются заголовки, которые не поставляются с базовой библиотекой GL Ubuntu, я уже ушел и установил GLEW, но мне кажется неправильным постоянно добавлять библиотеки, чтобы все заработало, заголовки у меня есть:

glcorearb.h, glew.h, glext.h, gl.h, gl_mangle.h, glu.h, glu_mangle.h,
glxew.h, glxext.h, glx.h, glxint.h, glx_mangle.h, glxmd.h, glxproto.h,
glxtokens.h, wglew.h

Я пытался следовать инструкциям LazyFoo, но не получил такого же результата, как появление белого квадрата. Я следовал руководствам opengl-tutorial и не получил такого же результата, как появление белого треугольника (в нем упоминается, что не стоит беспокоиться, если вы сначала его не видите, но не объясняется, что делать в случае, если он не t (я пытался следовать остальной части учебника, но я пишу это на C, а не на C++, поэтому я беспокоюсь о том, чтобы слишком далеко отклониться от руководств и еще больше запутать проблему. Я установил SDL2 и убедился, У меня было все Это код, который у меня есть в моей текущей программе SDL2/GL, он вообще не показывает белый треугольник, это комбинация руководств, но я прочитал все материалы SDL API, которые я мог, чтобы убедиться, что ничего на стороне SDL влияет на то, что пытается сделать GL.

#define SDL_ASSERT_LEVEL 3

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_error.h>
#include <SDL2/SDL_assert.h>
#include <SDL2/SDL_version.h>
#include <SDL2/SDL_events.h>
#include <GL/gl.h>

int main(){
    SDL_version compiledWith, linkedWith;
    SDL_VERSION(&compiledWith);
    SDL_GetVersion(&linkedWith);
    if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0){
        fprintf(stderr, "\nUnable to initialize SDL: %s\n", SDL_GetError());
        exit(1);
    }
    SDL_Log("\nCompiled with: %d.%d.%d\n", compiledWith.major,
            compiledWith.minor, compiledWith.patch);
    SDL_Log("\nLinked with: %d.%d.%d\n", linkedWith.major,
            linkedWith.minor, linkedWith.patch);
    SDL_Window* window = SDL_CreateWindow("SDL2/OpenGL Demo", 0, 0, 640, 480,
            SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);

    //Can now make GL calls after the below line
    SDL_GLContext glContext = SDL_GL_CreateContext(window);

    GLuint vertexArrayID;
    glGenVertexArrays(1, &vertexArrayID);
    glBindVertexArray(vertexArrayID);
    static const GLfloat gVertexBufferData[] = {
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
    };
    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(gVertexBufferData),
            gVertexBufferData, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexAttribPointer(
            0,
            3,
            GL_FLOAT,
            GL_FALSE,
            0,
            (void*)0
    );
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glClearColor(0,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);
    SDL_GL_SwapWindow(window);

    SDL_Event theEvent;
    bool running = true;

    while(running){
        while(SDL_PollEvent(&theEvent)){
            switch(theEvent.type){
                case SDL_QUIT:
                    SDL_Log("\nQuit request acknowledged\n");
                    //Finish up GL usage
                    SDL_GL_DeleteContext(glContext);
                    //Finish up SDL usage
                    SDL_Quit();
                    running = false;
                    break;
                default:
                    break;
            }
        }
    }
    return 0;
}

Я использую gcc main.c -lSDL2 -lGL -o test для компоновки, я подозреваю, что у меня могут отсутствовать библиотеки компоновки, но я не уверен, где я могу проверить, есть ли я или нет, компилятор не предупреждает меня о чем-либо, что он не может найти, если я не следую учебнику, который использует то, чего у меня нет.

В заключение, поскольку это более длинный пост, чем предполагалось, вопрос таков:

  • Мне не хватает какой-либо важной библиотеки, чтобы заставить ее работать в моей системе (Ubuntu 15.04 Intel Haswell Mobile x86/MMX/SSE2)?
  • Я пропустил что-то в своем коде, что необходимо, чтобы увидеть белый треугольник?

person Jash    schedule 30.05.2015    source источник
comment
Есть некоторые проблемы с вашим кодом. Прежде всего, я не знаю, откуда вы берете указатели на функции opengl. Вам может сойти с рук их прямое связывание, но ваш компилятор должен жаловаться на отсутствующие объявления функций. Во-вторых, ваш код фактически очищает окно после рисования. В-третьих, вы фактически не рисуете в цикле. И, наконец, вы даже не пытаетесь получить современный контекст GL, так что вы получите устаревшую версию и не сможете получить 3.3 на mesa.   -  person derhass    schedule 30.05.2015
comment
Я ценю ответ, но не могли бы вы уточнить? Никаких предупреждений не появляется, и я не подавляю их активно. Какие ссылки я должен добавить при компиляции, есть ли у вас пример онлайн-ресурса, который может предотвратить это в будущем, потому что API OpenGL 3.3 не упоминает их в описании функции. Во-вторых, я переместил glClearColor() и glClear() ранее, и ничего не вышло. По последним двум пунктам я попытаюсь найти что-нибудь, но пример или, по крайней мере, упоминание пропущенной функции/практики было бы более полезным. Спасибо хотя бы за то, что ответили.   -  person Jash    schedule 30.05.2015
comment
Вы, вероятно, не получите никаких предупреждений компилятора, потому что вызов необъявленных функций допустим C, рассмотрите возможность использования флага -Wall для gcc. Суть связывания функций GL в том, что вы не связываете их вообще. Нет никаких требований, чтобы эти функции вообще экспортировались библиотекой GL. Вы должны использовать механизм расширения GL, чтобы использовать их. Возможно, этот ответ может объяснить, что более подробно.   -  person derhass    schedule 30.05.2015
comment
Также обратите внимание, что причина, по которой в этом руководстве есть примечание «не беспокойтесь, если оно не появляется», заключается в том, что код там не является действительным GL и на самом деле не должен ничего рисовать с соответствующей реализацией.   -  person derhass    schedule 30.05.2015