学习WebGl基础知识(二)

news2024/11/15 23:19:09

学习目标:

  • 掌握WebGl基础知识

学习内容:

创建一个Webgl程序

  1. 创建三维上下文对象
  2. 创建顶点着色器和片元着色器
  3. 创建和编译顶点着色器和片元着色器
  4. 创建着色器程序对象
  5. 绘制图元

创建一个Webgl程序

1.第一步获取画布,创建三维上下文对象

<canvas class="canvas" width="500" height="500"></canvas>

<script>
    const canvas = document.querySelector('.canvas')
    const gl = canvas.getContext('webgl')
</script>

2.第二步创建顶点着色器和片元着色器

顶点着色器和片元着色器(两种方法,一种就是下面这样在script标签内通过type属性创建,第二种就是通过js的模版字符串创建)
方法一:

<!-- 顶点着色器 -->
    <script id="vertex-shader" type="x-shader/x-vertex">
        attribute vec2 aPos;
        attribute vec2 aPos1;
        void main(){
            gl_PointSize = 10.0;
            vec2 newPos = aPos + aPos1;
            gl_Position = vec4(newPos, 0.0, 1.0);
        }
        </script>
    <!-- 片元着色器 -->
    <script id="fragment-shader" type="x-shader/x-fragment">
        void main(){
            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
        }
        </script>
        
<script>
// 获取着色器源码
        const vertexSource = document.getElementById('vertex-shader').innerText
        const fragmentSource = document.getElementById('fragment-shader').innerText
</script>

方法二:

<script>
// 定义顶点着色器
const vertexShaderSource = `
    attribute vec2 position;
        void main(){
            gl_Position = vec4(position, 0.0, 1.0);
        }
`
// 定义片元着色器
const fragmentShaderSource = `
    void main(){
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
`
</script>
  • attribute vec2 position;:声明了一个名为 position 的顶点属性,它是一个二维向量。
  • void main(){…}:顶点着色器的主函数,计算每个顶点的最终位置。
  • gl_Position = vec4(position, 0.0,1.0);:将顶点属性 position赋值给gl_Position,这是一个四维向量,表示顶点的最终位置。vec4(position, 0.0, 1.0)表示在二维空间中,顶点的z值为0.0,w值为1.0。
  • gl_FragColor = vec4(1.0,0.0,00,1.0);:将片元的颜色设置为红色,使用 vec4表示颜色,RGBA 分别为(1.0,0.0, 0.0, 1.0)。

3.第三步创建和编译顶点着色器和片元着色器

// 创建顶点着色器对象和片元着色器对象
const vertexShader = gl.createShader(gl.VERTEX_SHADER)
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
// 绑定着色器源码到对应着色器对象上
gl.shaderSource(vertexShader, vertexSource)
gl.shaderSource(fragmentShader, fragmentSource)
// 编译着色器源码
gl.compileShader(vertexShader)
gl.compileShader(fragmentShader)
  • gl.createShader(gl.VERTEX_SHADER);:创建一个顶点着色器对象。
  • gl.shaderSource(vertexShader, vertexShaderSource);:将顶点着色器源码绑定到顶点着色器对象。
  • gl.compileShader(vertexShader);:编译顶点着色器。

4.第四步创建着色器程序对象

// 创建程序对象
const program = gl.createProgram()
gl.attachShader(program, vertexShader)
gl.attachShader(program, fragmentShader)
gl.linkProgram(program);
gl.useProgram(program);
  • gl.createProgram();:创建一个着色器程序对象。
  • gl.attachShader(program, vertexShader);:将顶点着色器附加到着色器程序对象。
  • gl.attachShader(program, fragmentShader);:将片元着色器附加到着色器程序对象。
  • gl.linkProgram(program);:链接着色器程序对象,将顶点着色器和片元着色器链接成一个完整的可执行程序。
  • gl.useProgram(program);:告诉 WebGL使用这个着色器程序对象作为当前的渲染程序。

5.第五步绘制图元

// 绘制图元
gl.drawArrays(gl.POINTS, 0, 1)
  • gl.drawArrays(gl.POINTS, 0, 1);:从当前绑定的缓冲区中提取数据,根据指定的绘制模式进行绘制
  • gl.POINTS:指定绘制图元类型为一个点
  • 0:从顶点数组的第一个点开始绘制
  • 1:绘制一个点

运行结果
请添加图片描述

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第一个WebGL程序</title>
    <style>
        canvas{
            border: 1px solid #ccc
        }
    </style>
