GLSL - это "язык затенения" .Он используется для 3D-рендеринга и имеет специальные типы данных, особенно полезные для этой цели (например, векторы длины 4 и матрицы ранга 4х4).Вершинные и фрагментные шейдеры располагаются в четко определенном месте внутри конвейера рендеринга, и они автоматически запускаются для данных, проходящих через этот конвейер.Шейдеры также имеют прямой доступ к матрицам преобразования и проекции трехмерного конвейера.
OpenCL - это «язык вычислений» .Он не предназначен специально для вычислительных задач, которые мы видим в 3D-рендеринге, а скорее является подмножеством C. У OpenCL есть типы данных, схожие с векторами и матрицами в GLSL (float4, float16), но они менее удобны в использовании.Также у вас нет графического контекста (который может быть преимуществом или недостатком), и ядро OpenCL не находится внутри конвейера 3D-рендеринга.
Если вы хотите вычислять модули, которые подключены к 3Dконвейер рендеринга и запускаются конвейером рендеринга, используйте GLSL.Если вам нужны общие вычисления на GPU вне конвейера 3D-рендеринга, используйте OpenCL.
Это не означает, что OpenCL нельзя использовать для рендеринга 3D-графики.Оно может.Фактически, вы можете реализовать свой собственный конвейер исключительно в OpenCL, а затем скопировать свой чертеж в кадровый буфер.Но если вы просто хотите нарисовать 3D-графику, дублирование всей работы инженеров SGI, Nvidia, Intel и AMD, вероятно, не стоит хлопот.Тогда проще использовать GLSL и подключить шейдер к готовому и полностью работоспособному конвейеру OpenGL.Просто учтите, что написать Mesa, реализацию OpenGL с открытым исходным кодом, было очень сложно.