我正在尝试使用OpenGL 3.3和SDL2来关注3D图形教程,以便创建一个小游戏,您必须使用键盘的箭头键来避免3D障碍。
事情是,我无法设法得到正确的基本示例(见下文),就像在窗口中打印白色三角形一样。此外,我设法使用“遗留”OpenGL(我认为,指的是OpenGL 2.X)从其他教程复制代码来打印三角形。
由于OpenGL 3.3 + SDL2教程的代码在我的OpenGL窗口中没有打印正确的东西都编译并运行 (我可以更改窗口的标题,例如),因为它也适用于我的Windows桌面和朋友的Linux解析(Arch Linux,尽管我认为这可能没有帮助),我开始认为它与我的集成图形处理器如何处理OpenGL 3.3 + SDL2(SO)有关像this one这样的帖子似乎指向了那个方向,但它并不完全是我的架构。
编译和运行的基本白色三角形代码示例:
#ifdef WIN32
#include <GL/glew.h>
#else
#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>
#endif
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char **argv)
{
// Notre fenêtre
SDL_Window* fenetre(0);
SDL_GLContext contexteOpenGL(0);
SDL_Event evenements;
bool terminer(false);
// Initialisation de la SDL
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cout << "Erreur lors de l'initialisation de la SDL : " << SDL_GetError() << std::endl;
SDL_Quit();
return -1;
}
// Version d'OpenGL
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
// Double Buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
// Création de la fenêtre
fenetre = SDL_CreateWindow("Test SDL 2.0 - This I can change and it prints !", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
if(fenetre == 0)
{
std::cout << "Erreur lors de la creation de la fenetre : " << SDL_GetError() << std::endl;
SDL_Quit();
return -1;
}
// Création du contexte OpenGL
contexteOpenGL = SDL_GL_CreateContext(fenetre);
if(contexteOpenGL == 0)
{
std::cout << SDL_GetError() << std::endl;
SDL_DestroyWindow(fenetre);
SDL_Quit();
return -1;
}
#ifdef WIN32
// On initialise GLEW
GLenum initialisationGLEW( glewInit() );
// Si l'initialisation a échouée :
if(initialisationGLEW != GLEW_OK)
{
// On affiche l'erreur grâce à la fonction : glewGetErrorString(GLenum code)
std::cout << "Erreur d'initialisation de GLEW : " << glewGetErrorString(initialisationGLEW) << std::endl;
// On quitte la SDL
SDL_GL_DeleteContext(contexteOpenGL);
SDL_DestroyWindow(fenetre);
SDL_Quit();
return -1;
}
#endif
// Vertices et coordonnées
float vertices[] = {-0.5, -0.5, 0.0, 0.5, 0.5, -0.5};
// Boucle principale
while(!terminer)
{
// Gestion des évènements
SDL_WaitEvent(&evenements);
if(evenements.window.event == SDL_WINDOWEVENT_CLOSE)
terminer = true;
// Nettoyage de l'écran
glClear(GL_COLOR_BUFFER_BIT);
// On remplie puis on active le tableau Vertex Attrib 0
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glEnableVertexAttribArray(0);
// On affiche le triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
// On désactive le tableau Vertex Attrib puisque l'on n'en a plus besoin
glDisableVertexAttribArray(0);
// Actualisation de la fenêtre
SDL_GL_SwapWindow(fenetre);
}
// On quitte la SDL
SDL_GL_DeleteContext(contexteOpenGL);
SDL_DestroyWindow(fenetre);
SDL_Quit();
return 0;
}
它给了我什么,这不是预期的:
期望给我的是什么:
我可以添加使用着色器的代码,或者不是编译和运行的代码,再次在我的OpenGL窗口中不打印除黑色之外的任何东西(我曾经希望指定带有颜色的着色器可能会打印不同的东西,但它不会)
我之前链接的SO帖子提示$ glxinfo | grep OpenGL
,它返回以下信息:
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.0.6
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 13.0.6
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 13.0.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
如果有人有想法或有趣的链接(请不要在编译时出现错误的SO帖子,我不认为这与我的具体问题有关),谢谢!
其他相关的SO帖子:
Mesa 17.0.1 says OpenGL Core 4.5 even though my Intel HD 520 Graphics Card supports only 4.4
OpenGL: How to render 2 simple VAOs on Intel HD Graphics 4000 GPU?