Skip to content
This repository has been archived by the owner on Feb 24, 2024. It is now read-only.

CH05 OpenGL ES Shading Language

Hyunwoo Jo edited this page Sep 18, 2023 · 1 revision

5์žฅ. OpenGL ES Shading Language

์ด์ „ ์žฅ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์…ฐ์ด๋”๋Š” OpenGL ES 3.0 API์˜ ํ•ต์‹ฌ์— ์žˆ๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  OpenGL ES 3.0 ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์˜๋ฏธ ์žˆ๋Š” ๊ทธ๋ฆผ์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์…ฐ์ด๋” ๊ฐœ๋…์ด API์—์„œ ์ฐจ์ง€ํ•˜๋Š” ์ค‘์š”์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ๊ทธ๋ž˜ํ”ฝ์Šค API์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๊ธฐ ์ „์— ์…ฐ์ด๋” ์ž‘์„ฑ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ˆ™์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์ด ์žฅ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ๋ณ€์ˆ˜ ๋ฐ ๋ณ€์ˆ˜ ์œ ํ˜•
  • ๋ฒกํ„ฐ ๋ฐ ํ–‰๋ ฌ ๊ตฌ์„ฑ ๋ฐ ์„ ํƒ
  • ์ƒ์ˆ˜
  • ๊ตฌ์กฐ์ฒด์™€ ๋ฐฐ์—ด
  • ์—ฐ์‚ฐ์ž, ์ œ์–ด ํ๋ฆ„ ๋ฐ ํ•จ์ˆ˜
  • ์ž…๋ ฅ/์ถœ๋ ฅ ๋ณ€์ˆ˜, ์œ ๋‹ˆํผ, ์œ ๋‹ˆํผ ๋ธ”๋ก, ๋ ˆ์ด์•„์›ƒ
  • ์ „์ฒ˜๋ฆฌ๊ธฐ ๋ฐ ์ง€์‹œ์–ด
  • ์œ ๋‹ˆํผ ๋ฐ ๋ณด๊ฐ„๊ธฐ ํŒจํ‚น
  • ์ •๋ฐ€ ํ•œ์ •์ž ๋ฐ ๋ถˆ๋ณ€์„ฑ

OpenGL ES Shading ์–ธ์–ด์˜ ๊ธฐ๋ณธ

์…ฐ์ด๋”์˜ ๊ตฌ๋ฌธ์€ c์–ธ์–ด์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. c์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์…ฐ์ด๋”์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ํฐ ์–ด๋ ค์›€์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„์ „ ์‚ฌ์–‘๊ณผ ์ง€์›๋˜๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‘ ์–ธ์–ด ๊ฐ„์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์…ฐ์ด๋” ๋ฒ„์ „ ์‚ฌ์–‘

OpenGL ES 3.0 ๋ฒ„ํ…์Šค ๋ฐ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ํ•ญ์ƒ ์…ฐ์ด๋” ๋ฒ„์ „์ด ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ์…ฐ์ด๋” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์…ฐ์ด๋”์— ์„ ์–ธ๋œ ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ์…ฐ์ด๋”๋ฅผ ์ปดํŒŒ์ผ ํ•ฉ๋‹ˆ๋‹ค. (์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด 1.00 ๋ฒ„์ „ ์‚ฌ์šฉ Opengles 2.0) ์…ฐ์ด๋”ฉ ์–ธ์–ด 3.0์—์„œ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

    non-square matrices, full integer support, interpolation qualifiers, uniform blocks, layout qualifiers, new built-in functions, full looping, full branching support, and unlimited shader instruction length

๋ณ€์ˆ˜ ๋ฐ ๋ณ€์ˆ˜ ์œ ํ˜•

์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์—์„œ๋Š” ๋ฐฑํ„ฐ์™€ ํ–‰๋ ฌ์ด (์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์—์„œ์˜?)๋ณ€ํ™˜์˜ ๊ธฐ์ดˆ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์…ฐ์ด๋”ฉ ์–ธ์–ด์˜ ํ•ต์‹ฌ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ํด๋ž˜์Šค ํƒ€์ž… ์„ค๋ช…
Scalars (์Šค์นผ๋ผ) float, int, uint, bool ๋ถ€๋™ ์†Œ์ˆ˜์ , ์ •์ˆ˜, ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๋ฐ ๋ถ€์šธ ๊ฐ’์— ๋Œ€ํ•œ ์Šค์นผ๋ผ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•
Floating-point-vectors (๋ถ€๋™์†Œ์ˆ˜์  ๋ฒกํ„ฐ) float, vec2, vec3, vec4 1๊ฐœ, 2๊ฐœ, 3๊ฐœ ๋˜๋Š” 4๊ฐœ์˜ ๊ตฌ์„ฑ์š”์†Œ์˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์œ ํ˜•
Integer vector (์ •์ˆ˜ ๋ฐฑํ„ฐ) int, ivec2, ivec3, ivec4 1๊ฐœ, 2๊ฐœ, 3๊ฐœ ๋˜๋Š” 4๊ฐœ ์„ฑ๋ถ„์˜ ์ •์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์œ ํ˜•
Unsigned integer vector (๋ถ€ํ˜ธ์—†๋Š” ์ •์ˆ˜ ๋ฒกํ„ฐ) uint, uvec2, uvec3, uvec4 1๊ฐœ, 2๊ฐœ, 3๊ฐœ ๋˜๋Š” 4๊ฐœ ์„ฑ๋ถ„์˜ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์œ ํ˜•
Boolean vector (๋ถ€์šธ ๋ฒกํ„ฐ) bool, bvec2, bvec3, bvec4 1๊ฐœ, 2๊ฐœ, 3๊ฐœ ๋˜๋Š” 4๊ฐœ ์„ฑ๋ถ„์˜ ๋ถ€์šธ ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์œ ํ˜•
Matrics (ํ–‰๋ ฌ) mat2, mat2x3, mat2x4, mat3x2, mat3, mat3x4, mat4x2, mat4x3, mat4 ํฌ๊ธฐ๊ฐ€ 2ร—2, 2ร—3, 2ร—4, 3ร—2, 3ร—3, 3ร—3, 4ร—2, 4ร—3 ๋˜๋Š” 4ร—4์ธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํ–‰๋ ฌ

