我如何在 openGL c++ 中的同一个 window 中绘制两个对象?
How can i draw two object in the same window in openGL c++?
我正在尝试使用 OpenGL 在 Visual Studio 中绘制 2 个不同的对象。
我似乎无法在同一个 window 中同时绘制两个对象。我尝试将两个对象放在同一个函数中,但它只在 window.
中显示一个对象
#include<Windows.h>
#include<glut.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void init()
{
glClearColor(0, 0.4, 1, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 800, 0.0, 600);
}
void kapal()
{
//badan
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(20 , 100);
glVertex2i(160 , 100);
glColor3ub(107, 65, 17);
glVertex2i(140 , 60 );
glVertex2i(40 , 60);
glColor3ub(9, 5, 0);
glEnd();
//tiang
glColor3ub(97, 65, 28);
glLineWidth(5);
glBegin(GL_LINES);
glVertex2i(90 ,100 );
glVertex2i(90 , 160 );
glEnd();
//layar
glColor3ub(215, 215, 215);
glBegin(GL_TRIANGLES);
glVertex2i(90, 160 );
glVertex2i(120 , 130 );
glVertex2i(90 , 130);
glEnd();
glFlush();
}
void mobil()
{
//bawah
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(100, 170);
glVertex2i(100, 230);
glVertex2i(450, 230);
glVertex2i(450, 170);
glEnd();
//atas
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(150, 230);
glVertex2i(200, 270);
glVertex2i(400, 270);
glVertex2i(450, 230);
glEnd();
glFlush();
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
kapal();
mobil();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("Kapal APi ");
init();
glutDisplayFunc(display);
glutMainLoop();
}
如您所见,void kapal()
是第一个对象,void mobil()
是第二个对象。
这是我得到的结果:
有什么方法可以解决这个问题,这样我就可以在同一个对象中显示两个对象 windows?
问题是您在绘制对象之前调用了 glClear(GL_COLOR_BUFFER_BIT);
。
在绘制任何东西之前清除帧缓冲区,但不要在绘制特定对象之前清除帧缓冲区。
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // <-- this is OK
kapal();
mobil();
glutSwapBuffers();
}
void kapal()
{
//badan
// glClear(GL_COLOR_BUFFER_BIT); <--- DELETE
// [...]
}
void mobil()
{
//bawah
// glClear(GL_COLOR_BUFFER_BIT); <--- DELETE
// [...]
}
我正在尝试使用 OpenGL 在 Visual Studio 中绘制 2 个不同的对象。 我似乎无法在同一个 window 中同时绘制两个对象。我尝试将两个对象放在同一个函数中,但它只在 window.
中显示一个对象#include<Windows.h>
#include<glut.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void init()
{
glClearColor(0, 0.4, 1, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 800, 0.0, 600);
}
void kapal()
{
//badan
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(20 , 100);
glVertex2i(160 , 100);
glColor3ub(107, 65, 17);
glVertex2i(140 , 60 );
glVertex2i(40 , 60);
glColor3ub(9, 5, 0);
glEnd();
//tiang
glColor3ub(97, 65, 28);
glLineWidth(5);
glBegin(GL_LINES);
glVertex2i(90 ,100 );
glVertex2i(90 , 160 );
glEnd();
//layar
glColor3ub(215, 215, 215);
glBegin(GL_TRIANGLES);
glVertex2i(90, 160 );
glVertex2i(120 , 130 );
glVertex2i(90 , 130);
glEnd();
glFlush();
}
void mobil()
{
//bawah
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(100, 170);
glVertex2i(100, 230);
glVertex2i(450, 230);
glVertex2i(450, 170);
glEnd();
//atas
glBegin(GL_POLYGON);
glColor3ub(148, 111, 70);
glVertex2i(150, 230);
glVertex2i(200, 270);
glVertex2i(400, 270);
glVertex2i(450, 230);
glEnd();
glFlush();
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
kapal();
mobil();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("Kapal APi ");
init();
glutDisplayFunc(display);
glutMainLoop();
}
如您所见,void kapal()
是第一个对象,void mobil()
是第二个对象。
这是我得到的结果:
有什么方法可以解决这个问题,这样我就可以在同一个对象中显示两个对象 windows?
问题是您在绘制对象之前调用了 glClear(GL_COLOR_BUFFER_BIT);
。
在绘制任何东西之前清除帧缓冲区,但不要在绘制特定对象之前清除帧缓冲区。
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // <-- this is OK
kapal();
mobil();
glutSwapBuffers();
}
void kapal()
{
//badan
// glClear(GL_COLOR_BUFFER_BIT); <--- DELETE
// [...]
}
void mobil()
{
//bawah
// glClear(GL_COLOR_BUFFER_BIT); <--- DELETE
// [...]
}