OpenGL上的黑屏

时间:2018-10-05 01:07:46

标签: c++ opengl

我有一个openGL程序,该程序绘制了3栋房屋和其他东西,但是当我用gcc编译时,只是出现了黑屏-而所有我的openGL程序都在发生这种情况

我该怎么办?

PS:如果我调整屏幕大小,则会出现绘制的图像。

OS:macOS Mojave PC:MacBook Air 2017

Visual Studio Code开发

gcc版本:10.0.0

#include <stdlib.h>
#include <stdio.h>
#include <glut/glut.h>
#include <math.h>
#define PI 3.14159265358979324
//teto

bool teto = true;
bool base = true;
bool janela = true;
bool porta = true;

void Teto(void)
{
    glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(20.0, 10.0, 0.0);
    glVertex3f(40.0, 0.0, 0.0);
    glEnd();
}
void Base(void)
{
    glBegin(GL_QUADS);
    glColor3f(0, 1, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 30.0, 0.0);
    glVertex3f(35.0, 30.0, 0.0);
    glVertex3f(35.0, 0.0, 0.0);
    glEnd();
}

void Porta(void)
{
    glBegin(GL_QUADS);
    glColor3f(0, 0, 1);
    glVertex3f(0, 0.0, 0.0);
    glVertex3f(0, 10.0, 0.0);
    glVertex3f(5.0, 10.0, 0.0);
    glVertex3f(5.0, 0.0, 0.0);
    glEnd();
}

void Janela()
{
    glBegin(GL_QUADS);
    glColor3f(0, 0, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 5.0, 0.0);
    glVertex3f(5.0, 5.0, 0.0);
    glVertex3f(5.0, 0.0, 0.0);
    glEnd();
}

void Sun()
{
    static float R = 10.0; // Radius of circle.
    static float X = 20.0; // X-coordinate of center of circle.
    static float Y = 70.0; // Y-coordinate of center of circle.
    static int numVertices = 30; // Number of vertices on circle.
   float t = 0; // Angle parameter.
   int i;

   glClear(GL_COLOR_BUFFER_BIT);

   glColor3f(1.0, 1.0, 0.0);

   // Draw a line loop with vertices at equal angles apart on a circle
   // with center at (X, Y) and radius R, The vertices are colored randomly.
   glBegin(GL_LINE_LOOP);
      for(i = 0; i < numVertices; ++i)
      {
         glColor3f(1.0, 1.0, 0.0);
         glVertex3f(X + R * cos(t), Y + R * sin(t), 0.0);
         t += 2 * PI / numVertices;
      }
   glEnd();
}
// Drawing routine.
void drawHouse(void)
{
    glPopMatrix();
    glPushMatrix();
    //glPopMatrix();
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    //Sun();
    glTranslatef(30.0f,30.0f,0.0f);
    if(teto)
        Teto();
    glTranslatef(3.0f,-30.0f,0.0f);
    if(base)
        Base();
    glTranslatef(15.0f,0.0f,0.0f);
    if(porta)
        Porta();
    glTranslatef(-10.0f,20.0f,0.0f);
    if(janela)
        Janela();
    glTranslatef(20.0f,0.0f,0.0f);
    if(janela)
        Janela();


    glPopMatrix();
    glScalef(0.75f, 0.75f, 0.0f); 
    glTranslatef(3.0f,30.0f,0.0f);
    if(teto)
        Teto();
    glTranslatef(3.0f,-30.0f,0.0f);
    if(base)
        Base();
    glTranslatef(15.0f,0.0f,0.0f);
    if(porta)
        Porta();
    glTranslatef(-10.0f,20.0f,0.0f);
    if(janela)
        Janela();
    glTranslatef(20.0f,0.0f,0.0f);
    if(janela)
        Janela();


    glPopMatrix();
    glScalef(1.75f, 1.75f, 0.0f);
    glScalef(1.25f, 1.25f, 0.0f);
    //glScalef(0.75f, 0.75f, 0.0f); 
    glTranslatef(25.0f,20.0f,0.0f);
    if(teto)
        Teto();
    glTranslatef(3.0f,-30.0f,0.0f);
    if(base)
        Base();
    glTranslatef(15.0f,0.0f,0.0f);
    if(porta)
        Porta();
    glTranslatef(-10.0f,20.0f,0.0f);
    if(janela)
        Janela();
    glTranslatef(20.0f,0.0f,0.0f);
    if(janela)
        Janela();
    glFlush();


}

// Initialization routine.
void setup(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
}

// OpenGL window reshape routine.
void resize(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 130.0, 0.0, 100.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

// Keyboard input processing routine.
void keyInput(unsigned char key, int x, int y)
{
    switch(key)
    {
        case 27:
            exit(0);
            break;
        case 'c':
            base = !base;
            break;
        case 't':
            teto = !teto;
            break;
        case 'j':
            janela = !janela;
            break;
        case 'p':
            porta = !porta;
            break;
        case 's':
            Sun();
            //glRotatef(10.0, 0.0f, 0.0f, 1.0f);
            break;
        default:
            break;
    }
    glutPostRedisplay();
}

// Main routine.
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(900, 700);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("House.cpp");
    glutDisplayFunc(drawHouse);
    glutReshapeFunc(resize);
    glutKeyboardFunc(keyInput);  
    setup(); 
    glutMainLoop();  
}

0 个答案:

没有答案