Примеры построения графиков в 2D и 3D на шейдерном OpenGL и WebGL

Что может означать ошибка при запуске

Failed to compile the VertexShader shader. Message: ERROR: 0:1: '' :  version '130' is not supported
Failed to compile the FragmentShaderArb shader. Message: ERROR: 0:1: '' :  version '130' is not supported

В какую сторону копать?

А я думал, что наоборот, что d3.js проще. Просто на шейдерах очень много кода получается: матрицы трансформаций, матриц вида, матрица проекции. Очень важно на графике выводить текст, а на WebGL нет вывода текста по умолчанию, поэтому нужно шрифты загружать, например, после обработки BMFont. Нужно организовать переключение шейдерных программ с цветной на текстурированную, чтобы график рисовать в цвете, а буквы выводить в виде текстур. Файл с шрифтом нужно распарсить. Сделать заданную толщину у графика на WebGL - непростая задача, потому что WebGL и шейдерный OpenGL не умею рисовать линии с заданной толщиной, поэтому нужно уметь рисовать с помощью треугольников. Например, линия рисуется в виде прямоугольника, который состоит из двух треугольников. Рисовать графики на D3 намного проще, чем на WebGL. Но шейдеры дают больше возможностей и позволяют строить графики в 3D, то есть, например, можно построить 3D диаграммы в виде цилиндров и вывести текст внутри 3D пространства.

Так я и сказал это ) но оно вроде позволяет и вебгл, и что угодно.

Пишет, что версия OpenGL 3.0 не поддерживается на данной машине. Вы на ноутбуке запускаете?

Извините. Я неправильно прочитал. Я прочитал “в простых случаях используют WebGL”

Это вообще извращение - Visual Studio for Mac
Я подозревал, что будут ошибки )
Но скомпилировалось без особых проблем, а при запуске черное окно и эти сообщения в консоли.

Так это железо виновато? Или какой-то софт?

А точнее, он проще с точки зрения быстрого старта. Но когда серьёзно нацелен изучать WebGL и OpenGL, то проще на шейдерах, потому что идёт тренировка при рисовании разной 2D/3D графики на шейдерах. Получается, уже проще с языка на язык переносить, накапливаются наработки, знания, навыки. Не нужно переключаться с разных библиотека, потому что OpenGL и WebGL выглядит одинаково. А ещё идёт чистая математика в компьютерной графике, появляется полная свобода. Тут ещё кому что ближе, то и выбирают. Я любые типы графиков буду строить на WebGL и OpenGL - даже отрезок буду нарисовать с текстом по осям. Сейчас WebGL 1.0 поддерживается на всех платформах. Проще то, чем давно занимаешься.

Меня удивляет, что выдало именно такой тип ошибки при запуске на macOS. У меня же подключение идёт OpenTK.dll, то есть “.dll” - это же библиотека для Windows, а на macOS должны быть другой формат динамической библиотеки. А на macOS можно посмотреть какая используется версию OpenGL? Я могу добавить вывод версии OpenGL.

Я в шоке. Получается, что библиотеки “.dll” работают и на macOS тоже?

Я добавил в код строку:

Console.WriteLine("OpenGL Version: " + GL.GetString(StringName.Version));

Она выводит версию OpenGL:
SinOpenGLVersion

Пример использует OpenGL версии 3.0. Я обновил пример на GitHub.

6 пост был перенесен в новую тему: .NET на MacOS и Linux?

Сперва оно потребовало включить AutoGenerateBindingRedirects

А если сейчас запустить, то какую версию OpenGL выводит? Интересно, почему не запускается и говорит, что версия OpenGL ниже 3.0.

OpenGL Version: 2.1 INTEL-14.3.9

1 лайк

Под Windows проблем нет

1 лайк

Я всегда думал, что OpenGL версии 3.0 уж точно везде есть. Я сделал ещё один проект на OpenGL версии 2.0, попробуйте на macOS: https://github.com/8Observer8/Sin_ConsoleAppOpenTkOpenGL20CSharp

Я просто шейдеры немного поменял. Изменил версию с “130” на “110”. Заменил “in” на “attribute”, убрал строку “out vec4 fragColor;” и заменил “fragColor” на “gl_FragColor”

VertexShader.glsl

#version 110

attribute vec2 position;

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;

void main()
{
	gl_Position = projectionMatrix * viewMatrix * vec4(position, 0.0, 1.0);
}

FragmentShader.glsl

#version 110

void main()
{
	gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

Этот вариант заработал и тут
Снимок экрана 2019-12-13 в 00.52.08

1 лайк

@BlackFregat, спасибо! Для меня большая радость узнать, что проект созданный в VS на Windows запускается на VS на Mac. Я думаю, что в MonoDevelop на Linux тоже должен проект открыться и запуститься.

@8Observer8, я всё же до конца не понял, чем именно определяется доступная версия.
Это свойства железа? Драйвера? Какой-то из библиотек Mono?

Определяется установленными драйверами для видео карты. К примеру, у меня две видео карты на ноутбуке: интегрированная (встроенная, Intel HD Graphics 3000) и дискретная (отдельная, Nvidia Geforce GT 540M (1 GB)). По умолчанию почти все приложения запускаются, используя интегированную видео карту. Я максимально могу обновить драйвер на интегрированной до поддержки OpenGL версии 3.1. Поэтому я обычно в шейдерах использую OpenGL версии 3.0. Да, я могу выбирать, какую версию OpenGL использовать, указав версию в шейдерах. Какая версия GLSL соответствует какой версии OpenGL можно посмотреть в таблице в начале этой страницы: https://en.wikipedia.org/wiki/OpenGL_Shading_Language Дискретная карта у меня поддерживает OpenGL версии 4.6. В этой версии много разных полезных фишек накопилось, которые я ещё не изучал, и которые пока мне не нужны. Можно ограничиться просто минимальной версией в шейдерах (выбирается строкой в начале шейдера #version 110 - это соответствует OpenGL версии 2.0). Но в OpenGL 3.0 есть такая удобная штука, как VAO, её нет в OpenGL 2.0. Честно говоря, я впервые сталкиваюсь, что у кого-то отсутствует обнова для драйвера, чтобы поддерживало хотя бы OpenGL 3.0. Я думаю, либо иногда писать на OpenGL 2.0, а иногда выводить сообщение, что нужно обновить драйвера для графической карты и что требуется OpenGL версии 3.0

Мне такая мысль пришла, что эту тему лучше сделать для любителей рисовать графики на OpenGL/GLSL, чистого WebGL/GLSL. Что OpenGL, что WebGL - разницы в коде нет, весь код получится однотипный. Просто если использовать библиотеки, которые используют OpenGL на разных языка, то получится мешанина. Допустим, один человек использует библиотеку Qwt (Qt+C++), которая тоже внутри себя может использует OpenGL (а может не использует). Получится, что он будет на Qwt выкладывать. В общем, на каждом языке есть множество различных библиотек. А вот если писать на чистом OpenGL/WebGL, то код на всех языках будет одним и тем же, поэтому легко можно переписать с языка на язык. Поэтому я обращаю внимание, что впредь нужно выкладывать код в этой теме только на чистом шейдерном OpenGL/WebGL, а по различным библиотекам для графиков создавать отдельные темы.