Рендер карты высот OpenGL не отрисовывается

У меня есть растровая карта, созданная из файла dted. Я хочу использовать это растровое изображение и создать 3D-рендеринг местности. Я пытаюсь сделать это с векторами вершин, но вообще не смог достичь своей цели. Вот мой код paintGL:

void render::paintGL(){
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0,0,-100);
for(int z=0;z<dted.width()-1;z++){
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x<dted.height()-1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x+1][z], matrix[x+1][z], matrix[x+1][z]);
        glVertex3f(x+1, matrix[x+1][z], -z);
        //vertex1 ends here

        glColor3f(matrix[x][z+1], matrix[x][z+1], matrix[x][z+1]);
        glVertex3f(x, matrix[x][z+1], -z-1);
        //vertex2 ends here

        glColor3f(matrix[x+1][z+1], matrix[x+1][z+1], matrix[x+1][z+1]);
        glVertex3f(x+1, matrix[x+1][z+1], -z-1);
        //vertex3 ends here


    }
    glEnd();
}}

Мне пришлось писать код вместо копирования-вставки из-за проблем с интернетом. Так что могут быть вещи, которые я забыл, но я сделал все возможное. Позвольте мне объяснить переменные и другие вещи выше:

dted — это созданное мной изображение dted, и я устанавливаю границы из значений ширины и высоты этих изображений. матрица представляет собой двумерную матрицу, которая содержит значения высоты, которые я получаю из предварительно созданных пикселей изображения dted.

После всего кода выше мне не удалось отрендерить ландшафт. Я не знаю, рендерит ли он ландшафт, но он просто не показывает меня или вообще не рендерит. Если вы объясните, в чем моя ошибка, и предложите ее решение, было бы здорово.

Извините за грамматические ошибки, если я их сделал, и я надеюсь, что хорошо объяснил свою проблему. Если предоставленного кода недостаточно, не стесняйтесь упоминать об этом, и я могу записать и другие части.

Хорошего дня.

Редактировать: Хорошо, у меня здесь свежие новости. Мне удалось нарисовать равнину после того, как я немного справился с проблемами с мышью. Однако, когда я пытаюсь получить амплитуду, она ничего не показывает. Я думаю, это из-за слишком большой амплитуды, но когда я делю ее на константу вроде 15, снова появляется та же самая равнина. Это из-за того, что я использовал GL_TRIANGLE_STRIP?


person user3483948    schedule 12.06.2015    source источник
comment
Во-первых, убедитесь, что вы умеете рисовать: начните с одного треугольника в жестко заданном месте. Во-вторых: значения matrix находятся в диапазоне от 0 до 1? Они должны, если вы введете их в glColor3f. Не могли бы вы проверить это?   -  person Sga    schedule 12.06.2015
comment
Я проверил и увидел, что это не так. Однако я разделил его на 255 (значения пикселей были от 0 до 255), и он по-прежнему ничего не показывает. Кстати, я уже нарисовал куб и это хорошо показало.   -  person user3483948    schedule 12.06.2015
comment
Теперь вы должны проверить свою камеру: она слишком далеко? Перпендикулярна ли ей плоскость (чтобы она превратилась в тонкую линию)? Попробуйте преувеличить значения Y с помощью множителя   -  person Sga    schedule 12.06.2015
comment
Для этого я настроил событие мыши, которое уменьшает масштаб при щелчке правой кнопкой мыши и увеличивает масштаб при щелчке левой кнопкой мыши, что изменяет значение z функции перевода. Я умножил амплитуду Y на 15 (матрица [x][z]*15) и, что неудивительно, не смог ее увидеть. Как вы думаете, проблема в камере?   -  person user3483948    schedule 12.06.2015
comment
Да, это можно указать в другом месте   -  person Sga    schedule 12.06.2015
comment
Ну, я не очень хорошо знаком с opengl, но, как я понял из куба, который я создал для пробы, камера по умолчанию центрирована относительно начала координат, а функция перевода просто помещает отображаемый элемент в эту систему координат. Вот почему я меняю параметры функции перевода. Вот почему я пытаюсь создать карту по частям. Поэтому я начал думать, что это вообще не рендеринг. Есть идея для этого?   -  person user3483948    schedule 12.06.2015
comment
Переключитесь на GL_POINTS с помощью glPointSize(50)   -  person Sga    schedule 12.06.2015
comment
Это тоже не помогло.   -  person user3483948    schedule 12.06.2015
comment
Перезапустите куб... И нарисуйте его рядом с вашими точками   -  person Sga    schedule 12.06.2015
comment
Я сделал это, и это было сделано хорошо.   -  person user3483948    schedule 12.06.2015
comment
Что произойдет, если вы используете 0 вместо matrix[][]?   -  person Sga    schedule 12.06.2015
comment
То же, что и начало. Ничего не рисует.   -  person user3483948    schedule 12.06.2015
comment
Хорошо, у меня тут свежие новости. Мне удалось нарисовать равнину после того, как я немного справился с проблемами с мышью. Однако, когда я пытаюсь получить амплитуду, она ничего не показывает. Я думаю, это из-за слишком большой амплитуды, но когда я делю ее на константу вроде 15, снова появляется та же самая равнина. Это из-за того, что я использовал GL_TRIANGLE_STRIP?   -  person user3483948    schedule 12.06.2015
comment
Трудно разобраться в проблеме без остальной части вашего кода рендеринга, но одно: я считаю, что ваши индексы могут быть проблемой: вы смотрите от 0 до ширины-1, но затем получаете доступ к x и (x+1), что может таким образом становятся шириной.   -  person Knowleech    schedule 12.06.2015
comment
Индексы @Knowleech в порядке, там нет переполнения   -  person Sga    schedule 12.06.2015
comment
Мне удалось что-то визуализировать, но оно кажется слишком большим, чтобы его можно было увидеть, и независимо от того, насколько сильно я уменьшаю масштаб, это не похоже на понятный визуализированный объект. Для просмотра под углом я добавил следующий код: 'glRotatef(45,0,1,0)'   -  person user3483948    schedule 15.06.2015
comment
Вы сказали: но когда я делю его на константу типа 15, снова появляется та же самая равнина. Может быть, вы делали интергер-деление и получили округление до нуля? Обязательно напишите matrix[][] / 15.0f   -  person Knowleech    schedule 16.06.2015
comment
Спасибо за вашу помощь, ребята. Наконец-то я могу это сделать. Я не смог бы сделать это без вашей помощи, ребята. Большое спасибо...   -  person user3483948    schedule 17.06.2015


