Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ opengl四边形不渲染_C++_Opengl_Sdl - Fatal编程技术网

C++ opengl四边形不渲染

C++ opengl四边形不渲染,c++,opengl,sdl,C++,Opengl,Sdl,我有一个GL_QUADS来自一本书的例子,我扔了一个黑色的,但我仍然不明白,我得到的只是我清晰的白色屏幕 有什么不对劲吗 #include "SDL.h" #include "SDL_opengl.h" #include <iostream> int main(int argc, char* args[]) { // Memory usage specifics SDL_Init(SDL_INIT_EVERYTHING); SDL_GL_SetAttribut

我有一个
GL_QUADS
来自一本书的例子,我扔了一个黑色的,但我仍然不明白,我得到的只是我清晰的白色屏幕 有什么不对劲吗

#include "SDL.h"
#include "SDL_opengl.h"
#include <iostream>
int main(int argc, char* args[])
{
    // Memory usage specifics
    SDL_Init(SDL_INIT_EVERYTHING);
    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_BUFFER_SIZE, 32 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    // name on the window
    SDL_WM_SetCaption( "our first game", NULL );

    //set screen
    SDL_SetVideoMode(600,400,32, SDL_OPENGL);

    // when screen is clear
    glClearColor(1,1,1,1); //red, green, blue, alpha

    //portion to display
    glViewport(0,0,600,400);

    //shade
    glShadeModel(GL_SMOOTH);

    // 3D or 2D
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); //saves

    //if only 2D?
    glDisable(GL_DEPTH_TEST);
    //this handles the main loop
    bool isRunning = true;
    //this is for the events
    SDL_Event event;

    //main rectangle
    float myX = 300;
    float myY = 350;
    float width = 50;
    float height = 30;

    //main loop
    while ( isRunning )
    {
        //EVENTS
        while ( SDL_PollEvent(&event) )
        {
            //logic that should happen for certain events
            //quiting the window
            if ( event.type == SDL_QUIT )
            {
                isRunning = false;
            }
            // if ESC pressed
            if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE )
            {
                isRunning = false;
            }
        }
        //LOGIC

        //RENDERING TO THE SCREEN
         glClear(GL_COLOR_BUFFER_BIT);
         //start rendering phase
         glPushMatrix();
         //set the matix
         glOrtho(0,600,400,0,-1,1);
         //black color
         glColor4ub(0,0,0,255);

         //drawing
         //GL_QUADS, GL_POINTS, GL_LINES, GL_LINE_STRIP,
         //GL_LINE_LOOP, GL_QUADS, GL_TRIANGLES, GL_POLIGON

         glBegin(GL_QUADS);
            glVertex2f(myX,myY);
            glVertex2f(myX+width,myY);
            glVertex2f(myX+width,myY+height);
            glVertex2f(myX,myY+height);
         glEnd();



        //render
        SDL_GL_SwapBuffers();
    }
    //house keeping
    SDL_Quit();
    return 0;
}
#包括“SDL.h”
#包括“SDL_opengl.h”
#包括
int main(int argc,char*args[]
{
//内存使用细节
SDL_Init(SDL_Init_EVERYTHING);
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_BUFFER_SIZE,32);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
//窗口上的名字
SDL_WM_SetCaption(“我们的第一个游戏”,空);
//设置屏幕
SDL_设置视频模式(600400,32,SDL_OPENGL);
//当屏幕清除时
glClearColor(1,1,1,1);//红、绿、蓝、阿尔法
//要显示的部分
(0,0600400);
//阴影
glShadeModel(GL_平滑);
//三维还是二维
glMatrixMode(GL_投影);
glLoadIdentity();//保存
//如果只有2D?
glDisable(GLU深度测试);
//这将处理主循环
bool isRunning=true;
//这是为活动准备的
SDL_事件;
//主矩形
浮动myX=300;
浮动myY=350;
浮动宽度=50;
浮子高度=30;
//主回路
同时(正在运行)
{
//事件
while(SDL_事件和事件))
{
//某些事件应该发生的逻辑
//退出窗口
if(event.type==SDL\u QUIT)
{
isRunning=false;
}
//如果按下ESC键
if(event.type==SDL\u KEYUP&&event.key.keysym.sym==SDLK\u ESCAPE)
{
isRunning=false;
}
}
//逻辑
//渲染到屏幕
glClear(GLU颜色缓冲位);
//开始渲染阶段
glPushMatrix();
//设置matix
格洛托(0600400,0,-1,1);
//黑色
GL4UB(0,0,0255);
//绘图
//GL_四边形、GL_点、GL_线、GL_线带、,
//GL_线_环、GL_四边形、GL_三角形、GL_多边形
glBegin(GL_QUADS);
glVertex2f(myX,myY);
glVertex2f(myX+宽度,myY);
glVertex2f(myX+宽度,myY+高度);
glVertex2f(myX,myY+高度);
格伦德();
//渲染
SDL_GL_SwapBuffers();
}
//管家
SDL_退出();
返回0;
}

这并不奇怪,由于这行代码,堆栈溢出正在等待发生:

//start rendering phase
glPushMatrix();
每一帧,你都会将“当前”矩阵推到堆栈的顶部,并且永远不会弹出任何内容。最终您将溢出并
glOrtho(0600400,0,-1,1)将有未定义的结果

我可以问一下,为什么你首先要把矩阵推到堆栈上?如果在每一帧上都重写了投影矩阵,那么代码将运行得非常好

我也对这些代码行感到困惑:

// 3D or 2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //saves
glLoadIdentity(…)
不保存任何内容,它将一个标识矩阵写入当前矩阵:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
由于
glOrtho(…)
乘以当前矩阵,我实际上会用第二个替换我提到的第一个代码片段。这样,您将始终生成相同的结果,而不是乘以矩阵的上一个值


然而,更重要的是,假设您从未在代码中的任何其他地方修改矩阵,那么您不必每次绘制时都保持设置投影矩阵。OpenGL在缓冲区交换、清除等过程中保持其所有矩阵的状态。。。状态不会因为你开始一个新的帧而消失。

基于此,矩阵应该像我要绘制的网格一样,我保持循环,每个帧都显示矩阵?@panchovilla除非你的窗口调整了大小,否则通常没有理由在简单的应用程序中重新定义矩阵。您可以通过在
SDL_GL_SwapBuffers()之后添加
glPopMatrix(…)
来解决此问题,但更好的解决方案是在每一帧中根本不要弄乱矩阵。用第二个代码替换第一个代码是什么意思?您的意思是将
glPushMatrix
替换为
glLoadIdentity
glortho
?顺便说一句,谢谢:)@panchovilla我的意思是用最后两行代码(矩阵模式和标识)替换我提到的第一行代码(推送矩阵)。