์…ฐ์ด๋”ฉ ์–ธ์–ด์˜ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์„ ์–ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ :

float specularAtten;    // ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ธฐ๋ฐ˜ ์Šค์นผ๋ผ
vec4 vPosition;         // ๋ถ€๋™์†Œ์ˆ˜์  ๊ธฐ๋ฐ˜ 4-ํŠœํ”Œ ๋ฒกํ„ฐ
mat4 mViewProgection;   // 4 x 4 ํ–‰๋ ฌ ๋ณ€์ˆ˜ ์„ ์–ธ
ivec2 vOffset;          // ์ •์ˆ˜ ๊ธฐ๋ฐ˜ 2-ํŠœํ”Œ ๋ฒกํ„ฐ

๋ณ€์ˆ˜๋Š” ์„ ์–ธ ๋•Œ, ํ˜น์€ ์ดํ›„์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์œ ํ˜• ๋ณ€ํ™˜์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์ƒ์„ฑ์ž

  • ์…ฐ์ด๋”์—์„œ๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์˜ ๋ณ€ํ™˜์— ๋Œ€ํ•˜์—ฌ ๊ทœ์น™์ด ์—„๊ฒฉํ•จ. ๋ณ€์ˆ˜๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๋ณ€์ˆ˜์—๋งŒ ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ์„ ํ•  ์‹œ ๊ฐ™์€ ํƒ€์ž…์ด์–ด์•ผ๋งŒ ํ•œ๋‹ค.

  • ์•”์‹œ์  ํƒ€์ž… ๋ณ€ํ™˜(implicit type conversion) ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ โ†’ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•œ ๋ฒ„๊ทธ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ

  • ํƒ€์ž… ๋ณ€ํ™˜์ด ์ž์œ ๋กญ์ง€ ์•Š์•„์„œ(?์ œ์•ฝ์ด ์žˆ์–ด์„œ?) ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

    • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ
    • ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๊ฐ„์˜ ํ˜•๋ณ€ํ™˜ ๊ฐ€๋Šฅ
    • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ (๋˜๋Š” ์…ฐ์ด๋”์—์„œ ๋‚˜์ค‘์—) ์ดˆ๊ธฐํ™”
    • ๋‚ด์žฅ๋œ ๊ฐ ๋ณ€์ˆ˜ ํƒ€์ž…์—๋Š” ๊ด€๋ จ ์ƒ์„ฑ์ž๋“ค์ด ์žˆ์Œ
    • ์ดˆ๊ธฐํ™”/์บ์ŠคํŒ… ์˜ˆ์‹œ
    float myFloat = 1.0;
    float myFloat2 = 1; // ERROR: invalid type conversion
    bool  myBool = true;
    int   myInt = 0;
    int   myInt2 = 0.0; // ERROR: invalid type conversion
    myFloat = float(myBool); // [myBool] Convert from bool -> float
    myFloat = float(myInt);  // [myInt]  Convert from int  -> float
    myBool  = bool(myInt);   // [myInt]  Convert from int  -> bool
  • ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ ๋˜ํ•œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€ํ™˜๊ณผ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅํ•จ. ๋ฒกํ„ฐ ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์ธ์ˆ˜๋Š” ๋™์ผํ•œ built in type (float, int, bool)๋กœ ๋ณ€ํ™˜๋จ. ๋ฒกํ„ฐ ์ƒ์„ฑ์ž์— ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€:

    1. ์ƒ์„ฑ์ž์— ์ธ์ˆ˜๋ฅผ 1๊ฐœ๋งŒ ๋„ฃ์œผ๋ฉด ๊ทธ ๊ฐ’์ด ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ๊ฐ’์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ

    2. ์—ฌ๋Ÿฌ ์Šค์นผ๋ผ ๋˜๋Š” ๋ฒกํ„ฐ ์ธ์ˆ˜๊ฐ€ ์ œ๊ณต๋˜๋ฉด ํ•ด๋‹น ์ธ์ˆ˜๋ฅผ ์™ผ์ชฝ์—์„œ ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋กœ ์„ค์ •. ์—ฌ๋Ÿฌ ์Šค์นผ๋ผ ์ธ์ˆ˜๊ฐ€ ์ œ๊ณต๋œ ๊ฒฝ์šฐ, ์ธ์ˆ˜๋กœ ๋“ค์–ด์˜จ ์Šค์นผ๋ผ ์ปดํฌ๋„ŒํŠธ ์ˆ˜(== ์Šค์นผ๋ผ ๊ฐ’์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋ฒกํ„ฐ์˜ ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋งŒํผ ๋งŽ์•„์•ผํ•จ Untitled

  • ํ–‰๋ ฌ(๋งคํŠธ๋ฆญ์Šค)์˜ ๊ฒฝ์šฐ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค(flexibleํ•˜๋‹ค)

    • ํ–‰๋ ฌ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๊ทœ์น™

      • ํ–‰๋ ฌ ์ƒ์„ฑ์ž์— ์Šค์นผ๋ผ ์ธ์ˆ˜๊ฐ€ 1๊ฐœ ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น ๊ฐ’์€ ํ–‰๋ ฌ์˜ ๋Œ€๊ฐ์„ ์— ๋ฐฐ์น˜๋จ. ์˜ˆ๋ฅผ๋“ค์–ด mat4(1.0)์€ 4*4 ํ–‰๋ ฌ์„ ์ƒ์„ฑํ•จ
      • ํ–‰๋ ฌ์€ ์—ฌ๋Ÿฌ ๋ฒกํ„ฐ ์ธ์ž๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ. ์˜ˆ๋ฅผ๋“ค์–ด mat2๋Š” 2๊ฐœ์˜ vec2๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ
      • ํ–‰๋ ฌ์€ ํ–‰๋ ฌ์˜ ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์ˆœ์œผ๋กœ ์„ค์ •๋˜๋Š” ์—ฌ๋Ÿฌ ์Šค์นผ๋ผ ๊ฐ’์„ ์ธ์ž๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ
    • ํ–‰๋ ฌ์˜ ๊ตฌ์„ฑ์€ ์œ„์˜ ๊ธฐ๋ณธ๊ทœ์น™๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๋‹ค

    • ํ–‰๋ ฌ์„ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ธ์ž๋“ค๋งŒ ์žˆ๋‹ค๋ฉด, ์Šค์นผ๋ผ์™€ ๋ฒกํ„ฐ์˜ ์กฐํ•ฉ๋“ค๋กœ ํ–‰๋ ฌ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์—ด(column)๋ถ€ํ„ฐ ์ฑ„์šด๋‹ค

      Untitled 1

๋ฒกํ„ฐ์™€ ํ–‰๋ ฌ ์ปดํฌ๋„ŒํŠธ

โ€œ.โ€์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด ์ฒจ์ž โ€œ[]โ€๋ฅผ ํ†ตํ•ด์„œ ๋ฒกํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•จ

  • โ€œ.โ€์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

    • ๋ฒกํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜์— ๋”ฐ๋ผ์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์Œ ๋ฌธ์ž๋“ค์˜ ํ˜ผํ•ฉ(= ๋ช…๋ช…๊ทœ์น™)์„ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ {x, y, z, w}, {r, g, b, a}, {s, t, p, q}

      • 3๊ฐ€์ง€๊ฐ€ ์ด๋ฆ„์ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ด์œ  : ๋ฒกํ„ฐ๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜ํ•™์„œ ์“ฐ๋Š” ์ˆ˜ํ•™, ์ƒ‰, Texture Coordinate 3๊ฐ€์ง€์—ฌ์„œ.

      • ๋ฒกํ„ฐ์— ์ ‘๊ทผ ํ•  ๋•Œ 1๋ฒˆ์— 1๊ฐœ์˜ ๋ช…๋ช…๊ทœ์น™๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ

      • ์˜ˆ์‹œ!

      Untitled 2

  • ๋ฐฐ์—ด์ฒจ์ž โ€œ[]โ€ ์‚ฌ์šฉ

    • [0]์€ x, [1]๋Š” y, [2]๋Š” z

    • ํ–‰๋ ฌ์€ ์—ฌ๋Ÿฌ ๋ฒกํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•จ

    • ํ–‰๋ ฌ์—์„œ ํ–‰์€ ๋ฐฐ์—ด ์ฒจ์ž ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ‘œํ˜„ ๊ฐ€๋Šฅ

    • ์˜ˆ์‹œ!

      Untitled 3

์ƒ์ˆ˜ Constants

์ƒ์ˆ˜๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์€ ๋‹ค ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋Š” ์…ฐ์ด๋” ์•ˆ์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ ค๋ฉด constํ•œ์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ์‹œ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

Untitled 4

C๋‚˜ C++์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ๊ธฐ์ „์šฉ์ด๋ฉฐ ์†Œ์Šค ๋‚ด์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด

๊ธฐ๋ณธ ํƒ€์ž… ์™ธ์—๋„ C์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€์ˆ˜๋“ค์„ ๊ตฌ์กฐ์ฒด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Untitled 5

fogStruct๋ผ๋Š” ๊ตฌ์กฐ์ฒด์™€ fogVar๋ผ๋Š” ์ƒˆ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๊ตฌ์กฐ์ฒด๊ฐ€ ์ •์˜๋˜๋ฉด ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ƒˆ ๊ตฌ์กฐ์ฒด ์ƒ์„ฑ์ž๋„ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ์œ ํ˜•๊ณผ ์ƒ์„ฑ์ž๋Š” ์ผ๋Œ€์ผ๋กœ ๋Œ€์‘๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Untitled 6

๊ตฌ์กฐ์ฒด์˜ ์š”์†Œ์— ์ ‘๊ทผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ c์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

Untitled 7

๋ฐฐ์—ด

C์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. index 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Untitled 8

์ดˆ๊ธฐํ™” ํ•˜๊ธฐ:

Untitled 9

๋ฐฐ์—ด ์ƒ์„ฑ์ž์— ํฌ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์ƒ์„ฑ์ž์˜ ์ธ์ž ์ˆ˜๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์ž

Untitled 10

Untitled 11

  • ๊ฑฐ์˜ ๋‹ค C๋ž‘ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด์ง„ ์—ฐ์‚ฐ์ž(*, /, +, -)์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ ์œ ํ˜•์€ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋˜๋Š” ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณฑํ•˜๊ธฐ๋Š” float, vector, matrix์˜ ์กฐํ•ฉ๋“ค๊ฐ„์—๋งŒ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    Untitled 12

  • ๋น„๊ต ์—ฐ์‚ฐ์ž๋Š” ==์™€ !=(<, <=, >, >=)๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์Šค์นผ๋ผ ๊ฐ’์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฒกํ„ฐ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋‚˜์ค‘์— ๋‚˜์™€์šฉ

ํ•จ์ˆ˜

  • C์–ธ์–ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ์–ธ
  • ์„ ์–ธํ•œ ์‹œ์  ๋ณด๋‹ค ๋จผ์ € ์‚ฌ์šฉํ•˜๋ ค๋ฉด prototype ์จ์ค˜์•ผ ํ•จ
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•œ์ •์ž ์ง€์›๋จ
    • in : (์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’) ์ด ํ•œ์ •์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ํ•จ์ˆ˜์— ์˜ํ•ด ์ˆ˜์ •๋˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • inout : ์ด ํ•œ์ •์ž๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜์— ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋˜๊ณ  ๊ฐ’์ด ์ˆ˜์ •๋˜๋ฉด ํ•จ์ˆ˜ ์ข…๋ฃŒ ํ›„ ๋ณ€๊ฒฝ๋˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • out : ์ด ํ•œ์ •์ž๋Š” ๋ณ€์ˆ˜ ๊ฐ’์ด ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์ง€ ์•Š์ง€๋งŒ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋  ๋•Œ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. โ†’ ์ž˜ ์•ˆ์”€. return ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
  • ์žฌ๊ท€ํ˜ธ์ถœ ์ง€์›x
  • ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ๋Š” inlineํ•จ์ˆ˜ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ callํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๋กœ ๋Œ€์ฒด
  • stack์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” GPU๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด inline implementation์ง€์›

๋นŒํŠธ์ธ ํ•จ์ˆ˜

  • ๋นŒํŠธ์ธ ํ•จ์ˆ˜ ์ง€์›

Untitled 13

  • ์—„์ฒญ ๋งŽ๋‹ค๊ณ  ํ•œ๋‹ค

Control-Flow ๊ตฌ๋ฌธ

OpenGL ES Shading์–ธ์–ด์˜ control flow syntax๋Š” C ์–ธ์–ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ if-then-else ๊ตฌ๋ฌธ์€ C์™€ ๊ฐ™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Untitled 14

์กฐ๊ฑด๋ฌธ(conditional statement) ์•ˆ์— ์žˆ๋Š” ํ‘œํ˜„์‹์€ ๋ฐ˜๋“œ์‹œ boolean value์ด์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, boolean value ๋˜๋Š” boolean value๋ฅผ ๋„์ถœํ•˜๋Š” ํ‘œํ˜„์‹(์˜ˆ์ปจ๋Œ€ ๋น„๊ต ์—ฐ์‚ฐ์ž)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด OpenGL ES Shading ์–ธ์–ด์—์„œ ์กฐ๊ฑด๋ฌธ์ด ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹์˜ ๊ธฐ์ €์— ๊น”๋ ค์žˆ๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ฌธ ์ด์™ธ์—๋„, while, do-while loop๋ฅผ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. OpenGL ES 2.0์—์„œ๋Š” loop๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์—„๊ฒฉํ•œ ์ œ์•ฝ์ด ์กด์žฌํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค์ง ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํŽผ์ณ์ง€๋Š”(unrolled) loop๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ œ์•ฝ์€ ๋”์ด์ƒ 3.0 ๋ฒ„์ ผ์—์„œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GPU ํ•˜๋“œ์›จ์–ด๋Š” loop์™€ flow control๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ loop๋Š” ์ง€์›์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ loop๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด performance์— ์˜ํ–ฅ์ด ์•„์˜ˆ ์—†๋‹ค๊ณ  ํ•˜๋Š”๊ฒƒ์„ ๋งํ•˜๊ณ ์ž ํ•˜๋Š”๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ GPU ์•„ํ‚คํ…์ณ๋Š”, vertices์™€ fragments๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ batch๋ฅผ ํ†ตํ•ด parallel ํ•˜๊ฒŒ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค. GPU๋Š” ๋ณดํ†ต ํ•˜๋‚˜์˜ batch์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  vertices์™€ fragment๋“ค์€ ํ๋ฆ„์ œ์–ด๊ตฌ๋ฌธ์˜ ๋ชจ๋“  ๋ถ„๊ธฐ๋“ค (๋˜๋Š” loop)์„ ๋น ์ง์—†์ด ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. Batch ์‚ฌ์ด์ฆˆ๋Š” GPU์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ํŠน์ • ์•„ํ‚คํ…์ฒ˜์—์„œ ํ๋ฆ„ ์ œ์–ด ์‚ฌ์šฉ์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœํŒŒ์ผ๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฝํ—˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ฐฉ๋ฒ•์€, ๋„ˆ๋ฌด ๋ณต์žกํ•œ ํ๋ฆ„์ œ์–ด ๊ตฌ๋ฌธ์„ ํ”ผํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํ•œ์ค„๋กœ ์ ์„์ˆ˜๋ก ์กฐ๊ธˆ๋” ๋นจ๋ผ์ง)

