gpt4 book ai didi

c++ - wxWidgets 中简单的 openGL 显示循环期间不完整的场景重绘

转载 作者:行者123 更新时间:2023-11-30 04:31:41 24 4
gpt4 key购买 nike

我正在努力让一个简单的动画循环在 wxWidets openGl 应用程序中运行。在每次迭代显示之前,循环迭代没有完全绘制屏幕时遇到问题。似乎 .1s 足以完全绘制简单的场景....任何人都可以告诉我为什么不能吗?

谢谢!

#include <wx/wx.h>
#include <wx/glcanvas.h>

#ifdef __WXMAC__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#ifndef WIN32
#include <unistd.h> // FIXME: ¿This work/necessary in Windows?
//Not necessary, but if it was, it needs to be replaced by process.h AND io.h
#endif

//#include "GlBox.cpp"

#include <iostream>
using namespace std;



class wxGLCanvasSubClass: public wxGLCanvas {

public:
wxGLCanvasSubClass(wxFrame* parent);
void Paintit(wxPaintEvent& event);
void Render();
protected:
DECLARE_EVENT_TABLE()

//GlBox myBox;
};

wxGLCanvasSubClass *thing;

static void timerRender(int count)
{
thing->Render();
cout << "render timeout was called \n";

glutTimerFunc(25, timerRender, 0);

}

static void myIdleFunc()
{
cout << "idleing \n";
cout.flush();
}

static void setRender(wxGLCanvasSubClass *thing2)
{
thing = thing2;
cout << "global thing was set \n";

glutTimerFunc(1100, timerRender, 0);
}

BEGIN_EVENT_TABLE(wxGLCanvasSubClass, wxGLCanvas)
EVT_PAINT (wxGLCanvasSubClass::Paintit)
END_EVENT_TABLE()

wxGLCanvasSubClass::wxGLCanvasSubClass(wxFrame *parent)
:wxGLCanvas(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas")){
int argc = 1;
char* argv[1] = { wxString((wxTheApp->argv)[0]).char_str() };

/*
NOTE: this example uses GLUT in order to have a free teapot model
to display, to show 3D capabilities. GLUT, however, seems to cause problems
on some systems. If you meet problems, first try commenting out glutInit(),
then try comeenting out all glut code
*/
glutInit(&argc, argv);

glutIdleFunc(myIdleFunc);
}


void wxGLCanvasSubClass::Paintit(wxPaintEvent& WXUNUSED(event)){
Render();
}

void wxGLCanvasSubClass::Render()
{
SetCurrent();
wxPaintDC(this);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, (GLint)GetSize().x, (GLint)GetSize().y);

glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glColor3f(0.4, 0.5, 0.4);
glVertex2f(0.0, -0.8);
glEnd();



// using a little of glut
glColor4f(0,0,1,1);
glutWireTeapot(0.4);

glLoadIdentity();
glColor4f(2,0,1,1);
glutWireTeapot(0.6);

//myBox.getIt();


SwapBuffers();
glFlush();
//

}




class MyApp: public wxApp
{
virtual bool OnInit();

void onIdle(wxIdleEvent& evt);

time_t lastEvent;
bool slept ;

wxGLCanvas * MyGLCanvas;
wxGLCanvasSubClass * myCanvas;
};


IMPLEMENT_APP(MyApp)


bool MyApp::OnInit()
{
slept = false;
lastEvent = time( &lastEvent);
wxFrame *frame = new wxFrame((wxFrame *)NULL, -1, wxT("Hello GL World"), wxPoint(50,50), wxSize(200,200));
myCanvas = new wxGLCanvasSubClass(frame);

frame->Show(TRUE);

Connect( wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(MyApp::onIdle) );

return TRUE;
}

void MyApp::onIdle(wxIdleEvent& evt)
{

if(slept)
{
slept = false;
cout << "event hit " << lastEvent;
myCanvas->Render();
evt.RequestMore();

} else {
cout << "idleing \n " << lastEvent;
usleep(100000);
slept = true;
evt.RequestMore();

}

}

最佳答案

当谈到 OpenGL 时,GLUT 并不是必须使用的东西。 GLUT是第三方框架,wxWidgets是第三方框架。并且都实现了一个事件循环。

你不应该混合这些。只使用 wxWidgets,它提供了一个非常好的 OpenGL 小部件。

关于c++ - wxWidgets 中简单的 openGL 显示循环期间不完整的场景重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8101164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com