编译openGL后的空白屏幕

时间:2014-11-27 20:21:32

标签: c++ opengl glut

我是OpenGL的新手,我试图用两个三角形制作一个表面。我不知道这个代码在哪里出错了。我知道所有的位置和颜色都进入了三角形类并且正在制作三角形,但它没有输出。有人可以帮忙吗?

我试图获得Triangle类的输出,但它似乎没有工作。我不认为我调用显示功能的方式有任何问题。

代码:

#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
#include<iostream>
#include<vector>
using namespace std;

class Triangle
{
public:
  float position[9],color[3];
  Triangle()
  {}
  Triangle(float position_t[], float color_t[])
  {
    for(int i=0;i<9;i++)
      {position[i] = position_t[i];}
    for(int i=0;i<3;i++)
          {color[i]= color_t[i];}
  }
  void makeTriangle()
  {
    glBegin(GL_TRIANGLES);
        glColor3f(color[0],color[1],color[2]);glVertex3f(position[0],position[1],position[2]);
            glColor3f(color[0],color[1],color[2]);glVertex3f(position[3],position[4],position[5]);
        glColor3f(color[0],color[1],color[2]);glVertex3f(position[6],position[7],position[8]);
    glEnd();}
};

class Mesh
{
public:
  /*float center[3],position[9],color[3];
    float size;*/
  vector<Triangle> elements;
  float center[3],position[9],color[3];
  float size;

  Mesh(){}
  Mesh(float center_in[3], float color_in[3])
  {
    for (int i=0;i<3;i++)
      {
        color[i] = color_in[i];
        center[i] = center_in[i];
      }
}

  void getPositions()
  {
    position[0] = 1;position[1] = 1; position[2] = 1;
    position[3] = -1;position[4] = -1; position[5] = 1;
    position[6] = 1;position[7] = -1; position[8] = 1;
  }

  void getColor()
  {
    color[0] = 1; color[1]=0; color[2]=0;
  }

  static Mesh makeMesh()
  {
    Mesh a;
    a.elements.resize(2);
    a.getPositions();
    a.getColor();
    Triangle T(a.position,a.color);
    a.elements[0] = T;
    //Triangle O(2);
    //a.elements[1] = 0;
    return a;
  }

};

void render()
{
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  Mesh a;
  a.elements.resize(2);
  a.getPositions();
  a.getColor();
  Triangle T(a.position,a.color);  
  //vector<Mesh> m;
  //m.push_back(Mesh::makeMesh());
  glPushMatrix();
  T.makeTriangle();
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
  glutPostRedisplay();
}

完整代码:http://pastebin.com/xa3B7166

2 个答案:

答案 0 :(得分:2)

正如我在评论中建议你的那样,你没有设置gluLookat()功能。一切都在被吸引,但你只是没有看到它!

文档:https://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

答案 1 :(得分:1)

您的代码未指定任何转换。因此,您的坐标必须位于默认视图体积内,在所有坐标方向上均为[-1,1]。

或者更技术上,模型/视图/投影变换(或者如果使用可编程管道,在顶点着色器中应用的所有变换)将坐标转换为剪辑坐标空间,并在透视后划分为规范化设备坐标(又名NDC)空间。所有坐标的NDC空间范围均为[-1,1]。

如果您不应用任何转换(例如代码中的情况),则您的原始坐标必须位于NDC空间中。

使用您当前的坐标:

position[0] = 1;position[1] = 1; position[2] = 1;
position[3] = -1;position[4] = -1; position[5] = 1;
position[6] = 1;position[7] = -1; position[8] = 1;

所有z坐标的值均为1,这意味着整个三角形位于剪辑体积的边界上。要使其可见,您只需将z坐标设置为0:

position[0] = 1;position[1] = 1; position[2] = 0;
position[3] = -1;position[4] = -1; position[5] = 0;
position[6] = 1;position[7] = -1; position[8] = 0;

这使其在z方向的NDC空间内居中,顶点位于xy平面中的3个角上。因此,您将看到三角形覆盖的窗户的一半,沿对角线将其切成两半。

在OpenGL中,将原始坐标放在不同的坐标空间中,然后应用转换将它们放置在视图体积中,这当然很常见。

你可能已经意识到了这一点,但我认为无论如何我都会提到它:如果你刚刚开始学习OpenGL,我会建议你学习人们常说的内容&# 34;现代OpenGL&#34;。这包括OpenGL核心配置文件或OpenGL ES 2.0或更高版本。您现在使用的调用在较新版本的OpenGL中大部分已弃用,并且在Core Profile和ES中不再可用。现代OpenGL&#34;的最初障碍有点高,特别是因为你必须编写自己的着色器,但是你将会获得仍然是最新的知识。