OpenGL Shading Language

OpenGL Shading Language (zkráceně GLSL nebo také GLslang) je vyšší programovací jazyk pro psaní shaderů, který vychází ze syntaxe jazyka C pro všeobecné použití. Jazyk GLSL byl vytvořen konsorciem OpenGL ARB.

Popis

Jazyk vznikl v rámci procesu postupné transformace fixního vykreslovacího řetězce na řetězec programovatelný a stal se jednou z vyspělejších alternativ k tehdy používaným nižším programovacím jazykům pro psaní shaderů.

Nová funkcionalita (nebo funkcionalita specifická pro určitého výrobce či hardware) je do GLSL často doplňována nejprve v podobě tzv. rozšíření (např. podpora geometry shaderu), které je třeba v kódu explicitně aktivovat a v pozdějších verzích se významná rozšíření stávají součástí funkcionality základní.

Verze

Tabulka shrnující jednotlivé verze OpenGL a příslušné verze GLSL, které byly v rámci dané specifikace představeny:[1]

Verze GLSL Verze OpenGL
1.10.59 2.0
1.20.8 2.1
1.30.10 3.0
1.40.08 3.1
1.50.11 3.2
3.30.6 3.3
4.00.9 4.0
4.10.6 4.1
4.20.6 4.2

Operátory

Jazyk GLSL poskytuje operátory známé z jazyka C. Výjimku tvoří operátory související s ukazateli, které nejsou v jazyce GLSL podporovány. V prvních verzích rovněž nebylo možné používat bitové operátory — jejich podpora byla zavedena ve verzi 1.30.[2] Oproti jazyku C je navíc k dispozici speciální operátor swizzle.

Datové typy

GLSL podporuje skalární datové typy jazyka C. Lze použít i datový typ void ovšem pouze jako typ návratové hodnoty funkcí. Podpora struktur a polí umožňuje tvorbu uživatelských datových typů.

Skalární typy

  • bool — pravdivostní datový typ (true/false)
  • int — 32bit, celé číslo se znaménkem
  • uint — 32bit, celé číslo bez znaménka
  • float — 32bit, číslo s plovoucí desetinnou čárkou
  • double — 64bit, číslo s plovoucí desetinnou čárkou a dvojnásobnou přesností

Vektorové typy

Vektor je homogenní datový typ. GLSL má vestavěnou podporu pro jedno- až čtyř-složkové vektory. Název vektorového datového typu (např. dvec4) se skládá z prefixu části "vec" a sufixu. Prefix určuje datový typ složek vektoru[p 1] a sufix určuje jejich počet. Příklad použití (včetně inicializace):

vec4 color0 = vec4(1.0, 0.0, 0.0, 0.0);

K jednotlivým složkám vektoru lze pak přistupovat pomocí definovaných složek x, y, z a w (např. color0.x = 0.5;).[3]

Matice

GLSL poskytuje podporu pro práci s maticemi o rozměrech 2x2 až 4x4, přičemž matice nemusí být pouze čtvercová (k dispozici jsou všechny kombinace uvedených rozměrů). Názvy maticových datových typů jsou tvořeny obdobně jako u vektorů — název začíná prefixem následuje část "mat" a je ukončen sufixem. Prefix určuje datový typ prvků matice[p 1] a sufix určuje rozměr matice (např. mat3x4; u čtvercových matic je použit zkrácený zápis např. mat3 pro matici o rozměrech 3x3). Příklad použití (včetně inicializace):

K jednotlivým prvkům matice přistupujeme obdobně jako k prvkům pole v jazyce C:[3]

mat3 matrix;
matrix[1] = vec3(3.0, 3.0, 3.0);
matrix[2][0] = 16.0;

Další datové typy

GLSL nabízí i tzv. opaque (česky někdy též "transparentní") datové typy. Opaque datový typ je ve skutečnosti pouze handler (handle) na nějaký jiný objekt. Přístup k takovému objektu probíhá přes sadu vestavěných funkcí (přímé čtení či zápis hodnoty proměnné takového typu není možné). Při deklaraci jednoho opaque datového typu jsou ve skutečnosti deklarovány objekty dva, handler samotný i vnitřní objekt ke kterému handler přistupuje. Deklarace těchto typů je možná pouze na některých místech kódu — typicky bývají deklarovány např. jako parametry funkcí. [4]

