2014-12-30 2 views
0

Я создал приложение 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() будет нарисовать огромное облако точек с миллионами цветных точек, поэтому это необходимо оптимизировать как можно больше.

+0

Возможно, вы можете использовать механизм VBO OpenGL? – Nox

+0

@ TheRealNox: Нет, вы не можете, потому что VBOs - это всего лишь куча памяти, управляемая OpenGL. – datenwolf

ответ

0

Название "setupScene" вводит в заблуждение. OpenGL не имеет сцен. В OpenGL нет моделей. OpenGL - это не граф сцены.

OpenGL - это «немой» API-интерфейс рисования. Он рисует точки, линии и треугольники, по одному за раз. А после рисования чего-то он уже забывает об этом.

Так что да, вы должны перерисовать, если хотите внести некоторые изменения в рисунок, потому что, ну, это просто рисунок и ничего более. Нет никакой сохраненной сцены, которую OpenGL мог бы манипулировать.

Так переименуйте «setupScene» в «drawScene» и используйте его, как это предлагает название.