๐Ÿ’ก ์œ„์˜ ๋ฌธ์ œ์ ์„ branch divergence๋ผ๊ณ ๋„ ํ•œ๋‹ค.

Uniform

OpenGL ES Shading Language์—์„œ์˜ ๋ณ€์ˆ˜ ํƒ€์ž… ์ œ์–ด์ž ์ค‘ ํ•˜๋‚˜๋Š” uniform๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. Uniform ๋ณ€์ˆ˜๋Š” application์— ์˜ํ•ด์„œ OpenGL ES 3.0 API์ฝœ์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ read-only ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ†ต์ƒ์ ์œผ๋กœ, Vertex shader์™€ fragment shader๋“ค์— ๋™์‹œ์— ์‚ฌ์šฉ๋˜๋ฉด์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด uniform์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    Untitled 15

  • compile-time์— ๊ฐ’์ด ์ •ํ•ด์ง€๋Š” ์ƒ์ˆ˜๋“ค์€ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ constant๋กœ ์ง€์ •๋˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

  • Uniform ๋ณ€์ˆ˜๋“ค์€ vertex shader, fragment shader์—์„œ ๊ณต์œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ™์€ type๊ณผ ์ด๋ฆ„์œผ๋กœ ์„ ์–ธ๋˜์–ด์„œ ์„œ๋กœ ๋งค์นญ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • โ€œconstant storeโ€๋กœ ์•Œ๋ ค์ง„ ํ•˜๋“œ์›จ์–ด ๊ณต๊ฐ„์— ์ €์žฅ์ด ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต์˜๊ฒฝ์šฐ ์ด ๊ณต๊ฐ„์€ ํ•œ์ •๋œ ๊ณต๊ฐ„์ด๋ผ ์ €์žฅ๋  ์ˆ˜ ์žˆ๋Š” uniform ๊ฐฏ์ˆ˜๋Š” ํ•œ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. gl_MaxVertexUniformVectors, gl_MaxFragmentUniformVectors ๋‚ด์žฅ ๋ณ€์ˆ˜๋ฅผ ์ฝ์Œ์œผ๋กœ์จ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ๋กœ ๋ณด์žฅํ•˜๋Š” ๊ฐฏ์ˆ˜๋Š” 256๊ฐœ์˜ vertex uniform vectors์™€ 224๊ฐœ์˜ fragment uniform vectors์ž…๋‹ˆ๋‹ค.