Do kategorie opaque datových typů spadají v GLSL tzv. Samplery (např. sampler2D) a jedná se o handler k jedno-, dvou- či tří-rozměrné textuře, hloubkové textuře, cube-mapě apod.

Image je další třídou opaque datových typů (např. image1D, image2D, image2DMS a další). jedná se o handler k jedno-, dvou- či tří-rozměrnému obrázku (image), které se používají pro načítání či ukládání souborů obsahujících statický obraz (případně pro další atomické operace).

Řídící struktury a funkce

Jazyk GLSL využívá stejnou konstrukci řídících struktur (větvení, cyklů, skoků) a funkcí jako jazyk C. Kromě podpory uživatelských funkcí disponuje GLSL i sadou funkcí vestavěných. Některé z nich jsou podobné funkcím jazyka C (zejména matematickým) — např. funkce exp() nebo abs(), zatímco jiné jsou určeny speciálně pro práci s grafikou — např. smoothstep() nebo texture2D().

Direktivy preprocesoru

Pro řízení předzpracování zdrojového kódu, je k dispozici sada preprocesorových direktiv známých z jazyka C. Navíc jsou k dispozici speciální direktivy #version a #extension.[4]

Direktiva version

Direktiva #version se musí nacházet na začátku každého zdrojového souboru a určuje verzi GLSL, která bude při překladu použita.

#version 150

Direktiva extension

Chování GLSL lze dále ovlivnit pomocí tzv. rozšíření OpenGL (OpenGL extensions). Tato rozšíření lze řídit právě pomocí direktivy #extension:

#extension jmeno_rozsireni: chovani

Kde položka "jmeno_rozsireni" definuje název konkrétního rozšíření nebo nabývá hodnoty "all" chceme-li pracovat se všemi rozšířeními. Dané rozšíření lze v části "chovani" povolit nebo zakázat a dále pak definovat chování v případě, kdy rozšíření není dostupné.

Komentáře

Komentáře lze zapisovat ve stejném formátu jako v jazycích C, C++.

/* krátká verze */
// celořádková verze

Proces překladu

Kód shaderu může být umístěn v samostatném souboru nebo jako textový řetězec v rámci hlavního programu. Vlastní překlad probíhá až za běhu aplikace. Nejprve je třeba vytvořit shader objekt a definovat jeho typ (např. GL_VERTEX_SHADER) voláním OpenGL funkce glCreateShader(). Vlastní překlad je vyvolán funkcí glCompileShader() (jako parametr je předán řetězec s kódem shaderu). Dalším krokem je sestavení přeložených shaderů ve výsledný program. Opět je nejprve nutné vytvořit speciální objekt program funkcí glCreateProgram(). Následuje připojení přeložených shader objektů — glAttachShader() a potom již vlastní proces linkování — glLinkProgram(), v rámci kterého dochází rovněž k mapování proměnných hlavního programu a proměnných GLSL shaderů.[5]

Ukázka vertex shaderu

Uvedený vertex shader realizuje stejnou transformaci vstupu jako fixní vykreslovací řetězec.

#version 120

void main(void)
{
    gl_Position = ftransform();
}

Použitá funkce ftransform() není od verze GLSL 1.40 dostupná. Při použití novější specifikace GLSL musí programátor místo použití této funkce explicitně vykonat násobení vertexu projekční a modelview maticí.

#version 140

uniform Transformation
{
    mat4 projection_matrix;
    mat4 modelview_matrix;
};

in vec3 vertex;

void main()
{
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}

Ukázka geometry shaderu

Následující kód realizuje jednoduchý průchozí geometry shader pro barvu a pozici vertexu.

#version 120
#extension GL_EXT_geometry_shader4 : enable

