uniform-types.html 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <!DOCTYPE html><html lang="zh"><head>
  2. <meta charset="utf-8">
  3. <title>Uniform 类型</title>
  4. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  5. <meta name="twitter:card" content="summary_large_image">
  6. <meta name="twitter:site" content="@threejs">
  7. <meta name="twitter:title" content="Three.js – Uniform 类型">
  8. <meta property="og:image" content="https://threejs.org/files/share.png">
  9. <link rel="shortcut icon" href="../../files/favicon_white.ico" media="(prefers-color-scheme: dark)">
  10. <link rel="shortcut icon" href="../../files/favicon.ico" media="(prefers-color-scheme: light)">
  11. <link rel="stylesheet" href="../resources/lesson.css">
  12. <link rel="stylesheet" href="../resources/lang.css">
  13. <script type="importmap">
  14. {
  15. "imports": {
  16. "three": "../../build/three.module.js"
  17. }
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <div class="container">
  23. <div class="lesson-title">
  24. <h1>Uniform 类型</h1>
  25. </div>
  26. <div class="lesson">
  27. <div class="lesson-main">
  28. <p>
  29. 每个 uniform 都必须有一个 `value` 属性。其值的类型必须与 GLSL 代码中 uniform 变量的类型相对应,具体的 GLSL 基本类型对应关系见下表。Uniform 结构体和数组同样受支持。基本类型的 GLSL 数组必须指定为对应 THREE 对象的数组,或者包含所有对象数据的扁平数组。换言之,GLSL 基本类型本身不应再嵌套一层数组。此规则不具有传递性。例如,一个由 `vec2` 数组组成的数组,每个子数组包含五个向量,则必须是一个数组的数组,其中每个元素可以是五个 `Vector2` 对象或十个 `number`。
  30. </p>
  31. <table>
  32. <thead>
  33. <tr>
  34. <th>GLSL 类型</th>
  35. <th>JavaScript 类型</th>
  36. </tr>
  37. </thead>
  38. <tbody>
  39. <tr>
  40. <td>int</td>
  41. <td>Number</td>
  42. </tr>
  43. <tr>
  44. <td>uint</td>
  45. <td>Number</td>
  46. </tr>
  47. <tr>
  48. <td>float</td>
  49. <td>Number</td>
  50. </tr>
  51. <tr>
  52. <td>bool</td>
  53. <td>Boolean</td>
  54. </tr>
  55. <tr>
  56. <td>bool</td>
  57. <td>Number</td>
  58. </tr>
  59. <tr>
  60. <td>vec2</td>
  61. <td>Vector2</td>
  62. </tr>
  63. <tr>
  64. <td>vec2</td>
  65. <td>Float32Array (*)</td>
  66. </tr>
  67. <tr>
  68. <td>vec2</td>
  69. <td>Array (*)</td>
  70. </tr>
  71. <tr>
  72. <td>vec3</td>
  73. <td>Vector3</td>
  74. </tr>
  75. <tr>
  76. <td>vec3</td>
  77. <td>Color</td>
  78. </tr>
  79. <tr>
  80. <td>vec3</td>
  81. <td>Float32Array (*)</td>
  82. </tr>
  83. <tr>
  84. <td>vec3</td>
  85. <td>Array (*)</td>
  86. </tr>
  87. <tr>
  88. <td>vec4</td>
  89. <td>Vector4</td>
  90. </tr>
  91. <tr>
  92. <td>vec4</td>
  93. <td>Quaternion</td>
  94. </tr>
  95. <tr>
  96. <td>vec4</td>
  97. <td>Float32Array (*)</td>
  98. </tr>
  99. <tr>
  100. <td>vec4</td>
  101. <td>Array (*)</td>
  102. </tr>
  103. <tr>
  104. <td>mat2</td>
  105. <td>Float32Array (*)</td>
  106. </tr>
  107. <tr>
  108. <td>mat2</td>
  109. <td>Array (*)</td>
  110. </tr>
  111. <tr>
  112. <td>mat3</td>
  113. <td>Matrix3</td>
  114. </tr>
  115. <tr>
  116. <td>mat3</td>
  117. <td>Float32Array (*)</td>
  118. </tr>
  119. <tr>
  120. <td>mat3</td>
  121. <td>Array (*)</td>
  122. </tr>
  123. <tr>
  124. <td>mat4</td>
  125. <td>Matrix4</td>
  126. </tr>
  127. <tr>
  128. <td>mat4</td>
  129. <td>Float32Array (*)</td>
  130. </tr>
  131. <tr>
  132. <td>mat4</td>
  133. <td>Array (*)</td>
  134. </tr>
  135. <tr>
  136. <td>ivec2, bvec2</td>
  137. <td>Float32Array (*)</td>
  138. </tr>
  139. <tr>
  140. <td>ivec2, bvec2</td>
  141. <td>Array (*)</td>
  142. </tr>
  143. <tr>
  144. <td>ivec3, bvec3</td>
  145. <td>Int32Array (*)</td>
  146. </tr>
  147. <tr>
  148. <td>ivec3, bvec3</td>
  149. <td>Array (*)</td>
  150. </tr>
  151. <tr>
  152. <td>ivec4, bvec4</td>
  153. <td>Int32Array (*)</td>
  154. </tr>
  155. <tr>
  156. <td>ivec4, bvec4</td>
  157. <td>Array (*)</td>
  158. </tr>
  159. <tr>
  160. <td>sampler2D</td>
  161. <td>Texture</td>
  162. </tr>
  163. <tr>
  164. <td>samplerCube</td>
  165. <td>CubeTexture</td>
  166. </tr>
  167. </tbody>
  168. </table>
  169. <p>
  170. (*) 对于相同 GLSL 类型的(最内层)数组(维度)同样适用,其中包含数组中所有向量或矩阵的分量。
  171. </p>
  172. <h2>结构化 Uniform</h2>
  173. <p>
  174. 有时你可能希望在着色器代码中将 uniform 组织为 `struct`(结构体)。必须使用以下方式,`three.js` 才能正确处理结构化的 uniform 数据。
  175. </p>
  176. <pre class="prettyprint notranslate lang-js" translate="no">
  177. uniforms = {
  178. data: {
  179. value: {
  180. position: new Vector3(),
  181. direction: new Vector3( 0, 0, 1 )
  182. }
  183. }
  184. };
  185. </pre>
  186. 此定义可以映射到以下 GLSL 代码:
  187. <pre class="prettyprint notranslate lang-js" translate="no">
  188. struct Data {
  189. vec3 position;
  190. vec3 direction;
  191. };
  192. uniform Data data;
  193. </pre>
  194. <h2>带数组的结构化 Uniform</h2>
  195. <p>
  196. 也可以在数组中管理 `structs`。此用法的语法如下:
  197. </p>
  198. <pre class="prettyprint notranslate lang-js" translate="no">
  199. const entry1 = {
  200. position: new Vector3(),
  201. direction: new Vector3( 0, 0, 1 )
  202. };
  203. const entry2 = {
  204. position: new Vector3( 1, 1, 1 ),
  205. direction: new Vector3( 0, 1, 0 )
  206. };
  207. uniforms = {
  208. data: {
  209. value: [ entry1, entry2 ]
  210. }
  211. };
  212. </pre>
  213. 此定义可以映射到以下 GLSL 代码:
  214. <pre class="prettyprint notranslate lang-js" translate="no">
  215. struct Data {
  216. vec3 position;
  217. vec3 direction;
  218. };
  219. uniform Data data[ 2 ];
  220. </pre>
  221. </div>
  222. </div>
  223. </div>
  224. <script src="../resources/prettify.js"></script>
  225. <script src="../resources/lesson.js"></script>
  226. </body></html>
粤ICP备19079148号