SDL2-Opengl 3.3+;什么';怎么了?

SDL2-Opengl 3.3+;什么';怎么了?,opengl,opengl-3,sdl-2,Opengl,Opengl 3,Sdl 2,这是我的密码: int main(int argc, char* argv[]) { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { return false; } SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); SDL_GL_SetA

这是我的密码:

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

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        return false;
    }
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ) ;
    SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 4 ) ;
     if((window = SDL_CreateWindow("SDL opengl",100,100,640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN)) == NULL) {
        return false;
    }
    maincontext = SDL_GL_CreateContext(window);
    SDL_GL_SetSwapInterval(0);
    glewExperimental=true;
    GLenum err=glewInit();

    Chapter* chapter1 = new Chapter();
    chapter1->init();

    glClearColor(0.0,0.0,0.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,640.0/480.0,1.0,500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    SDL_Event Event;

    while(Running) {

        while(SDL_PollEvent(&Event)) {
            event_update(&Event);
        }
        //main loop

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(1.0f, 1.0f, 1.0f);

        glBegin(GL_TRIANGLES);
            glVertex3f(0.0f, 1.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f, 0.0f);
            glVertex3f(1.0f, -1.0f, 0.0f);
        glEnd();

        glTranslatef(3.0f, 0.0f, 0.0f);

        glBegin(GL_QUADS);
            glVertex3f(-1.0f, 1.0f, 0.0f);
            glVertex3f(1.0f, 1.0f, 0.0f);
            glVertex3f(1.0f, -1.0f, 0.0f);
            glVertex3f(-1.0f, -1.0f, 0.0f);
        glEnd();
        SDL_GL_SwapWindow(window);

    }
    return 0;
}
intmain(intargc,char*argv[]){
if(SDL_Init(SDL_Init_EVERYTHING)<0){
返回false;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
SDL_GL_SetAttribute(SDL_GL_多采样缓冲区,1);
SDL_GL_SetAttribute(SDL_GL_多样本样本,4);
如果((window=SDL_CreateWindow(“SDL opengl”,100100640480,SDL_window_opengl | SDL_window_显示))==NULL){
返回false;
}
maincontext=SDL\u GL\u CreateContext(窗口);
SDL_GL_SetSwapInterval(0);
glewExperimental=true;
GLenum err=glewInit();
第*章第1章=新章节();
第1章->初始化();
glClearColor(0.0,0.0,0.0,1.0);
glMatrixMode(GL_投影);
glLoadIdentity();
(45.0640.0/480.0,1.0500.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
SDL_事件;
(跑步时){
while(SDL_事件和事件)){
事件\u更新(&event);
}
//主回路
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
GL3F(1.0f,1.0f,1.0f);
glBegin(GL_三角形);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
格伦德();
GLTRANSTEF(3.0f,0.0f,0.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
格伦德();
SDL_GL_SwapWindow(窗口);
}
返回0;
}

我的问题是,除了清晰的颜色之外,再也看不见任何东西了。有什么问题吗?(当我初始化时没有错误或其他东西)如果重要的话,我会使用Visual Stuido 2010。

从外观上看,你的近剪裁平面为1.0,远剪裁平面为500.0

但在z距离为0.0时绘制

我会尝试将图形移动到平截头体中(即在[1.0500.0]范围内),以查看是否可以作为第一步使几何体可见

glVertex3f (x, y, z); // here your z value is 0, I suggest this could be the problem.
我想我可以在这里详细阐述一下,因为我之前没有太多时间

在更新代码中执行
glTranslate…
时,每次更新都会调用一次,这通常是一种假设,导致每次调用几何体时,几何体在x轴上移动3个单位(即,可能不是您的意思)。相反,我建议推动矩阵进行此转换,并在完成翻译后弹出它。OpenGL提供了一个矩阵堆栈,所以基本上,当你推送矩阵时,你要做的就是“以后保存”,然后你进行变换和渲染,然后弹出矩阵,结果你回到了原点。这样,您不会在每次更新时将矩阵转换为新的距离,而是将矩阵从origo移动到要绘制每次更新的位置

因此,我的建议是在主循环中将代码更改为如下内容:

//main loop
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);

/* push the current state of the matrix (i.e. store it so we don't make the mentioned change per update */
glPushMatrix();
/* think of it as moving your camera, you positioned your camera (frustum) at origo looking at everything inside a frustum shape one unit in front of the camera to 500 units in front of the camera, at an angle and so on.. so we want to draw our triangle to the left (from your view) 3 units and 10 units into the screen */
glTranslate3f(-3.0f, 0.0f, -10.0f);
glBegin(GL_TRIANGLES);
    glVertex3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

/* translate again, i.e. "move your camera" this time 6 units to the right, 3 units to compensate for the move you did to draw your triangle, and 3 units to place it in the right end. this time we do not move it in the z-axis, because we are already 10 pixels into the screen. */
glTranslatef(6.0f, 0.0f, 0.0f);

glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
/* pop the matrix changes we made with glTranslatef, so that we are back at the origo looking down negative z-axis so that the next draw-call we will again go 3 units left, 10 units down the z-axis and draw a triangle and so on.. hope it makes sense */
glPopMatrix();
SDL_GL_SwapWindow(window);

我希望它至少能帮助你以一种可见的方式渲染一些东西!如果一切看起来都不清楚,我可以试着进一步解释,但希望这能让你开始玩弄它,感受它是如何结合在一起的。

我不知道问题出在哪里,对不起。但我建议两件事,一是在每次通话后检查glError,看看是否有失败的。另一种方法是将“清除颜色”(clear color)设置为除黑色以外的其他颜色,以防绘制成功,但使用黑色…当我将“颜色”(color)清除为白色时,所有颜色都是白色,这样可以正常工作,但几何体不起作用:(您可能无法使用固定函数管道。也就是说,您有一个(3.3)向前兼容的上下文。您可能遇到了以下错误:尝试删除SDL_GL_MULTISAMPLEBUFFERS/SDL_GL_MultisampleSampleSamples以验证这是否是问题所在。已删除但仍然没有:(仍然错误:(我更改为gluPerspective(45.0640.0/480.0,0500.0);但仍然不是更好你不能有一个接近零的剪裁距离,这个数学不起作用…试着将z平面上的三角形翻译回2个单位或什么的(只是为了调试我的意思…)用更多的信息更新了答案,希望这将为无可见的移民问题提供一个解决方案,我也尝试对其进行更深入的研究,以便您可以了解如何使其工作。OpenGL 3.3中不是不推荐使用固定函数管道吗?您想创建一个兼容配置文件上下文,而不是核心配置文件上下文以使用旧式
glBegin()…glEnd()
块。