Vertex and Fragment Shader Inputs/Outputs

  • opengl es์˜ ํŠน์ˆ˜๋ณ€์ˆ˜ํƒ€์ž…(?!) Vertex input(๋˜๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ)
  • ๋ฒ„ํ…์Šค ์ž…๋ ฅ ๋ณ€์ˆ˜๋Š” ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์— ๋Œ€ํ•œ ๋ฒ„ํ…์Šค๋ณ„ ์ž…๋ ฅ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ in ํ‚ค์›Œ๋“œ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • ์œ„์น˜, ๋…ธ๋ง, ํ…์Šค์ฒ˜ ์ขŒํ‘œ ์ƒ‰์ƒ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅํ•จ
  • ๊ฐ ๋ฒ„ํ…์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ„

Untitled 16

  • layout ํ•œ์ •์ž๋Š” vertex attribute์˜ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ (์„ ํƒ์‚ฌํ•ญ์ด๋ฉฐ ์•ˆ ํ•˜๋ฉด ๋ง์ปค์—์„œ ์ž๋™ํ• ๋‹น)

    • 6์žฅ์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.
  • vertex shader input๊ณผ ๋‹ฌ๋ฆฌ vertex shader output/fragment shader input ๋ณ€์ˆ˜์—์„œ๋Š” layout ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

  • ํ•˜๋“œ์›จ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„ํ…์Šค ์…ฐ์ด๋” ์ถœ๋ ฅ/ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” ์ž…๋ ฅ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค(ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ๋ณดํ†ต ์ด๋ฅผ ๋ณด๊ฐ„๊ธฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค). ์ง€์›ํ•˜๋Š” ๋ฒ„ํ…์Šค ์…ฐ์ด๋” ์ถœ๋ ฅ์˜ ์ˆ˜๋Š” gl_MaxVertexOutputVectors ๋‚ด์žฅ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค

    • (glGetIntegerv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GL_MAX_VERTEX_OUTPUT_COMPONENTS๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉด ๋ฒกํ„ฐ ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ด ์ปดํฌ๋„ŒํŠธ ๊ฐ’์˜ ์ˆ˜๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค)
  • OpenGL ES 3.0 ๊ตฌํ˜„์ด ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํ…์Šค ์ถœ๋ ฅ ๋ฒกํ„ฐ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” 16๊ฐœ

  • ์ง€์›ํ•˜๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” ์ž…๋ ฅ์˜ ์ˆ˜๋Š” gl_MaxFragmentInputVectors์— ์˜ํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค

    • (glGetIntegerv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GL_MAX_FRAGMENT_INPUT_COMPONENTS๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉด ๋ฒกํ„ฐ ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ด ์ปดํฌ๋„ŒํŠธ ๊ฐ’์˜ ์ˆ˜๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค).
  • OpenGL ES 3.0 ๊ตฌํ˜„์ด ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฐ ์ž…๋ ฅ ๋ฒกํ„ฐ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” 15๊ฐœ

  • ์˜ˆ์ œ

    Untitled 17

  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์‰์ด๋”๋Š” 1๊ฐœ ์ด์ƒ์˜ ์ƒ‰์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Œ

    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ ์ƒ‰์ƒ ๋ฒ„ํผ๋กœ๋งŒ ๋ Œ๋”๋ง, ์ด๋•Œ layout ํ•œ์ •์ž๋Š” ์„ ํƒ์‚ฌํ•ญ (์ถœ๋ ฅ ๋ณ€์ˆ˜๋Š” 0๋ฒˆ์งธ๋กœ ์ด๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •)
    • ๋ฉ€ํ‹ฐ ๋ Œ๋” ํƒ€๊นƒ(MRT)์œผ๋กœ ๋ Œ๋”๋ง ํ•  ๋•Œ๋Š” layout ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ์ถœ๋ ฅ์ด ์–ด๋–ค ๋ Œ๋” ํƒ€๊นƒ์œผ๋กœ ์ด๋™ํ•˜๋Š”์ง€ ์ง€์ • ๊ฐ€๋Šฅ.
  • ๋ณดํ†ต ํ”„๋ž˜๊ทธ๋จผํŠธ ์‰์ด๋”์— 1๊ฐœ์˜ ์ถœ๋ ฅ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ , ์ด ๊ฐ’์€ ํŒŒ์ดํ”„๋ผ์ธ โ€˜per-fragment operationsโ€™๋กœ ์ „๋‹ฌ ๋  ์ถœ๋ ฅ ์ƒ‰์ƒ์ด ๋จ

