0

好久没问问题了

我正在尝试 SDL2 和 OpenGL(3.3,这是与 mesa 的兼容性限制),因为 GLSL 真的让我很感兴趣,但是在我的工作机器上,我很快就知道让事情正常工作并不容易。我使用过的每个教程,甚至 Mesa 演示本身都使用 Ubuntu 的基本 GL 库不附带的头文件,我已经辞职并安装了 GLEW,但是不断添加库来使事情正常工作感觉不对,GL我的标题是:

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)?
  • 我是否错过了代码中看到白色三角形所必需的内容?
4

0 回答 0