Прошло некоторое время с тех пор, как мне нужно было задать вопрос,
Я пробую 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)?
- Я пропустил что-то в своем коде, что необходимо, чтобы увидеть белый треугольник?
glClearColor()
иglClear()
ранее, и ничего не вышло. По последним двум пунктам я попытаюсь найти что-нибудь, но пример или, по крайней мере, упоминание пропущенной функции/практики было бы более полезным. Спасибо хотя бы за то, что ответили. - person Jash   schedule 30.05.2015-Wall
для gcc. Суть связывания функций GL в том, что вы не связываете их вообще. Нет никаких требований, чтобы эти функции вообще экспортировались библиотекой GL. Вы должны использовать механизм расширения GL, чтобы использовать их. Возможно, этот ответ может объяснить, что более подробно. - person derhass   schedule 30.05.2015