繁体   English   中英

编译openGL后黑屏

[英]Blank Screen after compiling openGL

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

我试图仅从Triangle类获取输出,但似乎无法正常工作。 我认为我调用Display函数的方式没有任何问题。

码:

#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

正如我在注释中建议的那样,您未设置gluLookat()函数。 一切都在绘制中,但您只是不看它!

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

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

或更准确地说,模型/视图/投影转换(或如果使用可编程管线,则在顶点着色器中应用的所有转换)将坐标转换为剪辑坐标空间,然后将透视图划分为归一化的设备坐标 (aka 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,我建议您学习人们通常所说的“现代OpenGL”。 这包括OpenGL核心配置文件或OpenGL ES 2.0或更高版本。 您现在使用的调用在OpenGL的较新版本中已被弃用,并且在Core Profile和ES中不再可用。 对于“现代OpenGL”,最初的障碍要高一些,特别是因为您必须编写自己的着色器,但是您将获得获取当前知识的途径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM