Я создал приложение SDI MFC, где дочерний элемент CView рисует куб с OpenGL. Этот куб рисуется следующей функцией:События MFC и OpenGL для рисования
void CglSDI3View::setupScene()
{
wglMakeCurrent(m_hDC, m_hRC);
// Clear color and depth buffer bits
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Wireframe Mode
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
// Front Side
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
// Back Side
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
// Top Side
(...)
glEnd();
SwapBuffers(m_hDC);
}
У меня нет установленного таймера. Rigth теперь моя OnDraw
функция выглядит следующим образом:
void CglSDI3View::OnDraw(CDC* /*pDC*/)
{
CglSDI3Doc* pDoc = GetDocument();
wglMakeCurrent(m_hDC, m_hRC);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -m_fZoom);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);
glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f);
setupScene();
wglMakeCurrent(NULL, NULL);
ValidateRect(NULL);
}
где m_fRotX
, m_fRotY
, m_fPosX
и т.д. масштабирования и коэффициенты перевода. Мой вопрос: мне нужно позвонить setupScene()
на каждый звонок OnDraw()
? Или это можно оптимизировать? Другими словами, нужно ли переписывать куб на каждый вызов OnDraw()
или есть ли способ сделать это только один раз, а затем применить только преобразования?
Обратите внимание, что в будущем функция setupScene()
будет нарисовать огромное облако точек с миллионами цветных точек, поэтому это необходимо оптимизировать как можно больше.
Возможно, вы можете использовать механизм VBO OpenGL? – Nox
@ TheRealNox: Нет, вы не можете, потому что VBOs - это всего лишь куча памяти, управляемая OpenGL. – datenwolf