0


WebGL进阶(四)-视点和视线

理论基础:

顶点着色器 Vertex Shader

主要是负责处理顶点位置、顶点颜色、顶点向量等顶点的数据;处理一些顶点的变换:例如在进行视图变换和投影变换时MVP矩阵会改变顶点的位置信息。

输入:

顶点着色器输入部分主要是声明:

①储存着每个顶点属性的attribute变量;

②所有顶点都会实现的(例如MVP矩阵、透视变换矩阵等)全局的uniform变量;

③一些会传递给片元着色器的varying变量。

  1. // 变量
  2. attribute vwc3 aVertexPosition; // 顶点位置
  3. attribute vec3 aNormalPosition; // 法线
  4. attribute vec2 aTextureCoord; // uv坐标
  5. varying highp vec2 vTextureCoord; // 顶点着色器传递给片元着色器
  6. varying highp vec3 vFragPos;
  7. varying highp vec3 vNormal;
  8. // 矩阵
  9. uniform mat4 uModelViewMatrix; // 视图变换矩阵
  10. uniform mat4 uProjectionMatrix; // 透视变换矩阵
输出:

①顶点坐标gl_Position;

②给输入部分声明的varying变量赋值;

矩阵运算从右往左运算

  1. vFragPos = aVertexPosition;
  2. vNormal = aNormalPosition;
  3. // 计算点坐标
  4. gl_Position = uProjextionMatrix * uModelViewMatrix * vec4(aVertexPosition,1.0);
  5. vTextureCoord = aTextureCoord;
片元着色器 Fragment Shader

用于颜色、贴图、光照阴影等

  1. //除了上述出现的“着色器不支持高精度,限定浮点类型为中精度”
  2. precision mediump float;
  3. //还有表示支持高精度的:“着色器支持高精度,限定浮点类型为高精度”
  4. precision highp float;
  5. //以及仅支持低精度的:
  6. prcision lowp float;
输入:

uniform声明

  1. /声明一个纹理相关的变量,sampler2D 也是一种数据类型
  2. //它是一种取样器类型的变量,该变量对应传入的纹理2D图片的像素数据
  3. uniform sampler2D uSampler;
  4. //Blinn-Phong需要的漫反射项kd、高光项ks、光源位置、相机位置、光强
  5. uniform vec3 uKd;
  6. uniform vec3 uKs;
  7. uniform vec3 uLightPos;
  8. uniform vec3 uCameraPos;
  9. uniform float uLightIntensity;
  10. // 这个TextureSample参数作用应该是:
  11. // 以左上角为原点,通过UV截取图片,如果==1,则正常取值
  12. uniform int uTextureSample;

varing变量

  1. //继承varying参数
  2. varying highp vec2 vTextureCoord;
  3. varying highp vec3 vFragPos;
  4. varying highp vec3 vNormal;
输出:

一般设置为gl_FragColor

参考:GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili

