2011-09-05 161 views
1

我是OpenGL的新手,我一直在体验“黑屏效果”。我花了很多年试图弄清楚为什么我什么都看不到,也没有太多成功。我使用LWJGL,这里是我试图运行一段代码:黑色屏幕效果 - OpenGL

glViewport(0,0,DISPLAY_WIDTH,DISPLAY_HEIGHT); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(6200000.0f, 6300000.0f, 350000.0f, 380000.0f, -10000000.0f, 100000000.0f); 
gluLookAt(368000.0f, 6250000.0f, -10000.0f, 368000.0f, 6250000.0f, 10000.0f, 0.0f,1.0f,0.0f); 
glPushMatrix(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glPushMatrix(); 

if(ready) 
{ 
glColor3f(1.0f,0.5f,1.0f); 
glPointSize(100); 
glBegin(GL_POINTS); 
    for(int i = 0; i < data.length; i += 100) 
    { 
     glColor3f(1.0f,1.0f,1.0f); 
     glVertex3f((float) data[i][1], (float) data[i][2],0.0f); 
     System.out.println((float) data[i][1] + ", " + (float) data[i][2]); 
    } 
glEnd(); 

System.out.println("\n\nfinished drawing\n\n"); 
glFlush(); 

我用不同的颜色,我用来清除画面绘制。

我的数据集相当大(超过100000点),所以我尝试绘制每百分点,但这不起作用。

我也试图在(400 000,6 800 000)这样的位置上画点,这会给我带来问题吗?我很确定32位浮点数应该能够处理这些值。

我相当肯定,size = 1的像素会尝试在屏幕上绘制为1像素,而不管它与正交投影的边界相比有多小。

也许我正在处理投影矩阵不正确。

+4

这不会导致您的问题,但一次又一次:**不要在投影矩阵上使用'gluLookAt' **。它定义了摄像机/视图,因此属于模型视图矩阵。 –

回答

2

首先,就像我在评论中所说的,在投影矩阵上不使用gluLookAt。它定义了相机(视图),因此属于模型视图矩阵。这不是你的问题的原因,它也应该以这种方式工作,但它在概念上是错误的。接下来,如果您每帧都调用此代码,则可以将每个帧的新矩阵推入堆栈,而不会呼叫glPopMatrixglPushMatrix通常用于保存当前矩阵并稍后通过调用glPopMatrix来恢复它,因为每个其他命令(如glLoadIdentity,还有gluLookAtglOrtho)都会修改当前矩阵(由glMatrixMode选择的矩阵)。

否则,您应该始终保持场景的大小与观看音量相关(请参阅您的案例中的glOrtho参数)。此刻你正在从点(368000, 6250000, -10000)到点(368000, 6250000, 10000)。与glOrtho参数一起,这应该将您的观看音量定义为[368000-6300000 , 368000-6200000] x [6250000+350000 , 6250000+380000] x [-10000000-10000, 100000000-10000]框。如果你没有通过局部变换进一步变换你的点,他们的坐标应该在这些间隔内可见。密切关注x间隔中的负数。这是因为您实际上将视图体积绕y轴旋转了180度,因为您已将视图定义为从-z到z,而GL的默认眼图空间将查看器定义为从z到-z (对于原点对称的观看音量来说,这通常不是什么大问题,但是你的对称性非常高)。

虽然你的数字是非常奇怪的,他们应该可以通过32位浮点数来操作。但是,你真的确定你想要你的点数有100个像素的大小(如果这甚至支持)?

如果您只在正交视图中绘制2D点,我也不确定是否需要深度范围这样的巨大

+0

嘿,谢谢你的回复! 我设法让它工作,我明白你在说什么,不断将相同的矩阵推入堆栈。 我想我需要重读那一章关于红皮书的投影和model_view矩阵。 有没有其他的书籍可以推荐? 再次,谢谢! –

+0

我认为,红皮书很好地解释了它。这也是我第一次听说有关转型渠道。你也可以看看[这个问题](http://stackoverflow.com/questions/7377912/opengl-define-vertex-position-in-pixels/)以及在那里发布的答案和链接,以便更深入地了解OpenGL的转换管道。特别是[这个链接](http://www.songho.ca/opengl/gl_transform.html)似乎有一些很好的信息。 –

+0

@Matthew顺便说一句,如果答案对你有帮助,接受将不胜感激。这不是一个需求,但也许你还没有听说过这个功能。 –