Interpolation Qualifiers

  • vertex shader output๊ณผ fragment shader input ์—์„œ๋Š” ํ•œ์ •์ž ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ

    • ํ•œ์ •์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ถ€๋“œ๋Ÿฌ์šด ์‰์ด๋”ฉ(smooth shading)์„ ์ˆ˜ํ–‰ํ•จ

    • vertex shaer ouput์˜ ์ถœ๋ ฅ๋ณ€์ˆ˜๋Š” (primitive ์ „์ฒด์— ๊ฑธ์ณ) ์„ ํ˜•๋ณด๊ฐ„๋˜๋ฉฐ, fragment shader๋Š” ์„ ํ˜• ๋ณด๊ฐ„๋œ ๊ฐ’์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Œ

    • ์˜ˆ์‹œ

      Untitled 18

  • Flat Shading

    • opengl es 3.0์—์„œ ์ถ”๊ฐ€๋จ

    • vertex shader์˜ ์ถœ๋ ฅ๋ณ€์ˆ˜๊ฐ€ ๋ณด๊ฐ„๋˜์ง€ ์•Š์Œ

    • ๋Œ€์‹  vertex ์ค‘์— 1๊ฐœ๋ฅผ provoking vertex๋กœ ์ •ํ•˜๊ณ (primitive์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ„. 7์žฅ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…), ์ด vertex์˜ ๊ฐ’ primitive์˜ ๋ชจ๋“  fragments์— ์‚ฌ์šฉํ•จ

    • ์˜ˆ์‹œ

      Untitled 19

  • centroid

    • ๋ณด๊ฐ„๊ธฐ์— centroid๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ํ•œ์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

    • 11์žฅ์— ์ž์„ธํžˆ ๋‚˜์˜ด

    • ๋ฉ€ํ‹ฐ์ƒ˜ํ”Œ๋ง์œผ๋กœ ๋ Œ๋”๋งํ•  ๋•Œ, centroid ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง๋˜๋Š” primitive ๋‚ด๋ถ€์—์„œ ๋ณด๊ฐ„์„ ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

      • ์•ˆํ•ด์ฃผ๋ฉด primitive ๊ฐ€์žฅ์ž๋ฆฌ์— ์•„ํ‹ฐํŒฉํŠธ ๋ฐœ์ƒ
    • ์˜ˆ์‹œ

      Untitled 20