gl.compileShader(shader), 传递需要编译的着色器,函数实现着色器编译。
gl.getShaderParameter(shader,COMPILE_STATUS),COMPILE_STATUS为:
  • gl.DELETE_STATUS:标示着色器是否被删除,删除(GL_TRUE)未删除(GL_FALSE).
  • gl.COMPILE_STATUS: 标示着色器是否编译成功,是(GL_TRUE)不是(GL_FALSE
  • gl.SHADER_TYPE: 标示着色器类型,是顶点着色器 (gl.VERTEX_SHADER) 还是片段着色器 (gl.FRAGMENT_SHADER)
WebGLRenderingContext.enableVertexAttribArray()

在 WebGL 中,作用于顶点的数据会先储存在attributes。这些数据仅对 JavaScript 代码和顶点着色器可用。属性由索引号引用到 GPU 维护的属性列表中。在不同的平台或 GPU 上,某些顶点属性索引可能具有预定义的值。创建属性时,WebGL 层会分配其他属性。

类型为GLuint 的索引,指向要激活的顶点属性。可以使用getAttribLocation方法来获取索引.

WebGLRenderingContext.vertexAttribPointer(index,size,type,normalized,stride,offset)

打开属性数组列表中指定索引处的通用顶点属性数组,

index:定要修改的顶点属性的索引。

size:指定每个顶点属性的组成数量,必须是 1,2,3 或 4。

type:

指定数组中每个元素的数据类型可能是:

  • gl.BYTE: signed 8-bit integer, with values in [-128, 127] 有符号的 8 位整数,范围 [-128, 127]
  • gl.SHORT: signed 16-bit integer, with values in [-32768, 32767] 有符号的 16 位整数,范围 [-32768, 32767]
  • gl.UNSIGNED_BYTE: unsigned 8-bit integer, with values in [0, 255] 无符号的 8 位整数,范围 [0, 255]
  • gl.UNSIGNED_SHORT: unsigned 16-bit integer, with values in [0, 65535] 无符号的 16 位整数,范围 [0, 65535]
  • gl.FLOAT: 32-bit IEEE floating point number 32 位 IEEE 标准的浮点数
  • When using a WebGL 2 context, the following values are available additionally: 使用 WebGL2 版本的还可以使用以下值:- gl.HALF_FLOAT: 16-bit IEEE floating point number 16 位 IEEE 标准的浮点数

normalize:

  1. 当转换为浮点数时是否应该将整数数值归一化到特定的范围。
  • or types gl.BYTE and gl.SHORT, normalizes the values to [-1, 1] if true. 对于类型gl.BYTEgl.SHORT,如果是 true 则将值归一化为 [-1, 1]
  • For types gl.UNSIGNED_BYTE and gl.UNSIGNED_SHORT, normalizes the values to [0, 1] if true. 对于类型gl.UNSIGNED_BYTEgl.UNSIGNED_SHORT,如果是 true 则将值归一化为 [0, 1]
  • For types gl.FLOAT and gl.HALF_FLOAT, this parameter has no effect. 对于类型gl.FLOATgl.HALF_FLOAT,此参数无效

stride:

一个 GLsizei,以字节为单位指定连续顶点属性开始之间的偏移量 (即数组中一行长度)。不能大于 255。如果 stride 为 0,则假定该属性是紧密打包的,即不交错属性,每个属性在一个单独的块中,下一个顶点的属性紧跟当前顶点之后。

offset:

指定顶点属性数组中第一部分的字节偏移量。必须是类型的字节长度的倍数。

WebGLRenderingContext.uniformMatrix[234]fv(location,transpose,value)

该方法的 3 个版本(

  1. uniformMatrix2fv()

  1. uniformMatrix3fv()

  1. unifomMatrix4fv()

),分别以二阶、三阶和四阶方阵作为输入值,它们应是分别具有 4、9、16 个浮点数的数组。

  1. WebGLRenderingContext.uniformMatrix2fv(location, transpose, value);
  2. WebGLRenderingContext.uniformMatrix3fv(location, transpose, value);
  3. WebGLRenderingContext.uniformMatrix4fv(location, transpose, value);

location

WebGLUniformLocation 对象包含了要修改的 uniform attribute 位置。位置使用 getUniformLocation()获得。

transpose

GLboolean 指定是否转置矩阵。必须为

  1. false

value

Float32Array 型或者是

  1. GLfloat

序列值。这些值被假定按列主序(column major order)的方式提供。

源码:

键盘动态改变视点

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="glMatrix-0.9.6.min.js"></script>
  9. <script>
  10. let vertexstring = `
  11. attribute vec4 a_position;
  12. uniform mat4 u_formMatrix;
  13. attribute vec4 a_color;
  14. varying vec4 color;
  15. void main(void){
  16. gl_Position = u_formMatrix * a_position;
  17. color = a_color;
  18. }
  19. `;
  20. let fragmentstring = `
  21. precision mediump float;
  22. varying vec4 color;
  23. void main(void){
  24. gl_FragColor =color;
  25. }
  26. `;
  27. var webgl;
  28. var uniformTexture = 0;
  29. var uniformTexture1 = 0;
  30. var uniformAnim = 0;
  31. var count = 0;
  32. var texture0;
  33. var texture1;
  34. var angley=0;
  35. var anglex= 0;
  36. function webglStart() {
  37. init();
  38. tick()
  39. }
  40. function tick() {
  41. requestAnimFrame(tick);
  42. initBuffer();
  43. draw();
  44. }
  45. function init() {
  46. initWebgl();
  47. initShader();
  48. initEvent();
  49. }
  50. function handleKeyDown(event) {
  51. if (String.fromCharCode(event.keyCode) == 'W') {
  52. angley += 0.01;
  53. }
  54. else if (String.fromCharCode(event.keyCode) == 'S') {
  55. angley -= 0.01;
  56. }
  57. else if (String.fromCharCode(event.keyCode) == 'A') {
  58. anglex -= 0.01;
  59. }
  60. else if (String.fromCharCode(event.keyCode) == 'D') {
  61. anglex += 0.01;
  62. }
  63. }
  64. function initEvent() {
  65. document.onkeydown = handleKeyDown;
  66. }
  67. function initWebgl() {
  68. let webglDiv = document.getElementById('myCanvas');
  69. webgl = webglDiv.getContext("webgl");
  70. webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.clientHeight);
  71. }
  72. function initShader() {
  73. let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
  74. let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);
  75. webgl.shaderSource(vsshader, vertexstring);
  76. webgl.shaderSource(fsshader, fragmentstring);
  77. webgl.compileShader(vsshader);
  78. webgl.compileShader(fsshader);
  79. if (!webgl.getShaderParameter(vsshader, webgl.COMPILE_STATUS)) {
  80. var err = webgl.getShaderInfoLog(vsshader);
  81. alert(err);
  82. return;
  83. }
  84. if (!webgl.getShaderParameter(fsshader, webgl.COMPILE_STATUS)) {
  85. var err = webgl.getShaderInfoLog(fsshader);
  86. alert(err);
  87. return;
  88. }
  89. let program = webgl.createProgram();
  90. webgl.attachShader(program, vsshader);
  91. webgl.attachShader(program, fsshader)
  92. webgl.linkProgram(program);
  93. webgl.useProgram(program);
  94. webgl.program = program
  95. }
  96. function initBuffer() {
  97. let ModelMatrix = mat4.create();
  98. mat4.identity(ModelMatrix);
  99. let angle = Math.PI / 180 * count;
  100. console.log(angle);
  101. mat4.rotate(ModelMatrix, angle, [0, 0, 1])
  102. let ViewMatrix = mat4.create();
  103. mat4.identity(ViewMatrix);
  104. debugger
  105. ViewMatrix = mat4.lookAt([anglex, angley, 0.2], [0, 0, 0], [0, 1, 0], ViewMatrix);
  106. console.log(ViewMatrix);
  107. let mvMatrix = mat4.multiply(ViewMatrix, ModelMatrix)
  108. let arr = [
  109. 0.0, 0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  110. -0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  111. 0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  112. 0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  113. -0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  114. 0.0, -0.6, -0.2, 1, 1.0, 1.0, 0.4, 1,
  115. 0.0, 0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  116. -0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  117. 0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  118. ]
  119. let pointPosition = new Float32Array(arr);
  120. let aPsotion = webgl.getAttribLocation(webgl.program, "a_position");
  121. let triangleBuffer = webgl.createBuffer();
  122. webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
  123. webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW);
  124. webgl.enableVertexAttribArray(aPsotion);
  125. webgl.vertexAttribPointer(aPsotion, 4, webgl.FLOAT, false, 8 * 4, 0);
  126. let aColor = webgl.getAttribLocation(webgl.program, "a_color");
  127. webgl.enableVertexAttribArray(aColor);
  128. webgl.vertexAttribPointer(aColor, 4, webgl.FLOAT, false, 8 * 4, 4 * 4);
  129. let uniformMatrix1 = webgl.getUniformLocation(webgl.program, "u_formMatrix");
  130. webgl.uniformMatrix4fv(uniformMatrix1, false, mvMatrix)
  131. }
  132. function draw() {
  133. webgl.clearColor(0.0, 1.0, 0.0, 1.0);
  134. webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);
  135. webgl.enable(webgl.DEPTH_TEST);
  136. //纹理变动
  137. uniformAnim = webgl.getUniformLocation(webgl.program, "anim");
  138. count = count + 1;
  139. webgl.uniform1f(uniformAnim, count);
  140. webgl.drawArrays(webgl.TRIANGLES, 0, 9);
  141. }
  142. window.requestAnimFrame = (function () {
  143. return window.requestAnimationFrame ||
  144. window.webkitRequestAnimationFrame ||
  145. window.mozRequestAnimationFrame ||
  146. window.oRequestAnimationFrame ||
  147. window.msRequestAnimationFrame ||
  148. function (callback, element) {
  149. window.setTimeout(callback, 1000 / 60);
  150. };
  151. })();
  152. </script>
  153. </head>
  154. <body onload="webglStart()">
  155. <canvas id='myCanvas' width="1024" height='768'></canvas>
  156. </body>
  157. </html>

