• webGL编程指南 第五章 MultiTexture.html


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

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

    git代码地址 :空

    上一章节中我们学习texParameteri的使用,这一章节中我们两个图片进行混合

    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">
    7. <title>Documenttitle>
    8. <style>
    9. #canvas {
    10. width: 100vw;
    11. height: 100vw;
    12. border: 1px solid greenyellow;
    13. }
    14. style>
    15. head>
    16. <body>
    17. !!!!!需要指出的是要选择当前文件夹下的sky.jpg!!!!!!
    18. <input type="file" onchange="loadFile(event)">
    19. <canvas id="canvas">canvas>
    20. <script>
    21. let imgSrc = 'https://p2.music.126.net/UrFqYFILx5wBDx-dsIz15A==/109951163025047288.jpg?param=256y256';
    22. let jpgImgSrc = 'https://p1.music.126.net/LOTxqRjFm03VJEOHJbUqMw==/109951165944804127.jpg?param=256y256';
    23. // let jpgImgSrc = 'https://img-blog.csdnimg.cn/361654c6611d49bebab085509bd6a244.jpeg';
    24. // let gifImagSrc = 'https://img-blog.csdnimg.cn/04f072cdb3934051a505a54a4d6f46ed.gif';
    25. let vexterSource = `
    26. precision mediump float;
    27. attribute vec4 a_Position;
    28. attribute vec2 a_TexCoord;
    29. varying vec2 v_TexCoord;
    30. void main(){
    31. gl_Position = a_Position;//顶点坐标
    32. v_TexCoord = a_TexCoord;//纹理坐标系下的坐标
    33. }
    34. `
    35. let fragmentSource = `
    36. precision mediump float;
    37. uniform sampler2D u_Sampler0;//纹理
    38. uniform sampler2D u_Sampler1;//纹理
    39. varying vec2 v_TexCoord;//纹理坐标系下的坐标
    40. void main(){
    41. vec4 color0 = texture2D(u_Sampler0,v_TexCoord);
    42. vec4 color1 = texture2D(u_Sampler1,v_TexCoord);
    43. gl_FragColor = color0 * color1;
    44. }
    45. `
    46. let canvas = document.getElementById('canvas');
    47. let gl = canvas.getContext('webgl');
    48. //创建顶点着色器
    49. let vertextShader = gl.createShader(gl.VERTEX_SHADER);
    50. //给顶点着色器赋值
    51. gl.shaderSource(vertextShader, vexterSource);
    52. //编译顶点着色器
    53. gl.compileShader(vertextShader);
    54. //创建片元着色器
    55. let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    56. //给片元着色器赋值
    57. gl.shaderSource(fragmentShader, fragmentSource)
    58. //编译片元着色器
    59. gl.compileShader(fragmentShader)
    60. //检测着色器创建是否正确
    61. if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
    62. alert(gl.getShaderInfoLog(fragmentShader));
    63. }
    64. //创建程序
    65. let program = gl.createProgram();
    66. //给程序赋值
    67. gl.attachShader(program, vertextShader);
    68. gl.attachShader(program, fragmentShader);
    69. //连接程序
    70. gl.linkProgram(program);
    71. //使用此着色器
    72. gl.useProgram(program);
    73. //变量的处理
    74. //获取顶点着色器中的变量a_Position
    75. let a_Position = gl.getAttribLocation(program, 'a_Position');
    76. //获取顶点着色器中的变量a_TexCoord
    77. let a_TexCoord = gl.getAttribLocation(program, 'a_TexCoord');
    78. //获取片元着色器中的变量u_Sampler
    79. let u_Sampler0 = gl.getUniformLocation(program, 'u_Sampler0');
    80. //获取片元着色器中的变量u_Sampler
    81. let u_Sampler1 = gl.getUniformLocation(program, 'u_Sampler1');
    82. //顶点坐标与纹理坐标
    83. let vertexTexCoords = new Float32Array([
    84. -0.5, 0.5, 0.0, 1.0,
    85. -0.5, -0.5, 0.0, 0.0,
    86. 0.5, 0.5, 1.0, 1.0,
    87. 0.5, -0.5, 1.0, 0.0,
    88. ])
    89. let f32Seize = vertexTexCoords.BYTES_PER_ELEMENT;
    90. //给定点设置坐标 几何图形与纹理的坐标
    91. let vertexBuffer = gl.createBuffer();
    92. //绑定buffer
    93. gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    94. //绑定数据
    95. gl.bufferData(gl.ARRAY_BUFFER, vertexTexCoords, gl.STATIC_DRAW);
    96. //给a_Position赋值
    97. gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, f32Seize * 4, 0);
    98. //使用此变量
    99. gl.enableVertexAttribArray(a_Position);
    100. //纹理坐标
    101. let texCoordBuffer = gl.createBuffer();
    102. //绑定buffer
    103. gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
    104. //绑定数据
    105. gl.bufferData(gl.ARRAY_BUFFER, vertexTexCoords, gl.STATIC_DRAW);
    106. //给a_TexCoord赋值
    107. gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, f32Seize * 4, f32Seize * 2);
    108. //使用此变量
    109. gl.enableVertexAttribArray(a_TexCoord);
    110. gl.clearColor(0, 0, 0, 1.0);
    111. //获取图片的素材
    112. getImage(imgSrc, u_Sampler1, gl.TEXTURE0, 0);
    113. getImage(jpgImgSrc, u_Sampler1, gl.TEXTURE1, 1);
    114. function getImage(imgYrl, u_Sampler, TEXTURE, num) {
    115. // 文件里的文本会在这里被打印出来
    116. let img = new Image();
    117. img.src = imgYrl;
    118. img.crossOrigin = ""
    119. img.onload = () => {
    120. let texture = gl.createTexture();
    121. showImage(texture, img, u_Sampler, TEXTURE, num)
    122. document.body.appendChild(img)
    123. }
    124. }
    125. function showImage(texture, img, u_Sampler, TEXTURE, texUnit) {
    126. console.log(texture, img, u_Sampler, TEXTURE, texUnit)
    127. document.body.appendChild(img)
    128. gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
    129. //开始0号纹理通道
    130. gl.activeTexture(TEXTURE);
    131. //想目标绑定纹理对象
    132. gl.bindTexture(gl.TEXTURE_2D, texture);
    133. //配置纹理的参数
    134. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    135. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    136. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);
    137. //设置着色器参数
    138. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, img);
    139. //设置纹理数据
    140. gl.uniform1i(u_Sampler, texUnit)
    141. gl.clear(gl.COLOR_BUFFER_BIT);
    142. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
    143. }
    144. script>
    145. body>
    146. html>

  • 相关阅读:
    正则表达式相关知识点
    图解 Google V8 # 17:消息队列:V8是怎么实现回调函数的?
    基于Springboot+Mybatis+mysql+vue宠物领养网站1.0
    流水线作业模拟程序
    Java核心技术卷Ⅰ-第一章Java程序设计概述
    HTML5生日快乐在线网页祝福 (一场浪漫的烟花秀) HTML+CSS+JavaScript
    自学unity,该不该阻止?
    JavaScript云LIS系统概述 前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用
    项目管理:项目经理如何进行管理?
    学习vue一些小记
  • 原文地址:https://blog.csdn.net/huhudeni/article/details/134315763