[英]opengl quad not rendering
我有一个书本示例中的GL_QUADS
,我把颜色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;
}
这不足为奇,由于此行,您正在等待堆栈溢出:
//start rendering phase
glPushMatrix();
在每一帧中,您将“当前”矩阵推到堆栈的顶部,并且从不弹出任何内容。 最终,您将溢出并glOrtho(0,600,400,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会在缓冲区交换,清除等操作中保持其所有矩阵的状态...状态不会因为您开始新的帧而简单消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.