我搜索了很多这个网站,但无法确切地找到我的问题。大多数类似的问题都使用了控制台和过剩库。但由于我是OpenGL和MFC的新手,并且是通过MFC的组合开始的,他们无法帮助我。
我出于自己的目的定制了课程COpenGLcontrol here in codeguru。 Here's the full customized class但是如果你对下载没兴趣,没问题我会解释相关的部分。这可能需要一段时间,所以我希望你会耐心等待!
首先我应该告诉你,我绘制这样一个矩形的目标是,我想在我的程序中创建该类的两个实例。
在较小的窗口中,图像始终处于zoom extent
模式,但在较大的窗口中,用户可以执行不同的导航任务。因此,每次例如图像被平移或缩放时,较大实例OnDraw
的{{1}}函数将被计算并传递到较小的窗口并在那里绘制以显示我们在哪里整个这么大的形象
我已按照以下步骤操作:
对投影矩阵堆叠进行编码并模拟2D场景
the extent rectangle
修改模型视图矩阵堆栈并设置相机(似乎我们正在寻找z轴的负方向)
void COpenGLControl::OnSize(UINT nType, int cx, int cy)
{
wglMakeCurrent(hdc, hrc);
CWnd::OnSize(nType, cx, cy);
if (0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED) return;
oglWindowWidth = cx;
oglWindowHeight = cy;
// Map the OpenGL coordinates.
glViewport(0, 0, oglWindowWidth, oglWindowHeight);
// Projection view
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set our current view perspective
glOrtho(-oglWindowWidth/2, oglWindowWidth/2, -oglWindowHeight/2,oglWindowHeight/2, 1, -1);
// Model view
glMatrixMode(GL_MODELVIEW);
wglMakeCurrent(NULL, NULL);
}
行void COpenGLControl::OnDraw(CDC *pDC)
{
// TODO: Camera controls
wglMakeCurrent(hdc,hrc);
glLoadIdentity();
gluLookAt(0,0,1,0,0,0,0,1,0);
glTranslatef(m_fPosX, m_fPosY, 0.0f);
glScalef(m_fZoom,m_fZoom,1.0);
setViewRectangle();
if (WantToDrawRectangle)
DrawRectangleOnTopOfTexture();
wglMakeCurrent(NULL, NULL);
}
用于计算类setViewRectangle()
其中一个公共成员数据,如果用户需要,vector<int>ViewRectangle
其他公共成员数据将用于绘制长方形。这是因为我们不希望在大窗口中绘制这样的矩形,而是在较小的窗口中绘制。较小的将使用较大的数据。但我还没有实现如何在一个类的两个实例之间实时传递这些数据!
所以,只是为了尝试上课,我已将vector<int>RectangleToDraw
的初始值设置如下,因为窗口是由RectangleToDraw
设置的[0,0,573,543]
,我认为应该绘制矩形在中心,在纹理的顶部。但事实并非如此
反正
应用将在OnTimer中调用的纹理的代码
glOrtho
要计算void COpenGLControl::oglDrawScene(void)
{
wglMakeCurrent(hdc, hrc);
float x0 = -ImageWidth/2; // top left corner of image
float y0 = ImageHeight/2;
float x1 = x0 + ImageWidth; // bottom right corner of image
float y1 = y0 - ImageHeight;
glBegin(GL_TRIANGLE_STRIP);
{
glTexCoord2f(0,1);glVertex2f(x0, y1);
glTexCoord2f(0,0);glVertex2f(x0, y0);
glTexCoord2f(1,1);glVertex2f(x1, y1);
glTexCoord2f(1,0);glVertex2f(x1, y0);
}
glEnd();
wglMakeCurrent(NULL, NULL);
}
的代码,该代码将传递给该类的另一个实例
ViewRectangle
在纹理上绘制矩形的代码
void COpenGLControl::setViewRectangle()
{
ViewRectangle.at(0) = m_fPosX - oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(1) = m_fPosY - oglWindowHeight*m_fZoomInverse/2;
ViewRectangle.at(2) = m_fPosX + oglWindowWidth*m_fZoomInverse/2;
ViewRectangle.at(3) = m_fPosY + oglWindowHeight*m_fZoomInverse/2;
}
即使在上述函数中使用void COpenGLControl::DrawRectangleOnTopOfTexture()
{
wglMakeCurrent(hdc, hrc);
glColor3f(1.0f,0.0f,0.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_QUADS);
glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(1),0.5);
glVertex3f(RectangleToDraw.at(0),RectangleToDraw.at(3),0.5);
glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(3),0.5);
glVertex3f(RectangleToDraw.at(2),RectangleToDraw.at(1),0.5);
glEnd();
SwapBuffers(hdc);
wglMakeCurrent(NULL, NULL);
}
也没有任何区别,在这两种情况下,我遇到:
不要混淆。在两个窗口上应用错误绘图的原因是我在构造函数中设置了:
glVertex2f
只是为了尝试如何在纹理上绘制一个矩形。在写完正确的代码后,我会将它们设置为真实模式。告诉我
如何在纹理上绘制一个矩形,最好是以面向对象的方式绘制,我需要实时渲染?
答案 0 :(得分:1)
由于现代OpenGL中不推荐edge flags
,我会避免使用多边形填充模式来绘制轮廓。如果我正确理解了你的截图,你会在用于绘制矩形的两个三角形的内边缘上获得线条。
而是绘制一个使用矩形的4个角的红色GL_LINE_LOOP
...这是出于可移植性原因的首选技术,因为GL_QUADS
也已弃用。
glColor3f (1.0f, 0.0f, 0.0f);
glBegin (GL_LINE_LOOP);
glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (1), -1.0f);
glVertex3f (RectangleToDraw.at (0), RectangleToDraw.at (3), -1.0f);
glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (3), -1.0f);
glVertex3f (RectangleToDraw.at (2), RectangleToDraw.at (1), -1.0f);
glEnd ();
此外,您的屏幕截图似乎正在尝试纹理轮廓。在绘制线条之前禁用GL_TEXTURE_2D
。