[英]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.