</head>
<body>
    <canvas class="canvas" width="500" height="500"></canvas>
    <!-- 顶点着色器 -->
    <script id="vertex-shader" type="x-shader/x-vertex">
        void main(){
            gl_PointSize = 10.0;
            gl_Position = vec4(0.5, 0.0, 0.0, 1.0);
        }
        </script>
    <!-- 片段着色器 -->
    <script id="fragment-shader" type="x-shader/x-fragment">
        void main(){
            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
        }
        </script>
    <script>
        const canvas = document.querySelector('.canvas')
        const gl = canvas.getContext('webgl')
        // 创建顶点着色器和片元着色器
        const vertexShader = gl.createShader(gl.VERTEX_SHADER)
        const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
        // 获取着色器源码
        const vertexSource = document.getElementById('vertex-shader').innerText
        const fragmentSource = document.getElementById('fragment-shader').innerText
        // 绑定着色器源码
        gl.shaderSource(vertexShader, vertexSource)
        gl.shaderSource(fragmentShader, fragmentSource)
        // 编译着色器源码
        gl.compileShader(vertexShader)
        gl.compileShader(fragmentShader)
        // 创建程序对象
        const program = gl.createProgram()
        gl.attachShader(program, vertexShader)
        gl.attachShader(program, fragmentShader)
        gl.linkProgram(program);
        gl.useProgram(program);
        // 绘制图元
        gl.drawArrays(gl.POINTS, 0, 1)
    </script>
</body>
</html>

总结

本篇文章讲解了如何通过WebGL绘制一个最基础的点,后续文章会持续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一些硬件知识(十七)

电源芯片选型&#xff1a; 1.考虑拓扑结构 2.考虑功率&#xff0c;从而决定自行搭建电路还是选择芯片 3.对于低功耗产品&#xff0c;静态电流是非常重要的因素&#xff0c;一定重要考虑&#xff1a; 同步buck省去了续流二极管&#xff0c;效率比异步的高。 如果真的比耐压值…

ESP32小车:1.硬件模块与连接

一、硬件模块 总的元器件清单:亚克力板(三轮),两个普通减速电机,一个开关模块,一个 首先,需要一块亚克力单层底板,推荐随便在淘宝上买一块2WD亚克力单层板,比如: 最好亚克力板自带电机,买一套也不过15块。如果没有需另外购买两个普通TT直流减速电机和轮子。…

基于yolov8的102种昆虫检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的102种昆虫检测系统是一款高效、准确的昆虫识别工具&#xff0c;它利用YOLOv8这一先进的目标检测算法&#xff0c;实现了对102种不同昆虫的实时检测与识别。该系统在农业、生态研究、生物多样性保护等多个领域具有广泛的应用价值。 YOLOv8算法以其高…

HTML沙漏爱心

目录 写在前面 完整代码 下载代码 代码分析 系列文章 写在最后 写在前面 教你用HTML语言实现炫酷的沙漏爱心,该代码不仅可以用电脑运行,手机、平板也可以直接运行哦。 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><…

【Linux】:文件IO

目录 1.C文件接口 1.1 当前路径是什么&#xff1f; 1.2 "w"和"a"​编辑 2.系统文件I/O 2.1 "比特宏"标识符的实现: 2.2 open 1.系统默认创建文件的权限只写 2.设置新建文件的权限 3. 覆盖写/清空写/追加写 3.访问文件的本质 3.1 文件…

茴香豆Web实践

茴香豆 是由书生浦语团队开发的一款开源、专门针对国内企业级使用场景设计并优化的知识问答工具。 茴香豆特点&#xff1a; 三阶段 Pipeline &#xff08;前处理、拒答、响应&#xff09;&#xff0c;提高相应准确率和安全性 打通微信和飞书群聊天&#xff0c;适合国内知识问…

提高工作效益方法(一)

目录 如何提高工作效率? 如何提高工作效率?&#xff08;每日工作安排&#xff09; 怎么在职场做好时间管理&#xff1f; 如何提高工作效率? 提高工作效率的关键在于采用一系列策略和方法&#xff0c;以确保工作能够高效、有序地进行。通过这些方法&#xff0c;可以有效地提…

【whisper】使用whisper实现语音转文字

whisper需要ffmpeg支持 官网下载ffmpeg https://www.gyan.dev/ffmpeg/builds/下载完毕后解压放到合适的位置 添加环境变量 在cmd中输入以下 ffmpeg -version出现下面结果代表成功 安装whisper pip install openai-whisper在vscode中运行 测试代码 import whisperif __n…

【c++】cout打印char * 或者char[]的细节详解

目录 char* 类型 1.打印指向的字符串 2.打印指针指向的地址 问题描述 解决方法 char型数组 1. 想要输出字符串 2. 想输出字符数组的地址 printf 和cout 的对比 1.打印首字符 2.打印字符串 3.打印字符串首地址 &#x1f497;感谢阅读&#xff01;&#x1f497; char*…