模型矩阵与视图矩阵共同作用 :

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./gl-matrix.js"></script>
  9. <script>
  10. let vertexstring = `
  11. attribute vec4 a_position;
  12. uniform mat4 u_formMatrix;
  13. uniform mat4 proj;
  14. attribute vec4 a_color;
  15. varying vec4 color;
  16. void main(void){
  17. gl_Position = u_formMatrix * a_position;
  18. color = a_color;
  19. }
  20. `;
  21. let fragmentstring = `
  22. precision mediump float;
  23. varying vec4 color;
  24. void main(void){
  25. gl_FragColor =color;
  26. }
  27. `;
  28. var webgl;
  29. var uniformTexture = 0;
  30. var uniformTexture1 = 0;
  31. var uniformAnim = 0;
  32. var count = 0;
  33. var texture0;
  34. var texture1;
  35. function webglStart() {
  36. init();
  37. }
  38. function init() {
  39. initWebgl();
  40. initShader();
  41. initBuffer();
  42. draw();
  43. initEvent()
  44. }
  45. function initWebgl() {
  46. let webglDiv = document.getElementById('myCanvas');
  47. webgl = webglDiv.getContext("webgl");
  48. webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.clientHeight);
  49. }
  50. function initShader() {
  51. let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
  52. let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);
  53. webgl.shaderSource(vsshader, vertexstring);
  54. webgl.shaderSource(fsshader, fragmentstring);
  55. webgl.compileShader(vsshader);
  56. webgl.compileShader(fsshader);
  57. if (!webgl.getShaderParameter(vsshader, webgl.COMPILE_STATUS)) {
  58. var err = webgl.getShaderInfoLog(vsshader);
  59. alert(err);
  60. return;
  61. }
  62. if (!webgl.getShaderParameter(fsshader, webgl.COMPILE_STATUS)) {
  63. var err = webgl.getShaderInfoLog(fsshader);
  64. alert(err);
  65. return;
  66. }
  67. let program = webgl.createProgram();
  68. webgl.attachShader(program, vsshader);
  69. webgl.attachShader(program, fsshader)
  70. webgl.linkProgram(program);
  71. webgl.useProgram(program);
  72. webgl.program = program
  73. }
  74. function initBuffer() {
  75. let ModelMatrix = glMatrix.mat4.create();
  76. glMatrix.mat4.identity(ModelMatrix);
  77. let angle = Math.PI / 180 * 30;
  78. console.log(angle);
  79. glMatrix.mat4.rotate(ModelMatrix, ModelMatrix,angle, [0, 0, 1])
  80. let ViewMatrix = glMatrix.mat4.create();
  81. glMatrix.mat4.identity(ViewMatrix);
  82. debugger
  83. ViewMatrix =glMatrix.mat4.lookAt(ViewMatrix,[0, 0, 0.3], [0, 0, 0], [0, 1, 0]);
  84. console.log(ViewMatrix);
  85. let mvMatrix = glMatrix.mat4.create();
  86. glMatrix.mat4.multiply(mvMatrix,ViewMatrix, ModelMatrix)
  87. let arr = [
  88. 0.0, 0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  89. -0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  90. 0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  91. 0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  92. -0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  93. 0.0, -0.6, -0.2, 1, 1.0, 1.0, 0.4, 1,
  94. 0.0, 0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  95. -0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  96. 0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  97. ]
  98. let pointPosition = new Float32Array(arr);
  99. let aPsotion = webgl.getAttribLocation(webgl.program, "a_position");
  100. let triangleBuffer = webgl.createBuffer();
  101. webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
  102. webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW);
  103. webgl.enableVertexAttribArray(aPsotion);
  104. webgl.vertexAttribPointer(aPsotion, 4, webgl.FLOAT, false, 8 * 4, 0);
  105. let aColor = webgl.getAttribLocation(webgl.program, "a_color");
  106. webgl.enableVertexAttribArray(aColor);
  107. webgl.vertexAttribPointer(aColor, 4, webgl.FLOAT, false, 8 * 4, 4 * 4);
  108. let uniformMatrix1 = webgl.getUniformLocation(webgl.program, "u_formMatrix");
  109. webgl.uniformMatrix4fv(uniformMatrix1, false, mvMatrix)
  110. }
  111. function draw() {
  112. webgl.clearColor(0.0, 1.0, 0.0, 1.0);
  113. webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);
  114. // webgl.enable(webgl.DEPTH_TEST);
  115. //纹理变动
  116. uniformAnim = webgl.getUniformLocation(webgl.program, "anim");
  117. count = count + 0.01;
  118. webgl.uniform1f(uniformAnim, count);
  119. webgl.drawArrays(webgl.TRIANGLES, 0, 9);
  120. }
  121. </script>
  122. </head>
  123. <body onload="webglStart()">
  124. <canvas id='myCanvas' width="1024" height='768'></canvas>
  125. </body>
  126. </html>

