尝试在屏幕上显示绘图时的黑屏

时间:2016-03-17 08:29:41

标签: c++ c opengl

我刚开始学习openGL,现在我遇到了一个问题,当我尝试制作一个可调整大小的窗口时,窗口上没有显示该对象,我无法理解为什么。因此,如果有人能够快速查看它的错误,那将是一个很大的帮助。最好的问候。

#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>

void initLights();
void reshape(int width, int height);
void display();
void renderScene();
int w;
int h;
int main(int argc, char** argv) {
  glutInit(&argc, argv); //metodi se predaje dva argumenta - andresa varijable koja sadrži broj argumenata iz komandne linije, te polje tih argumenata
  glutInitDisplayMode(GLUT_DOUBLE);
   glEnable(GL_LIGHTING);
  glutInitWindowSize(w, h); //dimenzije prozora u pikselima
  glutInitWindowPosition(0, 0); //pozicija gornjeg lijevo kuta u kojem će se scena iscrtati, prvi argument je x, drugi y
  glutCreateWindow("Primjer 1"); //stvaranje prozora u kojem će se iscrtati scena ("Naziv prozora")
  glutDisplayFunc(display); //registracija metode display, vraća podatak tipa int koji se može koristiti kao identifikator prozora koji se kasnije koristi za uništavanje prozora
  glutReshapeFunc(reshape); //registracija metode reshape
  glutMainLoop(); //beskonačna petlja osluškivanja, generiranja događaja i pozivanje registriranih metoda koja obrađuje događaje
}
void initLights() {
  // set up light colors (ambient, diffuse, specular)
  GLfloat lightKa[] = {.5f, .5f, .5f, 1.0f}; // ambient light
  GLfloat lightKd[] = {.7f, .7f, .7f, 1.0f}; // diffuse light
  GLfloat lightKs[] = {1, 1, 1, 1}; // specular light
  glLightfv(GL_LIGHT0, GL_AMBIENT, lightKa);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightKd);
  glLightfv(GL_LIGHT0, GL_SPECULAR, lightKs);
  // position the light
  float lightPos[4] = {0, 0, 20, 1}; // positional light
  glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  glEnable(GL_LIGHT0); // MUST enable each light source after configuration
}

void display() { //iscrtavanje scene, radi se pozivom metode glutDisplayFunc(display); kojoj kao argument predajemo pokazivač na samu metodu
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //brisanje površine platna, boja pozadine platna
  glClear(GL_COLOR_BUFFER_BIT); //popunjavanje čitave površine platna prethodno definiranom bojom
  glLoadIdentity();
  // crtanje scene:
  renderScene();
  glutSwapBuffers();
}

void toPerspective(){
  glDisable(GL_DEPTH_TEST); //isključivanje provjere z-spremnika koji se koristi u 3D sceni
  glViewport(0, 0,w, h); //definicija dijela prozora koji prikazuje samu scenu 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

 gluPerspective(60, (double)w/(double)h, 1, 256);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();



}

void reshape(int width, int height) { //funkcija koja se koristi za promjenu veličine prozora
w = width;
h = height;
toPerspective();
}

void renderScene() {
  glPointSize(6.0f);
  glColor3f(0.0f, 1.0f, 1.0f);

  glBegin(GL_POINTS);
  glVertex2i(50, 50);
  glVertex2i(150, 150);
  glVertex2i(2, 2);
  glVertex2i(4, 4);
  glEnd();

  glBegin(GL_LINE_STRIP);
  glVertex2i(50, 50);              
  glVertex2i(150, 150);             
  glVertex2i(50, 150);
  glVertex2i(50, 50);
  glEnd();
  glVertex2i(250, 250);             

}

1 个答案:

答案 0 :(得分:1)

在您的代码中,由于modelviewmatrix是一个单位矩阵,因此摄像机位于(0,0,0)。现在,投影构造的近平面为1,这意味着在z = 0处绘制的模型位于视锥体之外并被剔除。

另一个问题:您在glVertex2i之外至少调用一次glBegin/glEnd会导致OpenGL错误。

关于坐标:注意,除非您指定适当的投影,否则OpenGL中的绘图不会出现在像素坐标中。