我是OpenGL的新手,我一直在体验“黑屏效应”。我花了很多年时间试图找出为什么我没有看到任何东西而且我没有取得多大成功。我正在使用LWJGL,这是我正在尝试运行的代码片段:
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();
我使用的颜色与用于清除屏幕的颜色不同。
我的数据集非常大(超过10万分),所以我尝试每百分点进行一次绘图,但这不起作用。
我也试图在(40万,680 000)这样的位置上绘制积分,这会给我带来问题吗?我很确定32位浮点数应该能够处理这些值。
我很确定尺寸= 1的像素会尝试在屏幕上绘制为1像素,无论它与正投影的边界相比有多小。
也许我正在错误地处理投影矩阵。
答案 0 :(得分:2)
首先,就像我在评论中所说的那样,不要在投影矩阵上使用gluLookAt
。它定义了摄像机(视图),因此属于模型视图矩阵。这不是问题的原因,它也应该以这种方式工作,但它在概念上是错误的。
接下来,如果每帧调用此代码,则每帧都会将新矩阵推送到堆栈,而不调用glPopMatrix
。 glPushMatrix
通常会保存当前矩阵并稍后通过调用glPopMatrix
来恢复,因为每个其他命令(例如glLoadIdentity
,还有gluLookAt
和{{1}修改当前矩阵(由glOrtho
选择的矩阵)。
否则,您应始终记住场景的大小与查看量(案例中的glMatrixMode
参数)的关系。目前,您正在从glOrtho
点到点(368000, 6250000, -10000)
。与glOrtho参数一起,这应该将您的查看量定义为(368000, 6250000, 10000)
框。如果不通过任何局部变换进一步变换点,则它们的坐标应在这些间隔中可见。密切关注x区间的负数。这是因为您实际上围绕y轴旋转视图体积180度,因为您将视图定义为从-z到z,而GL的默认眼睛空间定义了从z到-z的查看器(对于原始对称的观看音量,这通常不是那么大的问题,但是你的高度不对称)。
虽然你的数字非常奇怪,但它们应该可以通过32位浮点数来处理。但是你真的确定你希望你的分数大小为100像素(如果支持的话)吗?
如果您只在正交视图中绘制2D点,我也不确定您是否需要这样的巨大深度范围。