Ответы (2)


Ваш код рендеринга кажется странным: вы строите свою тройную полосу с вырожденными треугольниками и можете получить доступ к данным, которых там нет. Я догадался об остальном вашем подходе и попытался исправить ваш метод. Попробуй это:

void render::paintGL(){
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0,0,-100);
  for(int z = 0; z < dted.width() - 2; z++) {
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x < dted.height() - 1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x][z + 1], matrix[x][z + 1], matrix[x][z + 1]);
        glVertex3f(x, matrix[x][z + 1], -z - 1);
        //vertex1 ends here

    }
    glEnd();
}}

Кроме этого, треугольные полоски в порядке. Если вы по-прежнему ничего не видите, следуйте совету Sga и используйте GL_POINTS. Затем исправьте код камеры/другого рендеринга, пока не увидите их.

person Knowleech    schedule 12.06.2015
comment
Мне удалось что-то визуализировать, но оно кажется слишком большим, чтобы его можно было увидеть, и независимо от того, насколько сильно я уменьшаю масштаб, это не похоже на понятный визуализированный объект. Для просмотра под углом я добавил следующий код: 'glRotatef(45,0,1,0)' - person user3483948; 15.06.2015
comment
Нужна ли треугольная полоса? Могу ли я использовать полигон или четырехугольник? Это больше подходит для моей цели, так как я хочу визуализировать его по частям, как рендеринг 2D-изображения попиксельно. - person user3483948; 15.06.2015
comment
Код рендеринга, который я опубликовал, довольно минималистичный и должен работать. Если геометрия экстремальна, проверьте значения, которые вы получаете своими матричными классами. В качестве теста вы можете (опять же) заменить всю матрицу[][] на ноль или любую другую константу. Если это все еще не работает, проверьте матрицы, которые вы используете в качестве модели и проекции. Мне кажется странным, что вы вызываете glLoadIdentity() до вызова glMatrixMode. - person Knowleech; 16.06.2015
comment
... и, кстати, TRIANGLE_STRIP - это то, что вы хотите использовать. QUAD или POLYGON устарели в современной графике, и лучше их избегать. Для вашего понимания эквивалентом пикселя является не четырехугольник (или треугольник), а вершина. Треугольники определяют соединения, например. структуру, на которую следует интерполировать. - person Knowleech; 16.06.2015
comment
Спасибо за вашу помощь, ребята. Наконец-то я могу это сделать. Я не смог бы сделать это без вашей помощи, ребята. Большое спасибо... - person user3483948; 17.06.2015

Для других парней, которые ищут решение в этом: убедитесь, что параметр zNear вашего glFrustum достаточно далеко, чтобы видеть вещи. Мои должны были закрыться, и когда я увеличил его, проблема была решена.

person user3483948    schedule 12.08.2015