Preprocessor and Directives

  • OpenGL ES Shading Language์˜ preprocessor๋Š” ๋Œ€๋ถ€๋ถ„ C++ preprocessor๊ด€์Šต์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Macro์ •์˜๋ฌธ, ์กฐ๊ฑด๋ฌธ์€ ๋‹ค์Œ ์ง€์‹œ์ž๋ฅผ ์ด์šฉํ•ด์„œ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Untitled 21

  • C++์—์„œ๋Š” parameter์—†์ด ๋ฉ”ํฌ๋กœ๊ฐ€ define๊ฐ€๋Šฅํ•˜์ง€๋งŒ OpenGL ES Shading Language์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์Œ macro๋“ค์€ ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Untitled 22

  • #error ์ง€์‹œ์ž๋Š” ์…ฐ์ด๋”๊ฐ€ ์ปดํŒŒ์ผ ๋ ์‹œ ๊ด€๋ จ๋œ ๋ฉ”์„ธ์ง€๋ฅผ info log์— ์ €์žฅ์‹œํ‚ค๋ฉด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • #pragma ์ง€์‹œ์ž๋Š” ํŠน์ • ๊ตฌํ˜„์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง€์‹œ๋“ค์„ ํ‘œํ˜„ํ• ๋•Œ ์“ฐ์ž…๋‹ˆ๋‹ค.
  • #extension ์ง€์‹œ์ž๋Š” vendor ๋˜๋Š” vendor๋“ค์˜ ๊ทธ๋ฃน์ด OpenGL ES Shading ์–ธ์–ด๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์„๋•Œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ• ์ง€ ๋“ฑ์˜ ํ–‰๋™์–‘์‹์„ ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Vendor๋“ค์ด OpenGL ES Shading ์–ธ์–ด๋ฅผ ํ™•์žฅํ•  ์‹œ, ํ™•์žฅ ์‚ฌ์–‘์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์˜ˆ์ปจ๋Œ€, GL_NV_shadow_samplers_cube). ์…ฐ์ด๋”๋Š” ๋ฐ˜๋“œ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ extension๋“ค์„ ์‚ฌ์šฉํ• ๊ฒƒ์ธ์ง€, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ–‰๋™์–‘์‹์„ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ #extension ์ง€์‹œ์ž๋ฅผ ํ†ตํ•ด ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์‹œ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

Untitled 23

  • ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” extention์˜ ์ด๋ฆ„ ๋˜๋Š” all์ด ์˜ฌ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. all์ธ๊ฒฝ์šฐ ๋ชจ๋“  extention๋“ค์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • ๊ตฌ์ฒด์  ํ–‰๋™ ๋ฐฉ์‹

      Untitled 24

      Untitled 25

Uniform๊ณผ Interpolator Packing

  • Uniform๋“ค์€ ํ•˜๋“œ์›จ์–ด์˜ constant store์— ์ €์žฅ๋จ.
  • Vertex shader output/fragment shader input๋“ค์€ ํ•˜๋“œ์›จ์–ด์˜ interpolators๋ผ๋Š” ๊ณต๊ฐ„์— ์ €์žฅ๋จ.
  • Constant store๋‚˜ interpolators๋ชจ๋‘ vector๋“ค์˜ array๋กœ ํ‘œํ˜„๋˜๋Š”๊ณต๊ฐ„์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์…ฐ์ด๋”์•ˆ์˜ ๋‹ค์–‘ํ•œ ํƒ€์ž…๋“ค(scalar, vector, matrix๋“ฑ)์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„(๋ฉ”๋ชจ๋ฆฌ)์— ๋งคํ•‘์ด ๋˜๋Š”๊ฐ€? โ†’ packing rule

