Общий вопрос: являются ли Shading Languages ​​/ shaders объектно-ориентированными? - PullRequest
2 голосов
/ 19 октября 2019

В настоящее время я учусь, и один из инструкторов сказал, что «Шейдеры являются объектно-ориентированными» в качестве примера для объектно-ориентированного программирования. Для меня это означает, что HLSL & GLSL являются объектно-ориентированными языками. Я никогда не думал о шейдерах как об объектно-ориентированных.

Но теперь, когда я смотрю на это: https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)

vec4 someVec;
someVec.x + someVec.y;

Я также вижу объектную ориентацию из-за точки. Теперь я в замешательстве.

Я начал заниматься OpenGL и GLSL 2 года назад, мне никогда не приходило в голову, что GLSL является объектно-ориентированным. Так что я упустил важный момент.

Я знаю, что эти шейдерные языки HLSL / GLSL происходят от своих предшественников ассемблеров.

Может кто-нибудь сказать, действительно ли GLSL является объектно-ориентированным.

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Нет, Язык затенения OpenGL не ориентирован на объект. В glsl нет методов (или даже наследование и полиморфизм ). Типы данных ведут себя больше как структура в C, чем класс в C ++. Но, конечно, есть дополнительные опции для Конструкторы и инициализация типов данных glsl соответственно некоторых векторных и матричных операций и компонентов, к которым можно получить доступ Swizzling .
Но это делает язык не * объектно-ориентированным языком, потому что концепция объектов требует полей данных и процедур (методов), содержащихся в объекте. В glsl общая концепция методов отсутствует.

1 голос
/ 19 октября 2019

Я также вижу ориентацию объекта из-за точки.

Это не то, что означает «ориентация объекта». Точка является просто «оператором доступа к элементу», и для всех намерений и целей является комбинацией некоторого вида «преобразования типа», «разыменование указателя» и «арифметика указателя». Все в кавычках, поскольку в отношении языка и компилятора не задействованы действительные указатели, но на уровне кремния он действительно сводится к смещению адресов.

Ориентация объекта означает, что вы можете получать классы из других классов. методы перегрузки и перезаписи, и так далее. Вот так (псевдокод)

class A begin
    var foo
    var bar
    method spam()
endclass

class B inherits A begin
    var eggs
    var bacon
    var mixture

    method spam() begin
       eggs -= bacon
       A::spam() 
    end

    method mix(seasoning) begin
        mixture = eggs * bacon + seasoning
        spam()
    end
endclass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...