# GLSL 筆記 --- * [rendering pipeline](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview) * [GLSL rendering pipeline](https://www.lighthouse3d.com/tutorials/glsl-tutorial/pipeline33/) * [OpenGL 2.0 pipeline](https://en.wikibooks.org/wiki/GLSL_Programming/OpenGL_ES_2.0_Pipeline) OpenGL 3.2 以後的 pipeline  --- | OpenGL | GLSL | info | | --- | --- | -- | | 2.0 | 1.10 | 110 | | 2.1 | 1.20 | 120 | | 3.0 | 1.30 | 130 | | 3.1 | 1.40 | 140 | | 3.2 | 1.50 | 150 | | 3.3 | 3.30 | 330 | | 4.0 之後以此類推 | 4.00 | 400 | | | | | OpenGL ES | GLSL ES | WebGL | info | | -- | -- | -- | -- | | 2.0 | 1.00 (GLSL 1.20) | 1.0 | 100 | | 3.0 | 3.00 (GLSL 3.30) | 2.0 | 300 es | ```c= //use openGL 3.0 #version 130 ``` ```c= //use openGL ES 3.0 #version 300 es ``` :::warning * [WebGl "ERROR: unsupported shader version"](https://stackoverflow.com/a/59777271) * [檢查瀏覽器的WebGL支援狀況](https://webglreport.com/?v=2) ::: --- [GLSLangSpec](https://www.khronos.org/registry/OpenGL/index_gl.php) | keyword | | | -- | -- | | GL_ES | openGL ES | | [uniform](https://www.khronos.org/opengl/wiki/Uniform_(GLSL)) | | | [gl_position](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_Position.xhtml) | | | gl_FragColor | ES 3.0 已移除 | | [conditional compilation](https://www.cs.auckland.ac.nz/references/unix/digital/AQTLTBTE/DOCU_078.HTM) | | | -- | -- | | **#ifdef** KEYWORD<br>**#endif** | is defined | | **#ifndef** KEYWORD<br>**#endif** | not defined | | [precision](https://stackoverflow.com/a/4430934) | | range | performance | quality | | -- | -- | -- | -- | -- | | highp | high precision | 16-bit<br>floating point range: -2^62 to 2^62<br>integer range: -2^16 to 2^16 | low | high | | mediump | medium precision | 10 bit<br>floating point range: -2^14 to 2^14<br>integer range: -2^10 to 2^10 | medium | medium | | lowp | low precision | 8 bit<br>floating point range: -2 to 2<br>integer range: -2^8 to 2^8 | high | low | :::success 使用中等精度的浮點數 ```c #ifdef GL_ES precision mediump float #endif ``` ::: | [qualifier](https://www.shaderific.com/glsl-qualifiers) | | | -- | -- | | in | function arg read-only | | out | function arg write-only | | inout | function arg read/write | uniform 變數由外部指定, 內部 read-only --- [glsl canvas](https://github.com/actarian/glsl-canvas) 簡易測試 :::warning uniform 需要對應 glslcanvas.js 定義的名稱 ::: ```htmlembedded= <script type="text/javascript" src="https://unpkg.com/glsl-canvas-js/dist/umd/glsl-canvas.min.js"></script> <canvas class="glsl-canvas" data-fragment-url="target.frag" width="500" height="500"></canvas> ``` ```htmlembedded= <canvas class="glsl-canvas" data-fragment-url="target.frag" data-textures="file.png" width="200" height="200"></canvas> ``` --- native function * [step()](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/step.xhtml) ```c //edge > x return 0.0 //edge <= x return 1.0 float result = step(edge, x); ``` * [fract()](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/fract.xhtml) ```c //return x - math.floor(x) float result = fract(x); ``` * [atan()](https://community.khronos.org/t/hlsl-to-glsl-atan2-function/53881) GLSL 沒有 atan2() --- [varying variable](https://www.lighthouse3d.com/tutorials/glsl-12-tutorial/varying-variables/) :::warning A varying variable must be written on a vertex shader ::: :::warning In the fragment shader the variable, whose value results from an interpolation of the vertex values computed previously, can only be read. ::: | shader | access | | -- | -- | | vertex | write/read | | fragment | read-only | --- ES 2.0 to 3.0 :::info ES 2.0 ```glsl //vertex shader attribute vec2 texcoord; varying vec2 texUV; ``` ```glsl //fragment shader varying vec2 texUV; uniform sampler2D tex; void main(){ gl_FragColor = texture2D(tex, texUV); } ``` ES 3.0 以後 ```glsl //vertex shader in vec2 texcoord; out vec2 texUV; ``` ```glsl //fragment shader in vec2 texUV; uniform sampler2D tex; out vec4 fragColor; void main(){ fragColor = texture(tex, texUV); } ``` ::: --- 輔助工具 * [GraphToy](http://www.iquilezles.org/apps/graphtoy/) * [Shadershop](http://tobyschachman.com/Shadershop/) --- ###### tags: `GLSL`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up