Как вписать 2D-сцену в окно QOpenGLWidget с помощью шейдерной программы? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь разместить целую 2D сцену треугольников в окне. Я использую шейдерную программу для обработки рисования треугольников. Я только часть из 900 треугольников, которые я ожидаю увидеть. Однако когда я использую устаревший API OpenGL для рисования квадратов в похожей сцене, он работает как положено.

Это должно иметь отношение к матрице MVP, которую я передаю в вершинный шейдер. См. Метод paintGL() в модуле scene.cpp . Именно здесь я настраиваю glViewport и mvpMatrix перед рисованием треугольников.

Я обрисовал в общих чертах, что я сделал ниже.

Инструменты

  • Linux
  • Qt 5.11.1
  • OpenGL ES

Настройка

  1. Сцена 1М х 1М
  2. 900 треугольников добавляются в сцену с помощью шейдерной программы
    • Это сетка из 30 х 30 треугольников, равномерно распределенных по сцене

Проблема

  • Была сделана попытка разместить всю сцену внутри окна.
  • В результате в окне видны только 75 из 900 треугольников.

Вот скриншот демонстрации треугольников .

Источник демонстрации "Треугольники":

  • Модуль scene.cpp содержит метод paintGL.
  • Модуль triangles.cpp предназначен для установки программы шейдера и построения треугольников.
  • Полный источник демонстрации треугольников находится на github.

Что сработало

Я обнаружил, что использование устаревшего API OpenGL, рисование квадратов с помощью GL_QUADS, делает то, что я ищу. Тем не менее, я хотел бы использовать шейдеры.

Вот скриншот демонстрации squares . Это сетка из 10 х 10 квадратов в сцене размером 1 х 1 м

Источник демонстрации квадратов:

  • Полный исходный код демо находится на github.

1 Ответ

0 голосов
/ 03 сентября 2018

Я нашел ошибку. Это было в triangles.cpp , где я размещал VBO. Я использовал неправильный счетчик байтов.

Изменение:

_vertexBuffer.allocate(_vertexes, _vertexCount);

до:

_vertexBuffer.allocate(_vertexes, _vertexCount * sizeof(QVector3D));

исправил проблему.

...