Kwalifikatory magazynu in
i out
faktycznie mają cel, który zawiera i zastępuje cel varying
i attribute
. Określają one, co zmienne są odpowiednio w puts i out put dla cieniującego. Zobacz kartę referencyjną GLSL 4.2 na stronie 7:
in
: powiązanie z shaderem z poprzedniego etapu
out
: połączenie z modułu cieniującego do następnego etapu
attribute
: tak samo jak w in
przypadku shadera wierzchołków
varying
: tak samo jak w out
przypadku cieniowania wierzchołków, tak samo jak w in
przypadku cieniowania fragmentów (Uwaga: są one błędnie odwracane w wyżej wymienionej karcie odniesienia).
Na marginesie należy zauważyć, że dwa ostatnie są w pewnym sensie przestarzałe: nie występują w profilu rdzenia 4.2, tylko w profilu zgodności.
Co dokładnie robią?
Jeśli chodzi o użycie, przenieś moduł cieniujący wierzchołek z wprowadzenia do nowoczesnego OpenGL. Rozdział 2.2: Shadery :
#version 110
attribute vec2 position;
varying vec2 texcoord;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
texcoord = position * vec2(0.5) + vec2(0.5);
}
Powinien zostać przepisany w rdzeniu 4.2, ponieważ:
#version 420
in vec2 position;
out vec2 texcoord;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
texcoord = position * vec2(0.5) + vec2(0.5);
}
Nieprzydatne samouczki
Domyślam się, że głównym powodem, dla którego uważacie „przestarzały” kod samouczka, jest to, że nie każdy ma dostęp do sprzętu zgodnego z GLSL 3.3+. Niezależnie od tego, na dobry i bardziej aktualny samouczek chętnie poprowadzę cię w kierunku uczenia się nowoczesnego programowania grafiki 3D przez Nicola Bolasa .