新火种AI|减脂增肌没捷径?对不起,那是AI 出现以前的事情了...

作者&#xff1a;小岩 编辑&#xff1a;彩云 对于很多人来说&#xff0c;“拥有完美的身材”是人生的重要目标之一&#xff0c;练出好身材的人也会以此为傲&#xff0c;会把自己的好身材po到社交媒体上。换个角度来说&#xff0c;为了让自己社交媒体上的形象足够完美&#xf…

Axure RP下载+详细安装步骤资源百度云盘分享

众所周知&#xff0c;Axure全称“axure rp”&#xff0c;是一款专业的快速原型设计工具。 它能帮助网站需求设计者&#xff0c;快捷而简便的创建基于网站构架图的带注释页面示意图、操作流程图、以及交互设计&#xff0c;并可自动生成用于演示的网页文件和规格文件&#xff0c…

小琳python课堂:Python核心概念 类和对象

大家好&#xff0c;这里是小琳python课堂&#xff01;今天我们来聊聊Python中的类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;&#xff0c;这是面向对象编程&#xff08;OOP&#xff09;的核心概念哦&#xff01;&#x1f31f; 面向对象编程就像是用“…

基于 INFINI Pizza 为 Hugo 静态站点添加搜索功能

INFINI Pizza 是 INFINI Labs 即将发布的一个基于 Rust 编写的搜索引擎&#xff08;即将完全开源&#xff09;&#xff0c;目前已经完成基本的搜索能力&#xff0c;并且基于 INFINI Pizza 的核心引擎&#xff0c;提供了一个 WASM 版本的超轻量级内核&#xff0c;可以很方便的嵌…

MicroNet关键代码解读(Micro-block与Dynamic Shift-Max的实现代码)

论文地址&#xff1a;https://arxiv.org/pdf/2011.12289 中文翻译&#xff1a;https://hpg123.blog.csdn.net/article/details/141772832?spm1001.2014.3001.5502 发表时间&#xff1a;2022 项目地址&#xff1a;https://github.com/liyunsheng13/micronet 在MicroNet论文中提…

查文献技巧,数模国赛必须掌握!

参加数学建模竞赛&#xff0c;拿到题目后第一件事就是去查文献&#xff0c;把题目的背景知识看懂。本文介绍查文献的一些技巧。 先看硕博士论文 硕博论文会对研究的问题有详细的背景和基础知识介绍&#xff0c;可帮助我们快速理解题目。 有个经典段子&#xff1a;学士、硕士…

对字符、字符串的研究

每日一背 C的字符串很特殊 //返回字符 char test2() {return p; } //返回整数 int test2() {return 90; } 其实字符串本就是很特殊的存在。字符型、整数算一类&#xff0c;但是字符串型区别前两个类。整数、字符都返回的是一个值&#xff0c;所以可以直接在主函数里面cout不…

《黑神话:悟空》火出圈儿,揭秘幕后实时渲染技术

游戏一度因被贴上“不务正业”、“虚度光阴”的标签而备受争议&#xff0c;然而随着该产业的蓬勃发展&#xff0c;一些游戏被纳入体育竞技项目&#xff0c;如今游戏领域吸引越来越多人的目光。当下火爆全网的《黑神话&#xff1a;悟空》&#xff0c;凭借炫酷逼真的3D效果和独特…

wordpress 页面URL自动跳转到图片地址?

比如你打开关于我们页面&#xff1a; yourdomain.com/about-us/ 结果自动跳转到了&#xff1a; yourdomain.com/wp-content/uploads/2024/08/about-us.jpg 刚开始以为是不是哪里设置了自动跳转&#xff0c;比如YOAST SEO里&#xff0c;但是结果发现不是。 结果发现&#x…

好用的运动耳机品牌推荐?几款开放式蓝牙耳机推荐

论好用的运动耳机推荐&#xff0c;我觉得开放式运动耳机是个不错的选择。主要是因为下面几点&#xff1a; 1舒适度&#xff1a;开放式耳机不封闭耳朵也不塞入耳朵耳道&#xff0c;所以就能够减少长时间佩戴可能造成的压耳感以及不舒服的体验。 2安全性&#xff1a;因为开放式…

鸿蒙(API 12 Beta3版)图形【AR Engine简介】 AR引擎服务

AR Engine&#xff08;AR引擎服务&#xff09;是一个用于在HarmonyOS上构建增强现实应用的引擎&#xff0c;提供了运动跟踪、环境跟踪和命中检测等空间计算能力。通过这些能力&#xff0c;您的应用可以实现虚拟世界与现实世界的融合&#xff0c;给消费者提供全新的视觉体验和交…