Packing rule

  • ์…ฐ์ด๋” ์•ˆ์˜ uniform, interpolators๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์— ๋งคํ•‘๋ ์ง€๋ฅผ ๊ด€์žฅํ•˜๋Š” rule.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„(๋ฉ”๋ชจ๋ฆฌ)์ด 4๊ฐœ์˜ column๊ณต๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์ ธ์žˆ๊ณ , n๊ฐœ์˜ row๊ฐ€ ๊ฐ๊ฐ storage location์œผ๋กœ ๋งคํ•‘์ด ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Packing rule์€ ๋ณ€์ˆ˜๋“ค์„ ์ฑ„์›Œ๋„ฃ์„๋•Œ(pack variables) ์ƒ์„ฑ๋œ ์ฝ”๋“œ(generated code)๊ฐ€ ์ƒ์ˆ˜ํ•ญ์— ๋น„๋ก€ํ•ด์„œ ์ปค์งˆ์ •๋„๋กœ ์ฑ„์›Œ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ๋ง๋กœ ํ•˜๋ฉด packing์œผ๋กœ ์ธํ•ด ์ถ”๊ฐ€์ ์ธ ๊ธฐ๊ณ„์–ด ๋ช…๋ น์ด ์ƒ๊ธฐ์ง€ ์•Š์„์ •๋„๋กœ packingํ•ฉ๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ํŒจํ‚น ๊ทœ์น™์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋กœ ๋‹ค์Œ์˜ uniform ๋ณ€์ˆ˜ 3๊ฐœ๋ฅผ packing rule์„ ์ ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ์™€ packing rule์„ ์ ์šฉํ–ˆ์„๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    Untitled 26

    Untitled 27

    Untitled 28

    • packing rule ์—†๋‹ค๋ฉด ์ƒ๋‹นํ•œ ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค(Table 5-6).
    • packing rule์„ ์ ์šฉํ•˜๋ฉด ๊ณต๊ฐ„์ด ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค(Table 5-7). Array f์˜ ๊ฒฝ์šฐ packing ํ›„์—๋„ ์—ฌ๋Ÿฌ ํ–‰๋“ค์— ๊ฑธ์ณ์ ธ ์žˆ๋Š”๋ฐ, ์ด๋Š” GPU๋Š” constant store๋ฅผ index์‹œ vector location index๋กœ indexํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • OpenGL ES ์…ฐ์ด๋”ฉ ์–ธ์–ด์—์„œ packing์„ ํ•จ์— ๋”ฐ๋ผ uniform, vertex shader outputs/fragment shader input๋“ค์ด ์–ด๋–ป๊ฒŒ ์„ธ์–ด์ง€์–ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ •ํ•ด๋†“์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ตฌํ˜„์ฒด์—์„œ ๋Œ์•„๊ฐ€๊ฒŒ ๋ณด์žฅํ•˜๋ ค๋ฉด, ํŒจํ‚นํ›„์˜ uniform, interpolator๋“ค์ด ๊ฐ๊ฐ ์ตœ์†Œ ํ—ˆ์šฉ ์ €์žฅ์†Œ ํฌ๊ธฐ๋ฅผ ๋„˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    Precision Qualifiers

    • shader ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ณ„์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋Š” ์ •๋ฐ€๋„ ์ง€์ • ๊ฐ€๋Šฅ.
    • low, medium, high ์ •๋ฐ€๋„๋กœ ์„ ์–ธ ๊ฐ€๋Šฅ.
    • ์ปดํŒŒ์ผ๋Ÿฌ์— hint๋กœ ์‚ฌ์šฉ๋˜์–ด ๋” ๋‚ฎ์€ ๋ฒ”์œ„, ์ •๋ฐ€๋„๋กœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ณ„์‚ฐ ์ˆ˜ํ–‰๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •.
    • ์ •๋ฐ€๋„ ๋‚ฎ์„ ๊ฒฝ์šฐ:
      • shader ์‹คํ–‰ ์†๋„ ์ฆ๊ฐ€ ๋˜๋Š” ๋” ๋‚˜์€ ์ „๋ ฅ ํšจ์œจ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ.
        • ์ผ๋ถ€ opengl es implementation์˜ ๊ฒฝ์šฐ์—์„œ๋งŒ ํ•ด๋‹น.
        • ์ผ๋ถ€๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€์—์„œ๋Š” ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ตœ๊ณ  ์ •๋ฐ€๋„๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ•œ์ •์ž๋ฅผ ๋ฌด์‹œํ•ด๋„ ๋จ. opengl es ์‚ฌ์–‘์—์„œ ๊ธฐ๋ณธ ํ•˜๋“œ์›จ์–ด์—์„œ ์—ฌ๋Ÿฌ ์ •๋ฐ€๋„๋ฅผ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.
      • ์ด๋Ÿฐ ํšจ์œจ์„ฑ ํ–ฅ์ƒ์—๋Š” ์ •๋ฐ€๋„๊ฐ€ ํฌ์ƒ๋˜๋ฏ€๋กœ presicion qualifiers ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด artifact ๋ฐœ์ƒ ๊ฐ€๋Šฅ.
    • ๋ถ€๋™ ์†Œ์ˆ˜์  / ์ •์ˆ˜ ๊ธฐ๋ฐ˜ ๋ณ€์ˆ˜์˜ ์ •๋ฐ€๋„ ์ง€์ •์— ์‚ฌ์šฉ.
    • lowp, meduimp, highp ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
highp vec4 position;
varyin lowp vec4 color;
mediump float specularExp;
  • precision qualifier ์—†์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๊ฒฝ์šฐ, default precision qualifier๋กœ ์„ค์ •.

์•„๋ž˜์™€ ๊ฐ™์ด vertex shader / fragment shader ๋งจ ์œ„์— ์ง€์ •.

