• webGL编程指南 第三章 旋转三角形RotatedTriangle.js


    我会持续更新关于wegl的编程指南中的代码。

    当前的代码不会使用书中的缩写,每一步都是会展开写。希望能给后来学习的一些帮助

    git代码地址

    接着  上一节 接着做平移的转化。本案例是三角形的旋转

    1. 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>Documenttitle>
    8. head>
    9. <body>
    10. <h3>可以按下按键ADSWh3>
    11. <p>旋转的角度:<span id="num">span>p>
    12. <canvas id='canvas'>canvas>
    13. <script>
    14. let canvas = document.getElementById('canvas');
    15. let gl = canvas.getContext('webgl');
    16. let vertexShaderSource = `
    17. attribute vec2 a_Position;
    18. uniform float u_CosB,u_SinB;
    19. void main(){
    20. gl_Position.x = a_Position.x * u_CosB - a_Position.y*u_SinB;
    21. gl_Position.y = a_Position.x * u_SinB + a_Position.y*u_CosB;
    22. gl_Position.z = 0.0;
    23. gl_Position.w = 1.0;
    24. }
    25. `
    26. let fragmentShaderSouce = `
    27. precision mediump float;
    28. void main(){
    29. gl_FragColor = vec4(1.0,0.0,0.0,1.0);
    30. }
    31. `
    32. // 创建顶点着色器
    33. let vertexShader = gl.createShader(gl.VERTEX_SHADER);
    34. // 设置着色器源代码
    35. gl.shaderSource(vertexShader, vertexShaderSource)
    36. // 编译着色器
    37. gl.compileShader(vertexShader)
    38. // 创建着片元色器
    39. let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    40. // 设置着色器源代码
    41. gl.shaderSource(fragmentShader, fragmentShaderSouce)
    42. // 编译着色器
    43. gl.compileShader(fragmentShader)
    44. //创建渲染程序
    45. let program = gl.createProgram();
    46. // 把顶点着色器添加到渲染程序
    47. gl.attachShader(program, vertexShader);
    48. gl.attachShader(program, fragmentShader);
    49. gl.linkProgram(program);
    50. //使用当前渲染程序
    51. gl.useProgram(program)
    52. //检测着色器链接是否正确
    53. if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
    54. throw gl.getProgramInfoLog(program);
    55. }
    56. //x抽的旋转角度
    57. let rotateX = 0.0;
    58. //y轴的旋转角度
    59. let rotateY = 0;
    60. //三角的三个顶点的坐标位置
    61. let positonArray = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5]);
    62. // 获取顶点着色器的变量
    63. let a_Position = gl.getAttribLocation(program, 'a_Position');
    64. // 获取旋转角度的变量
    65. let u_CosB = gl.getUniformLocation(program, 'u_CosB')
    66. let u_SinB = gl.getUniformLocation(program, 'u_SinB')
    67. // 创建缓冲区
    68. let buffer = gl.createBuffer();
    69. //将缓冲区对象绑定到目标
    70. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    71. //向缓冲区写入数据
    72. gl.bufferData(gl.ARRAY_BUFFER, positonArray, gl.STATIC_DRAW)
    73. //将缓冲区对象绑定到目标
    74. gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
    75. // 启用变量a_Position
    76. gl.enableVertexAttribArray(a_Position);
    77. //绘制
    78. gl.clearColor(0.0, 0.0, 0.0, 1.0);
    79. const render = function () {
    80. //赋值x角度
    81. gl.uniform1f(u_CosB, Math.cos(Math.PI*rotateX/180.0));
    82. //赋值y角度
    83. gl.uniform1f(u_SinB, Math.sin(Math.PI*rotateX/180.0));
    84. // 清空画布
    85. gl.clear(gl.COLOR_BUFFER_BIT);
    86. // 绘制三角形
    87. gl.drawArrays(gl.TRIANGLES, 0, 3)
    88. setNumer()
    89. }
    90. render()
    91. document.onkeydown = function (e) { //对整个页面监听
    92. var keyNum = window.event ? e.keyCode : e.which; //获取被按下的键值
    93. //判断如果用户按下了回车键(keycody=13)
    94. if (keyNum == 65) {
    95. console.log('A');
    96. rotateX -= 1;
    97. rotateY=0
    98. render()
    99. }
    100. //判断如果用户按下了空格键(keycode=32),
    101. if (keyNum == 68) {
    102. console.log('D');
    103. rotateX +=1;
    104. rotateY=0
    105. render()
    106. }
    107. //判断如果用户按下了空格键(keycode=32),
    108. if (keyNum == 83) {
    109. console.log('S');
    110. rotateY -= 1;
    111. rotateX=0
    112. render()
    113. }
    114. //判断如果用户按下了空格键(keycode=32),
    115. if (keyNum == 87) {
    116. console.log('W');
    117. rotateY += 1;
    118. rotateX=0
    119. render();
    120. }
    121. }
    122. function setNumer (){
    123. let text = document.getElementById('num');
    124. text.innerText = `rotateX:${ rotateX}`
    125. }
    126. script>
    127. body>
    128. html>

  • 相关阅读:
    数据中心不能“偏科”,AIGC时代算力、存力需协调发展
    【LeetCode】54. 螺旋矩阵
    C++ 对象和类
    [nlp] pointwise,pairwise,listwise
    pytest 结合logging输出日志保存至文件
    共话医疗数据安全,美创科技@2023南湖HIT论坛,11月11日见
    【MyBatis】代码生成
    【C++】—— 装饰器模式
    基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)
    华为设备ACL配置命令
  • 原文地址:https://blog.csdn.net/huhudeni/article/details/133915670