GLSL

382
2
24
У меня Opengl 4.6.0 и GLSL 4.6.0. Смотрю старый туториал по Opengl/GLSL, где у человека Opengl 3.2.0 и GLSL 1.5.0. В туторе был код для объявления цвета каждому пикселю на выходе:
Shader:
#version 460 core
//в туториале было 150, но у меня OpenGL 4.6.0, а ему соответствует GLSL версия 4.6.0

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

Так вот, мне компилятор пишет, что глобальная переменная gl_fragcolor устарела. Какая альтернатива этой переменной в новой версии OpenGL?
P. S Я гуглил на что её заменить, но не нашёл ничего, кроме какого-то layout.
 

Icosider

Kotliner
Администратор
3,600
99
663
Фига разошёлся, у людей ещё до сих пор вёдра с гайками, с 2гб рам и с интегрированными видяхами, а он на 4.6... На счёт цвета, ну ёлы палы, как ты там учишь то? Создай поле, аля "out vec4 out_color;" Затем в main пропиши out_color = vec4(1f, 0f, 0f, 1f); и вуаля! Magic! И ещё, на хабре была серия уроков по opengl

Upd: На вот
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Чел, #120 заведется у всех, а #460 хорошо если у половины. Я понимаю если там сложнейший шейдер, который юзает дофига новых фич, то да. У тебя же самый простой шейдер и ты указываешь #460... Это неверно.
 
382
2
24
Фига разошёлся, у людей ещё до сих пор вёдра с гайками, с 2гб рам и с интегрированными видяхами, а он на 4.6... На счёт цвета, ну ёлы палы, как ты там учишь то? Создай поле, аля "out vec4 out_color;" Затем в main пропиши out_color = vec4(1f, 0f, 0f, 1f); и вуаля! Magic! И ещё, на хабре была серия уроков по opengl

Upd: На вот
Кстати, можешь сказать что значит "core" после версии? Автор туториала не объяснил.
 
382
2
24
Чел, #120 заведется у всех, а #460 хорошо если у половины. Я понимаю если там сложнейший шейдер, который юзает дофига новых фич, то да. У тебя же самый простой шейдер и ты указываешь #460... Это неверно.
Да. Но тут такой вопрос. После #120 глобальная переменная gl_fragcolor устарела. То есть в #460 она работать не будет. Получается #120 заведётся не у всех, или тут что то не так?

Может, если у кого-нибудь стоит #460, то у него есть и все предыдущие версии тоже? Тогда справедливо то, что если стоит самая новая версия, тогда и все предыдущие поддерживаются.
 

Icosider

Kotliner
Администратор
3,600
99
663
Я понимаю если там сложнейший шейдер
Ща погоди, до геометрического шейдера дойдёт, ещё тему создаст))

Да. Но тут такой вопрос. После #120 глобальная переменная gl_fragcolor устарела. То есть в #460 она работать не будет. Получается #120 заведётся не у всех, или тут что то не так?
Да заведётся она у всех, просто надо указать 120 или 460. Если ты используешь новые фичи, то ставишь 460, если нет, то 120 и не паришься. За тебя уже всё сделано и париться на счёт: "а запустится ли 120 на 460 или нет?" Не надо...

Может, если у кого-нибудь стоит #460, то у него есть и все предыдущие версии тоже? Тогда справедливо то, что если стоит самая новая версия, тогда и все предыдущие поддерживаются.
Браво 👏
 

tox1cozZ

aka Agravaine
8,454
598
2,890
То есть в #460 она работать не будет. Получается #120 заведётся не у всех, или тут что то не так?
Ну ты же для это и указываешь версию, чтобы шейдер компилировался "нужной версией".

Может, если у кого-нибудь стоит #460, то у него есть и все предыдущие версии тоже? Тогда справедливо то, что если стоит самая новая версия, тогда и все предыдущие поддерживаются.
Если видюха старая и не поддерживает #460 - крашнется. Если видюха новая, а шейдер #120 - все заведется.
 
29
6
Используй переменные in и out в вершинном и фрагментном шейдерах. Где in во фрагментном выходные позиции вертексов из вершинного (то есть out из вершинного) и out в твоем фрагментном всегда будет попиксельный цвет, который рассчитывается на основе смешивания данных. то есть где ты пишешь vec4(r, g, b, a) где первые три аргумента - цвет и а - альфа канал. Так что если твоя out переменная из фрагментного шейдера всегда выдает цвет то можешь использовать её вместо gl_fragcolor; И называй её как хочешь. Примерно так может быть
Objective-C:
#version 420

in position;
out color;

void main() {
    color = vec4(position.x, position.y, position.z, 1); // Или же vec4(position, 1); одинаково
}

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


Надеюсь ярассказал не как дебил и вроде доходчиво.
 
29
6
И вообще я не понимаю зачем юзать версии опенгл выше 3 если майн (адекватная версия то есть до 1.8) все равно юзает lwjgl 2.9.x который поддерживает функционал лишь вплоть до опенгл 3.1 чего между прочим с головой достаточно для кодинга в майне (и вообще достаточно если хочешь научиться работать с графикой для начала)
 

CumingSoon

Местный стендапер
1,634
12
269
Ну ты же для это и указываешь версию, чтобы шейдер компилировался "нужной версией".


Если видюха старая и не поддерживает #460 - крашнется. Если видюха новая, а шейдер #120 - все заведется.
Не знаю, как ты вообще далеко зайдешь, если не научишься гуглить в самом начале.
 
Сверху