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我的意思是用最后两行代码(矩阵模式和标识)替换我提到的第一行代码(推送矩阵)。