好久没问问题了
我正在尝试 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)?
- 我是否错过了代码中看到白色三角形所必需的内容?