视点改变影响三维展示效果:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./gl-matrix.js"></script>
  9. <script>
  10. let vertexstring = `
  11. attribute vec4 a_position;
  12. uniform mat4 u_formMatrix;
  13. attribute vec4 a_color;
  14. varying vec4 color;
  15. void main(void){
  16. gl_Position = u_formMatrix * a_position;
  17. color = a_color;
  18. }
  19. `;
  20. let fragmentstring = `
  21. precision mediump float;
  22. varying vec4 color;
  23. void main(void){
  24. gl_FragColor =color;
  25. }
  26. `;
  27. var webgl;
  28. var uniformTexture = 0;
  29. var uniformTexture1 = 0;
  30. var uniformAnim = 0;
  31. var count = 0;
  32. var texture0;
  33. var texture1;
  34. var projMatrix = glMatrix.mat4.create()
  35. function init() {
  36. initWebgl();
  37. initShader();
  38. initBuffer();
  39. draw();
  40. }
  41. function initWebgl() {
  42. let webglDiv = document.getElementById('myCanvas');
  43. webgl = webglDiv.getContext("webgl");
  44. }
  45. function initShader() {
  46. let vsshader = webgl.createShader(webgl.VERTEX_SHADER);
  47. let fsshader = webgl.createShader(webgl.FRAGMENT_SHADER);
  48. webgl.shaderSource(vsshader, vertexstring);
  49. webgl.shaderSource(fsshader, fragmentstring);
  50. webgl.compileShader(vsshader);
  51. webgl.compileShader(fsshader);
  52. if (!webgl.getShaderParameter(vsshader, webgl.COMPILE_STATUS)) {
  53. var err = webgl.getShaderInfoLog(vsshader);
  54. alert(err);
  55. return;
  56. }
  57. if (!webgl.getShaderParameter(fsshader, webgl.COMPILE_STATUS)) {
  58. var err = webgl.getShaderInfoLog(fsshader);
  59. alert(err);
  60. return;
  61. }
  62. let program = webgl.createProgram();
  63. webgl.attachShader(program, vsshader);
  64. webgl.attachShader(program, fsshader)
  65. webgl.linkProgram(program);
  66. webgl.useProgram(program);
  67. webgl.program = program
  68. }
  69. function initBuffer() {
  70. let arr = [
  71. 0.0, 0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  72. -0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  73. 0.5, -0.5, -0.4, 1, 0.4, 1.0, 0.4, 1,
  74. 0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  75. -0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4, 1,
  76. 0.0, -0.6, -0.2, 1, 1.0, 1.0, 0.4, 1,
  77. 0.0, 0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  78. -0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  79. 0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0, 1,
  80. // 0.0, 0.6, -0.4, 1, 0.4, 1.0, 1,1, // The back green one
  81. // -0.5, -0.4, -0.4, 1, 0.4, 1.0, 1,1,
  82. // 0.5, -0.4, -0.4, 1, 0.4, 1.0,1,1,
  83. // 0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4,1, // The middle yellow one
  84. // -0.5, 0.4, -0.2, 1, 1.0, 1.0, 0.4,1,
  85. // 0.0, -0.6, -0.2,1, 1.0, 1.0, 0.4,1,
  86. // 0.0, 0.5, 0.0, 1, 0.4, 0.4, 1.0,1, // The front blue one
  87. // -0.5, -0.5, 0.0,1, 0.4, 0.4, 1.0,1,
  88. // 0.5, -0.5, 0.0, 1, 0.4, 0.4, 1.0,1,
  89. ]
  90. let pointPosition = new Float32Array(arr);
  91. let aPsotion = webgl.getAttribLocation(webgl.program, "a_position");
  92. let triangleBuffer = webgl.createBuffer();
  93. webgl.bindBuffer(webgl.ARRAY_BUFFER, triangleBuffer);
  94. webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW);
  95. webgl.enableVertexAttribArray(aPsotion);
  96. webgl.vertexAttribPointer(aPsotion, 4, webgl.FLOAT, false, 8 * 4, 0);
  97. let aColor = webgl.getAttribLocation(webgl.program, "a_color");
  98. webgl.enableVertexAttribArray(aColor);
  99. webgl.vertexAttribPointer(aColor, 4, webgl.FLOAT, false, 8 * 4, 4 * 4);
  100. let modelView = glMatrix.mat4.create();
  101. glMatrix.mat4.identity(modelView);
  102. debugger
  103. modelView = glMatrix.mat4.lookAt(modelView, [0, 0, 0.2], [0, 0, 0], [0, 1, 0]);
  104. console.log(modelView);
  105. let uniformMatrix1 = webgl.getUniformLocation(webgl.program, "u_formMatrix");
  106. webgl.uniformMatrix4fv(uniformMatrix1, false, modelView);
  107. }
  108. function draw() {
  109. webgl.clearColor(0.0, 1.0, 0.0, 1.0);
  110. webgl.clear(webgl.COLOR_BUFFER_BIT | webgl.DEPTH_BUFFER_BIT);
  111. webgl.drawArrays(webgl.TRIANGLES, 0, 9);
  112. }
  113. </script>
  114. </head>
  115. <body onload="init()">
  116. <canvas id='myCanvas' width="1024" height='768'></canvas>
  117. </body>
  118. </html>

效果:

复盘:


本文转载自: https://blog.csdn.net/Ian1025/article/details/143300285
版权归原作者 Ian1025 所有, 如有侵权,请联系我们删除。

“WebGL进阶(四)-视点和视线”的评论:

还没有评论