Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL&x2B;linux上未出现OpenGL程序_C++_Linux_Opengl_Sdl - Fatal编程技术网

C++ SDL&x2B;linux上未出现OpenGL程序

C++ SDL&x2B;linux上未出现OpenGL程序,c++,linux,opengl,sdl,C++,Linux,Opengl,Sdl,我开始在windows上用SDL和OpenGL制作这个超级简单的游戏引擎。引擎处于静态库中,到目前为止,它所做的只是显示一个蓝色窗口,其中包含引擎的所有基础工作 它在Windows上运行良好,但后来我将它移植到Linux上,什么也没有。程序运行正常,并显示在系统监视器中,但未显示任何窗口。我安装了两个mesa和gl libs来检查这不是真的。现在它不会运行,并表示进程已终止,状态为-1 这是发动机中的初始化代码。还需要什么吗 #include "Scales.h" #include "SDL/S

我开始在windows上用SDL和OpenGL制作这个超级简单的游戏引擎。引擎处于静态库中,到目前为止,它所做的只是显示一个蓝色窗口,其中包含引擎的所有基础工作

它在Windows上运行良好,但后来我将它移植到Linux上,什么也没有。程序运行正常,并显示在系统监视器中,但未显示任何窗口。我安装了两个mesa和gl libs来检查这不是真的。现在它不会运行,并表示进程已终止,状态为-1

这是发动机中的初始化代码。还需要什么吗

#include "Scales.h"
#include "SDL/SDL.h"
#include "gl.h"
#include "glu.h"

Engine *scalesEngine;

bool OnInit(int WindowHeight, int WindowWidth){

    SDL_Surface* Surf_Display;

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return false;
   }
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,        8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,      8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,       8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,      8);

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,      16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,        32);

    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,    8);

    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,  1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,  2);

   if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) = NULL){
        return false;
   }

   glClearColor(0.422f,0.576f,1.0f,1.0f);
   glClearDepth(1.0f);

   glViewport(0, 0, WindowWidth, WindowHeight);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glOrtho(0, WindowWidth, WindowHeight, 0, 1, -1);

   glMatrixMode(GL_MODELVIEW);

   glEnable(GL_TEXTURE_2D);

   glLoadIdentity();

   game_Init();

   return true;
}

int main(int argc, char* argv[]){

    scalesEngine = new Engine;

    game_preload();

    if(OnInit(scalesEngine->WindowHeight(), scalesEngine->WindowWidth()) == false){
        return -1;
    }

    SDL_Event Event;

    //Main Game Loop
    while(scalesEngine->Running){

        while(SDL_PollEvent(&Event)){
            scalesEngine->OnEvent(&Event);
        }


        scalesEngine->Update();
        scalesEngine->Render();
    }

    scalesEngine->OnCleanUp();
    delete scalesEngine;

    return 0;
}
#包括“Scales.h”
#包括“SDL/SDL.h”
#包括“gl.h”
#包括“glu.h”
发动机*小型发动机;
bool OnInit(整型窗高、整型窗宽){
SDL_表面*冲浪显示;
if(SDL_Init(SDL_Init_EVERYTHING)<0){
返回false;
}
SDL_GL_设置属性(SDL_GL_红色_大小,8);
SDL_GL_设置属性(SDL_GL_绿色_大小,8);
SDL_GL_SetAttribute(SDL_GL_BLUE_大小,8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_大小,8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,32);
SDL_GL_设置属性(SDL_GL_累计大小,8);
SDL_GL_设置属性(SDL_GL_累计绿色_大小,8);
SDL_GL_设置属性(SDL_GL_累计蓝色_大小,8);
SDL_GL_设置属性(SDL_GL_累计ALPHA_大小,8);
SDL_GL_SetAttribute(SDL_GL_多采样缓冲区,1);
SDL_GL_SetAttribute(SDL_GL_多样本样本,2);
如果((冲浪显示=SDL_设置视频模式(窗宽、窗高、32、SDL_表面| SDL_GL_双缓冲区| SDL_OPENGL))=NULL){
返回false;
}
glClearColor(0.422f、0.576f、1.0f、1.0f);
glClearDepth(1.0f);
glViewport(0,0,WindowWidth,WindowHeight);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,窗宽,窗高,0,1,-1);
glMatrixMode(GLU模型视图);
glEnable(GL_纹理_2D);
glLoadIdentity();
game_Init();
返回true;
}
int main(int argc,char*argv[]){
ScaleEngine=新发动机;
游戏_预加载();
if(OnInit(scaleEngine->WindowHeight(),scaleEngine->WindowWidth())==false){
返回-1;
}
SDL_事件;
//主游戏循环
同时(缩放引擎->运行){
while(SDL_事件和事件)){
ScaleEngine->OneEvent(&Event);
}
缩放引擎->更新();
缩放引擎->渲染();
}
scaleEngine->OnCleanUp();
删除ScaleEngine;
返回0;
}

如果您没有获得窗口,我怀疑您没有获得硬件上下文。尝试使用
SDL\u SWSURFACE
而不是
SDL\u SWSURFACE

SDL_SetVideoMode(... SDL_SWSURFACE ...
我在VM中开发时看到过这种情况,尽管我确信还有其他原因

编辑:

如注释中所述,这两个表面标志与
SDL\u OPENGL
一起可能是多余的

if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) = NULL){
    return false;
}

我很确定你的意思是
==NULL
,对吗?

我会完全放弃这个标志。在创建OpenGL上下文而不是原始图形曲面时,您不需要担心曲面标志。实际上,SDL_HWSURFACE、SDL_SWSURFACE和SDL_OpenGL是互斥的。您只能选择其中一个。@datenwolf:这有什么记录吗?@datenwolf我模糊地记得在不同的平台上使用SDL_OPENGL标志和这两个选项。我相信它不会被强制执行或忽略,尽管我无法在网上找到证据。@TomKerr:这些标志实际上只有在您想要直接访问“哑”帧缓冲区时才有意义,而“哑”帧缓冲区可以通过内存写入和读取来访问。这称为曲面。OpenGL操作不涉及此类帧缓冲区访问,OpenGL实现可能根本不支持这些操作。请记住,SDL是在没有OpenGL支持的情况下启动的。这是后来才加上的。