precision highp float;
precision mediump int;
  • ํŠน์ • ๋ณ€์ˆ˜ ํƒ€์ž…์— ์ง€์ •๋œ precision : ํ•ด๋‹น ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์— ์ ์šฉ.

    • int์— ์ง€์ •๋œ precision : ๋ชจ๋“  int ๋ณ€์ˆ˜ precision.
  • vertex shader์—์„œ precision quailfier ์—†์ด ์„ ์–ธ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜ : ๊ฐ€์žฅ ๋†’์€ ์ •๋ฐ€๋„ ๊ฐ€์ง.

  • fragment shader : floating-point์— ๋Œ€ํ•œ default precision ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์Œ.

    • ๋ชจ๋“  shader : default float precision ์„ ์–ธ / ๋ชจ๋“  float ๋ณ€์ˆ˜์— ๋Œ€ํ•œ precision ์„ ์–ธํ•ด์•ผ ํ•จ.
  • precision qualifier๋กœ ์ง€์ •๋œ precision : ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋ฒ”์œ„ / ์ •๋ฐ€๋„ ๋‹ฌ๋ผ์ง.

    • ์ฃผ์–ด์ง„ ๊ตฌํ˜„ ๋ฒ”์œ„ / ์ •๋ฐ€๋„ ๊ฒฐ์ • ์œ„ํ•œ API ํ˜ธ์ถœ์€ 15์žฅ์—์„œ ๋‹ค๋ฃธ.

Invariance

  • โ€œinvariance(๋ถˆ๋ณ€์„ฑ)โ€ : vertex shader์˜ ๋ชจ๋“  ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ์— ์ ์šฉ ๊ฐ€๋Šฅ.

  • ๋ฌธ์ œ : shader ์ปดํŒŒ์ผ โ†’ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ํ›„ instruction ์ˆœ์„œ ๋ณ€๊ฒฝ โ†’ ๋‘ shader ๊ฐ„ ๋™๋“ฑํ•œ ๊ณ„์‚ฐ ๋ณด์žฅ๋˜์ง€ ์•Š์Œ. (๋‘ ์‰์ด๋”๊ฐ€ ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ํ•ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๋ณด์žฅx.)

    • multipass shader effect(์•ŒํŒŒ ๋ธ”๋ Œ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ทธ ์œ„์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ)์—์„œ ํŠนํžˆ ๋” ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ.
    • ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ ์œ„์น˜ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์˜ ์ •๋ฐ€๋„๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ โ†’ artifact ๋ฐœ์ƒ.
    • Z fighting์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚จ. (ํ”ฝ์…€๋‹น ์ž‘์€ z ์ •๋ฐ€๋„ ์ฐจ์ด๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒจ์Šค๊ฐ€ ์„œ๋กœ ๋ฐ˜์ง์ด๋Š” ๊ฒƒ)
  • multipass shading์‹œ ๋ถˆ๋ณ€์„ฑ์ด ์ค‘์š”ํ•œ ์ด์œ 

    • fragment shader

      • ์ฒซ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ specular ์กฐ๋ช…์„ ๊ณ„์‚ฐ.
      • ๋‘ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ ambient , diffuse ์กฐ๋ช… ๊ณ„์‚ฐ.
    • vertex shader

      • ๋ถˆ๋ณ€์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‘ shader์˜ ์ •๋ฐ€๋„ ์ฐจ์ด๋กœ ์ธํ•ด Z fighting ๋ฐœ์ƒ.

      (figure 5-1. ๋ถˆ๋ณ€์„ฑ์„ ์ ์šฉํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ Z Fighting Artifacts)

      Untitled 29

  • ์œ„์น˜์— ๋ถˆ๋ณ€์„ฑ์„ ์ ์šฉํ•œ ๋™์ผํ•œ multipass shader

(figure 5-2. ๋ถˆ๋ณ€์„ฑ์„ ์ด์šฉํ•ด ํ”ผํ•œ Z Fighting )

Untitled 30

  • ๋ถˆ๋ณ€์„ฑ์˜ ๋„์ž…

    • ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ์‚ฌ์šฉํ•ด ์ถœ๋ ฅ์„ ๊ณ„์‚ฐํ•  ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์ด ๋™์ผํ•˜๋„๋ก ์ง€์ • ๊ฐ€๋Šฅ.
    • ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€๋ณ€(varying) ์„ ์–ธ / ์„ ์–ธ๋œ varying์— ์ด์šฉ ๊ฐ€๋Šฅ.
    invariant gl_Position;
    invariant texCoord;
  • ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๋ถˆ๋ณ€์„ฑ ์„ ์–ธ

    • ์ปดํŒŒ์ผ๋Ÿฌ : shader์— ๋™์ผํ•œ ๊ณ„์‚ฐ, ์ž…๋ ฅ์„ ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ ๋ณด์žฅ.

    (๋ทฐ ํˆฌ์˜ ํ–‰๋ ฌ์— ์ž…๋ ฅ ์œ„์น˜๋ฅผ ๊ณฑํ•˜์—ฌ ์ถœ๋ ฅ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” 2๊ฐœ์˜ vertex shader๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ, ํ•ด๋‹น ์œ„์น˜๊ฐ€ ๋ถˆ๋ณ€์ž„ ๋ณด์žฅ)

    #version 300 es
    uniform mat4 u_viewProjMatrix;
    layout(location = 0) in vec4 a_vertex;
    invariant gl_Position;
    
    void main()
    {
    //๋™์ผํ•œ viewProjcMatrix, vertex๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  shader์—์„œ ๋™์ผํ•œ ๊ฐ’.
    	gl_Position = u_viewProjMatrix * a_vertex;
    }
  • ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ์  ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” #pragma ์ง€์‹œ์–ด ์‚ฌ์šฉ.

#pragma STDGL invariant(all)
  • ์ฃผ์˜์ 
    • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ์„ ์œ„ํ•ด ์ตœ์ ํ™”๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Œ.
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ถˆ๋ณ€ ํ•œ์ •์ž ์‚ฌ์šฉํ•ด์•ผ ํ•จ. (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜ ์ดˆ๋ž˜)
    • #pragma : ๋ถˆ๋ณ€์„ฑ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ.
    • ๋ถˆ๋ณ€์„ฑ = ํŠน์ • GPU์—์„œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ๋™์ผ.
      • OpenGL ES์˜ ๋ชจ๋“  ๊ตฌํ˜„์—์„œ ๊ณ„์‚ฐ์ด ๋ถˆ๋ณ€์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹˜.