Черный экранный эффект - OpenGL - PullRequest
1 голос
/ 05 сентября 2011

Я новичок в 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();

Я рисую другим цветом, который я использовал для очистки экрана.

Мойнабор данных довольно большой (более 100 000 точек), поэтому я попытался построить каждую сотую точку, но это не работает.

Я также пытаюсь построить точки в таких позициях, как (400 000, 6 800 000).это дарит мне проблемы?Я почти уверен, что 32-разрядные числа с плавающей запятой должны обрабатывать эти значения.

Я почти уверен, что пиксель с размером = 1 будет пытаться построить как 1 пиксель на экране, независимо от того, насколько малэто сравнивается с границами ортографической проекции.

Возможно, я неправильно разбираюсь с матрицей проекции.

1 Ответ

2 голосов
/ 05 сентября 2011

Во-первых, как сказано в моем комментарии, не используйте gluLookAt в матрице проекции.Он определяет камеру (вид) и поэтому относится к модели вид матрица.Это не является причиной вашей проблемы, и это также должно работать таким образом, но это концептуально неправильно.

Далее, если вы вызываете этот код каждый кадр, вы помещаете новую матрицу в стек каждый кадр,без звонка glPopMatrix.glPushMatrix обычно используется для сохранения текущей матрицы и ее последующего восстановления с вызовом glPopMatrix, потому что каждая другая команда (например, glLoadIdentity, но также gluLookAt и glOrtho) изменяет текущую матрицу (выбирается glMatrixMode).

В противном случае вы всегда должны помнить размер вашей сцены относительно громкости просмотра (параметры glOrtho в вашем случае).В данный момент вы смотрите из точки (368000, 6250000, -10000) в точку (368000, 6250000, 10000).Вместе с параметрами glOrtho это должно определить вашу громкость просмотра как поле [368000-6300000 , 368000-6200000] x [6250000+350000 , 6250000+380000] x [-10000000-10000, 100000000-10000].Если вы не преобразуете свои точки дальше какими-либо локальными преобразованиями, их координаты должны отображаться в этих интервалах.Следите за минусом в x-интервале.Это связано с тем, что вы на самом деле повернули объем просмотра на 180 градусов вокруг оси y, потому что вы определили вид, чтобы смотреть от -z до z, тогда как пространство глаз по умолчанию GL определяет зрителя, чтобы смотреть от z до -z(что обычно не является большой проблемой с исходной симметричной громкостью просмотра, но ваша сильно асимметрична).

Несмотря на то, что ваши числа очень странные, они должны обрабатываться 32-битными числами.Но действительно ли вы уверены, что хотите, чтобы ваши точки имели размер 100 пикселей (если это даже поддерживается)?

И если вы рисуете только 2D-точки в ортографическом виде, я также не уверен, что вынужен такой ОГРОМНЫЙ диапазон глубины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...