void main()
{
    for (int i = 0; i < gl_VerticesIn; ++i) 
    {
        gl_FrontColor = gl_FrontColorIn[i];
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

Od verze GLSL 1.50 nejsou již geometry shadery rozšířením, ale staly se součástí základní funkcionality GLSL. V souvislosti s tím došlo i k mírné změně syntaxe.

#version 150

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;

void main()
{
    for (int i = 0; i < gl_in.length(); i++)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

Ukázka fragment shaderu

Jednoduchý shader, jehož výstupem bude fragment červené barvy.

#version 120

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

Při použití specifikace GLSL 1.30 nebo pozdější je třeba shader upravit.

#version 150

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

V hlavním programu je potřeba provést navázání proměnné:

glBindFragDataLocation(Program, 0, "MyFragColor");

kde:

  • Program — handler použitého shader programu
  • 0 — index barvového bufferu
  • "MyFragColor" — uživatelsky definovaný název barvového bufferu

Ukázka Tessellation control shaderu

Příklad tessellation control shaderu pracujícího s trojúhelníky.[6]

#version 400

layout(vertices = 3) out;
in vec3 vPosition[];
out vec3 tcPosition[];
uniform float TessLevelInner;
uniform float TessLevelOuter;

void main()
{
    tcPosition[gl_InvocationID] = vPosition[gl_InvocationID];
    if (gl_InvocationID == 0)
    {
        gl_TessLevelInner[0] = TessLevelInner;
        gl_TessLevelOuter[0] = TessLevelOuter;
        gl_TessLevelOuter[1] = TessLevelOuter;
        gl_TessLevelOuter[2] = TessLevelOuter;
    }
}

Ukázka Tessellation evaluation shaderu

Příklad tessellation evaluation shaderu pracujícího s trojúhelníky.[6]

#version 400

layout(triangles, equal_spacing, cw) in;
in vec3 tcPosition[];
out vec3 tePosition;
out vec3 tePatchDistance;
uniform mat4 Projection;
uniform mat4 Modelview;

void main()
{
    vec3 p0 = gl_TessCoord.x * tcPosition[0];
    vec3 p1 = gl_TessCoord.y * tcPosition[1];
    vec3 p2 = gl_TessCoord.z * tcPosition[2];
    tePatchDistance = gl_TessCoord;
    tePosition = normalize(p0 + p1 + p2);
    gl_Position = Projection * Modelview * vec4(tePosition, 1);
}

Odkazy

Poznámky

  1. a b U názvů datových typů (vektorů a matic) jejichž složky jsou typu float, se prefix v neuvádí.

Reference

V tomto článku byl použit překlad textu z článku GLSL na anglické Wikipedii.

Související články

Ostatní jazyky pro psaní shaderů

Externí odkazy

IDE
Příklady a ukázky

Read other articles:

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Agustus 2020. Amanda Gardiner adalah tokoh wanita yang turut memberikan sumbangan pengetahuan secara global terhadap keberlanjutan dampak sosial.[1] Amanda adalah warga negara keturunan Amerika Serikat dan Inggris.[2] Amanda memberikan sumbangan pemi...

 

Halo[1]は、レーシングドライバーの頭部を保護する目的で、フォーミュラカーのコクピット周辺に取り付けられる環状の防護装置である。国際自動車連盟 (FIA) が統括するフォーミュラ1 (F1) などのフォーミュラカーレースにおいて、2018年以降順次導入が進められている。 Haloという名称は、その形状が聖人像の頭上に描かれる光輪 (halo) をイメージさせることから命名

 

Die Synode von Rathbreasail (irisch: Sionad Ráth Bhreasail) fand im Jahre 1111 in Irland statt. Rathbreasail liegt in der Nähe von Mountrath, im heutigen County Laois. Es war die zweite der vier großen Reformsynoden (Konzile). Die anderen drei waren Cashel (1101) und (1172) und Kells-Mellifont (1152). Vorgeschichte Die Synode von Cashel verabschiedete im Jahre 1101 verschiedene Dekrete und verbietet den Geistlichen Scheidung, Inzest und Priesterehe. Eine wesentliche Errungenschaft der Syno...

Resolusi 1290Dewan Keamanan PBBTuvaluTanggal17 Februari 2000Sidang no.4.103KodeS/RES/1290 (Dokumen)TopikPenambahan anggota baru PBB: TuvaluRingkasan hasil14 mendukungTidak ada menentang1 abstainHasilDiadopsiKomposisi Dewan KeamananAnggota tetap Tiongkok Prancis Rusia Britania Raya Amerika SerikatAnggota tidak tetap Argentina Bangladesh Kanada Jamaika Malaysia Mali Namibia Belanda Tunisia Ukraina Resolusi 1290...

 

Кіровоградська обласна державна адміністрація (Кіровоградська ОДА) Загальна інформаціяКраїна  УкраїнаДата створення 1992Попередні відомства Представництво Президента України в Кіровоградській областіШтаб-квартира 25006, м. Кропивницький, пл. Героїв Майдану, 1landmark_region:U...

 

Badan Siber dan Sandi Negara(BSSN)Lambang Badan Siber dan Sandi NegaraBendera Badan Siber dan Sandi NegaraGambaran umumDidirikan19 Mei 2017; 6 tahun lalu (2017-05-19)Dasar hukum Perpres No. 53 Tahun 2017 (diubah oleh Perpres No. 133 Tahun 2017; keduanya telah dicabut) Perpres No. 28 Tahun 2021 Nomenklatur sebelumnya Lembaga Sandi Negara Desk Ketahanan dan Keamanan Informasi Cyber Nasional Direktorat Keamanan Informasi Indonesia Security Incident Response Team on Internet Infrastructure B...

Shoe polish brand For other uses, see Kiwi (disambiguation). KiwiThe Kiwi logoOwnerS. C. Johnson & SonIntroduced1906; 117 years ago (1906)AustraliaPrevious ownersSara Lee CorporationWebsitekiwicare.com Kiwi is a global brand of shoe polish brand, originally developed in Australia in 1906 by William Ramsay. Kiwi has grown to be the dominant shoe polish in many countries since it was used by both the British and U.S. Armies in World War I. However it announced its exit fro...

 

Italian composer (1685–1757) For other people named Scarlatti, see Scarlatti (disambiguation). This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Domenico Scarlatti – news · newspapers · books · scholar · JSTOR (November 2007) (Learn how and when to remove this template message) You can help expand this artic...

 

Дуброви(заповідне урочище) 48°04′53″ пн. ш. 23°28′36″ сх. д. / 48.08139000002777408° пн. ш. 23.47667000002777726° сх. д. / 48.08139000002777408; 23.47667000002777726Координати: 48°04′53″ пн. ш. 23°28′36″ сх. д. / 48.08139000002777408° пн. ш. 23.47667000002777726° сх. д. / 48.081390000027...

Казимир Яворський  Сотник Курінний УПАЗагальна інформаціяНародження 1921(1921)с. Вілька Поторицька, нині с. Велике, Сокальська міська громада, Червоноградський район, Львівська областьСмерть 17 грудня 1947(1947-12-17)с. Кадобна, Калуський район, Івано-Франківська областьПсевдо Б...

 

Norwegian financial analyst Olaug SvarvaSvarva in 2016Born (1957-12-21) 21 December 1957 (age 65)Steinkjer, NorwayOccupationfinancial analystKnown forCEO of the Government Pension Fund – Norway 2006–2018 Olaug Svarva (born 21 December 1957) is a Norwegian financial analyst and former CEO of the Government Pension Fund of Norway. Biography Svarva was born in Steinkjer on 21 December 1957.[1] Her parents were running the car company Brødrene Svarva in Steinkjer.[2]...

 

Commune and town in Mascara Province, AlgeriaMers El Hadjadj مرسى الحجاجCommune and townMarsat el Hadjadj.Country AlgeriaProvinceMascara ProvinceDistrictBethioua DistrictPopulation (1998) • Total14,167 • Density730/sq mi (282/km2)Time zoneUTC+1 (CET) Mers El Hadjadj is a town and commune in mascara Province, Algeria. According to the 1998 census it has a population of 14,167.[1] Environment Mars El Hadjadj is located at the extreme east...

American baseball player (born 1992) Baseball player Dylan BundyBundy pitching for the Baltimore Orioles in 2016Free agent PitcherBorn: (1992-11-15) November 15, 1992 (age 31)Tulsa, Oklahoma, U.S.Bats: SwitchThrows: RightMLB debutSeptember 23, 2012, for the Baltimore OriolesMLB statistics (through 2022 season)Win–loss record54–65Earned run average4.74Strikeouts852 Teams Baltimore Orioles (2012, 2016–2019) Los Angeles Angels (2020–2021) Minnesota Twins (2022) Dylan ...

 

Political party in Malaysia Muslims Unity Movement Tengku Razaleigh HamzahMalay nameAngkatan Perpaduan UmmahJawi nameاڠکتن ڤرڤادوان اومةLeader-Founded1990Dissolved1996Preceded byMalayan Peoples' Socialist Front (SF) (jan 1957-1969) Harakah Keadilan Rakyat (HAK) (jan 1970-1990)Succeeded byBarisan Alternatif (BA)HeadquartersKuala Lumpur, Malaysia (PAS), (S46)& (KIMMA) Pasir Mas, Malaysia (BERJASA) Kota Bharu, Malaysia (HAMIM)Membership (1998)Pan-Malaysian Isla...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Maret 2016. SMA Negeri 7 BatanghariInformasiDidirikanTahun 2003JenisNegeriAkreditasiB[1]Nomor Pokok Sekolah Nasional10500237Jurusan atau peminatanIPA dan IPSRentang kelasX, XI IPA, XI IPS, XII IPA, XII IPSKurikulumKurikulum Tingkat Satuan PendidikanAlamatLok...

Handsome young men in China Little fresh meat (simplified Chinese: 小鲜肉; traditional Chinese: 小鮮肉; pinyin: xiǎoxiānròu) is a Chinese Internet buzzword used to describe handsome young men. It is most commonly used to refer to male celebrities, particularly rising stars.[1][2] Positive impact Luhan, lead actor of Fighter of the Destiny Star power and commercial value This term has been widely used as a selling point by Chinese entertainment agencies in ...

 

Camp Eagle(Camp Eagle Heliport)  Huế, Thừa Thiên Huế province in Vietnam3rd Brigade, 82nd Airborne bunker, 6 March 1968Camp EagleShown within VietnamCoordinates16°24′29″N 107°37′52″E / 16.408°N 107.631°E / 16.408; 107.631TypeArmy baseSite informationOperatorArmy of the Republic of Vietnam (ARVN)United States Army (U.S. Army)ConditionAbandonedSite historyBuiltJanuary 1968 (1968)In useJanuary 1968-1972 (1972)Battles/warsVietnam...

 

French poet and writer (1938–2018) François Montmaneix (June 4, 1938 in Lyon – October 21, 2018 in Lyon[1]) was a French poet and writer. Biography François Montmaneix was for many years an important player in Lyon's cultural life, directing the Maurice-Ravel auditorium, where he created the Artrium, an exhibition gallery, and Le Rectangle, center of art, place Bellecour. A founding member of the Prix Roger-Kowalski [fr], poetry prize of the city of Lyon created in...

Skarpnäck PerrongenStationsinformationKommunStockholms kommun (Söderort)TunnelbanaStockholms tunnelbanaInvigd15 augusti 1994KapacitetAntal spår2 stAntal plattformar1 stPlattformslängd145 meterAntal passagerare5 100 personer/vardag[1]FörbindelserLinjeGröna linjenLägeAvstånd från Slussen8,1 kmDjup under marknivå25 mStationssignaturSNKFöregående stationBagarmossenÖvrigtKonstnärlig utsmyckningRichard Nonas, granitskulpturerLinjekarta Skarpnäck är en station inom Stockholms tunnel...

 

PoetryTheatrical release posterSutradaraLee Chang-dongProduserLee Joon-dongDitulis olehLee Chang-dongPemeranYoon Jeong-heeSinematograferKim Hyun-seokPenyuntingKim HyeonPerusahaanproduksiPine House FilmDistributorNext Entertainment WorldTanggal rilis 13 Mei 2010 (2010-05-13) Durasi139 minutesNegaraSouth KoreaBahasaKoreanAnggaranUS$1.150.015(₩1.3 billion)PendapatankotorUS$2,230,640[1] Poetry (bhs. Indonesia: Puisi, Hangul: 시; Hanja: 詩; RR: S...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!