OpenGL SDL屏幕故障
C++ OpenGL SDL Screen Trouble
我又回来了,可能是一个小问题,我似乎无法在进行我的OpenGL/SDL冒险时解决。
这个程序带来了一个640x480px的SDL屏幕,但是里面什么也没有,甚至没有背景,它只是透明的通过它后面的屏幕上的任何东西,我不得不承认,我不确定为什么,尽管这可能是另一个愚蠢的错误。
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
SDL_Event event;
int main (int argc, char **argv)
{
bool quit = false;
init();
draw_square(0,0,0);
while (quit == false)
{
if( event.type == SDL_QUIT )
{
quit = true;
}
}
SDL_Quit();
return 0;
}
void init ()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(640,480,32,SDL_OPENGL);
SDL_WM_SetCaption( "OpenGL Test", NULL );
glClearColor( 0, 0, 0, 0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 0 , 640 , 480, 0, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void draw_square (int x, int y, int z)
{
glTranslatef(x,y,z);
glColor4f(1.0,1.0,1.0,1.0);
glBegin(GL_QUADS);
glVertex3f(0, 0 ,0);
glVertex3f(50,0 ,0);
glVertex3f(50,50,0);
glVertex3f(0, 50,0);
glEnd();
glPushMatrix();
}
非常感谢~ Michael
尽管设置了透明颜色,但您不会清除屏幕。你需要一个像glClear(GL_COLOR_BUFFER_BIT)这样的调用;实际执行清理。
此外,如果你想做静态绘制以外的任何事情,最好在循环内部持续渲染…很可能你什么都看不到,因为它希望你做双缓冲绘图,并需要你交换缓冲区,以看到屏幕上的结果。通常,这是在所有draw调用完成后的每次循环中完成的。我相信你可以用SDL_GL_SwapBuffers
在调用glClearColor时为alpha传递0。试着"1"。
使整个屏幕透明。但我没想到这真的管用,很高兴知道了。:)
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
SDL_Event event;
int main (int argc, char **argv)
{
bool quit = false;
你应该在这里调用SDL_Init,而不是将它委托给某个init函数。否则,当init被调用时,某些人(你?)可能会改变,从而破坏你的程序。实际上,主函数就是init函数。窗口创建应该在一个叫做create_window
或类似的函数中进行。
init();
从技术上讲,调用draw_square或事件循环之外的任何绘图函数都会带来麻烦。您看到的效果是:如果您的窗口暴露(最初显示),那么就会发生这种情况,但是通知程序需要更新内容的任何事件(因为它们被覆盖了)都没有效果。始终从事件循环中调用绘图函数。对于响应绘制事件的静态绘制,对于空闲部分中的动画场景。
draw_square(0,0,0);
while (quit == false) {
if( event.type == SDL_QUIT ) {
quit = true;
}
}
SDL_Quit();
return 0;
}
void init ()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(640,480,32,SDL_OPENGL);
SDL_WM_SetCaption( "OpenGL Test", NULL );
这是最常见的新手误解,认为OpenGL是"初始化的"。以下调用意味着在场景设置时调用,即在绘图函数开始时调用。
你还缺:
- 设置视口
- 实际清除场景(glClearColor只告诉在实际清除调用时要清除到哪个颜色;从技术上讲,它只是设置一些"寄存器",但不执行)。
所以这里不应该叫
glClearColor( 0, 0, 0, 0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 0 , 640 , 480, 0, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void draw_square (int x, int y, int z) {
glTranslatef(x,y,z);
glColor4f(1.0,1.0,1.0,1.0);
glBegin(GL_QUADS);
glVertex3f(0, 0 ,0);
glVertex3f(50,0 ,0);
glVertex3f(50,50,0);
glVertex3f(0, 50,0);
glEnd();
下一行是一个大大的WTF?!
glPushMatrix();
每个矩阵堆栈push必须与pop操作(glPopMatrix)平衡。然而,推入矩阵只有在它后面有一些变换时才有意义。事实并非如此。如果你在循环中调用draw_square,你会在32到128次迭代中耗尽最大矩阵堆栈深度(更可能是在较低的数字上)。
}
- 分段故障(堆芯转储)矢量
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 调试 CUDA MMU 故障
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- Winapi:屏幕截图未显示在窗口中
- 如何在快板的屏幕中显示子位图的绘制?
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 按回车键后输出屏幕关闭
- 要在屏幕上绘制一些小瓷砖,我应该使用 QQuickItem 还是 QQuickPaintedItem?
- 如何排除vulkan空白屏幕故障
- 分割故障仅在未打印到屏幕时发生
- OpenGL SDL屏幕故障