如何在 opengl 中使用子窗口
How to use subwindows in opengl
我正在尝试使用子窗口通过旋转曲线从曲线中生成对象。我能够生成所有曲线。现在我也把窗口分成两部分。我想在左侧子窗口中绘制曲线,并希望通过沿右侧的轴旋转来生成实体。我无法在右侧子窗口中绘制任何内容。
编辑:
好的,这就是我在左侧绘制点的方式。这些点基本上是用户的点击。我捕获这些事件并制作一个列表,然后使用 for 循环打印它们。
// This function takes a list of points and draws the dots in the screen
void drawDot(vector<vec2> listPts)
{
glBegin(GL_POINTS);
glColor3f(1.0,1.0,1.0);
if(j==0) // J=0 means points are being added using add option, no insert after is currently being used
{
for(int i=0;i<listPts.size();i++)
{
glVertex2i(listPts[i].x,listPts[i].y);
}
}
else if(j!=0)// this else part is for making selected points look red, as for this j!=0
{
for(int i=0;i<listPts.size();i++)
{
if(i==j ) // make only the selected point red
{
glColor3f(1.0,0.0,0.0);
glVertex2i(listPts[i].x,listPts[i].y);
}
else // rest all the points are same as before i.e. white
{
glColor3f(1.0,1.0,1.0);
glVertex2i(listPts[i].x,listPts[i].y);
}
}
}
glEnd();
glFlush();
}
现在假设我有一组点。我只想在右侧的子窗口中绘制相同的点,看看它是否正常工作。所以,我创建了一个按钮,每当我按下按钮时,我想切换到正确的窗口并绘制一些东西。我在VS2010中使用了调试,并检查了是否完全调用了绘图功能并且正在调用它,但屏幕中仍然没有任何内容。
这是我用来在第二个窗口中绘制的函数。
void drawDotWin2(vector<vec2> listPts)
{
glBegin(GL_POINTS);
glColor3f(1.0,1.0,1.0);
for(int i=0;i<listPts.size();i++)
{
glVertex2i(listPts[i].x,listPts[i].y);
}
glEnd();
glutWireTeapot (0.5);
glFlush();
}
当我按下按钮时,调用了上述函数,但没有任何反应。我的坐标系有误吗?不过,我没有做太多设置坐标系的工作。
我建议尽可能避免使用 GLUT 实用程序,尤其是在应用程序实现中并非绝对必要时;glutCreateSubWindow可能是其中之一。
如果需要将窗口拆分为不同的部分,请了解如何使用 glViewport。
例如,如果主窗口的工作区为 800x600 像素,并且我想水平拆分窗口,则绘制例程将为:
void draw()
{
// Draw on left side
glViewport(0, 0, 400, 600);
glClear(...);
gluOrtho2D(0, 0, 400, 600);
// ... DrawCommands1
// Draw on left side
glViewport(400, 0, 400, 600);
glClear(...);
gluOrtho2D(0, 0, 400, 600);
// ... DrawCommands2
}
这样,两张图纸就不会重叠。在每侧绘制的基元由定义的视口区域剪裁,视口区域以相对于主窗口工作区的像素坐标定义。
投影矩阵(在上面的例子中是2D正交的(是相对于视口的,而不是相对于窗口区域,实际上你不需要担心视口的位置。
另请注意,每个 GLUT 子窗口都会创建一个 OpenGL 上下文,实际上每个 GLUT 子窗口都拥有自己的状态,状态更改不会影响其他子窗口。相反,在我的回答中,这两个例程共享完全相同的OpenGL上下文。
- 在 opengl 中渲染 obj 文件时出现黑窗口
- 无法启动 OpenGL 窗口
- C++ 如何在 OpenGL 程序中远程调用控制台窗口
- OpenGL C++(制作简单窗口时抛出错误)
- 如何防止opengl绘图拉伸到窗口大小?
- 文本在窗口 Opengl 上不可见
- OpenGL 纹理会导致 ImGUI 窗口永久失焦
- 我如何将Win32窗口渲染到OpenGL纹理
- 如何将 Unity 上下文导入 OpenGL 窗口
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- SDL2 OpenGL窗口立即关闭
- OpenGL纹理闪烁/有时在窗口大小上移动
- 如何在窗口外绘制图形(OpenGL GLFW)
- OpenGL 不会创建所需大小的窗口
- 使用 OpenGL 窗口(如 GLFW)或周围的窗口(如 GTK 或 SDL)是否存在性能差异?
- 在窗口大小上绘制的OpenGL消失
- 在无窗口 GLX 程序中读取 OpenGL 的默认帧缓冲
- 异步渲染到 Qt OpenGL 窗口
- openGL PBO 使用 wglcontext,而不是创建窗口
- 使用64位 自定义窗口形状(ETC平滑的角落不是矩形)在Windows中使用C 创建OpenGL窗口