glsl着色器学习(六)

news2024/9/20 5:42:40

准备工作已经做完,下面开始渲染

gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);

gl.clearColor(0.5, 0.7, 1.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

gl.enable(gl.DEPTH_TEST);
gl.enable(gl.CULL_FACE);
设置视口
  1. gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
    1. 设置Webgl的视口。视口定义了渲染输出在画布区域上的矩形区域,这里设置了整个canvas区域作为视口,canvas是以左上角为原点坐标(0,0)
    2. canvas画布坐标系,辅助理解
设置清除颜色并清除缓冲区
  1. gl.clearColor(0.5, 0.7, 1.0, 1.0);
    1. 设置清除颜色,四个参数分别代表红、绿、蓝和透明度通道的值。
    2. 清除颜色之后,画布的颜色
  2. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    1. 设置清除颜色缓冲区和深度缓冲区
    2. COLOR_BUFFER_BIT表示颜色缓冲区
    3. DEPTH_BUFFER_BIT表示深度缓冲区
    4. 清除缓冲区是为了确保每一帧在渲染之前,缓冲区的内容都是初始状态,避免上一帧的渲染结果对当前帧产生影响。
启用深度测试和背面剔除
  1. gl.enable(gl.DEPTH_TEST);
    1. 启用深度测试。深度测试用于确定场景中哪些片段应该被绘制在前面,哪些应该被遮挡。可以简单理解css中的z-index;
  2. gl.enable(gl.CULL_FACE);
    1. 启用背面剔除。在3D图形中,一个物体通常是由多个三角形组成,每个三角形有正面以及背面。背面剔除可以提高渲染性能,因为对于不透明物体,通常只需要绘制正面即可,通过背面剔除,减少需要处理的片段数量
    2. 正面:在视角下,如果一个面是通过逆时针顺序定义的顶点绘制的,则被认为是正面
    3. 背面:在视角下,如果一个面是通过顺时针顺序定义的顶点绘制的,则被认为是背面
    4. gl.frontFace(gl.CCW),设置逆时针为正面(默认)
    5. gl.frontFace(gl.CW),  设置顺时针为正面
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.enableVertexAttribArray(positionLoc);
gl.vertexAttribPointer(
    positionLoc,  // location
    3,            // size (components per iteration)
    gl.FLOAT,     // type of to get from buffer
    false,        // normalize
    0,            // stride (bytes to advance each iteration)
    0,            // offset (bytes from start of buffer)
);

gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);
gl.enableVertexAttribArray(normalLoc);
gl.vertexAttribPointer(
    normalLoc,  // location
    3,          // size (components per iteration)
    gl.FLOAT,   // type of to get from buffer
    false,      // normalize
    0,          // stride (bytes to advance each iteration)
    0,          // offset (bytes from start of buffer)
);

gl.bindBuffer(gl.ARRAY_BUFFER, texcoordBuffer);
gl.enableVertexAttribArray(texcoordLoc);
gl.vertexAttribPointer(
    texcoordLoc,  // location
    2,            // size (components per iteration)
    gl.FLOAT,     // type of to get from buffer
    false,        // normalize
    0,            // stride (bytes to advance each iteration)
    0,            // offset (bytes from start of buffer)
);

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);

gl.useProgram(prg);

 

 设置顶点数据
  1. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
    1. 将之前创建的存储顶点位置数据的缓冲区(positionBuffer)绑定到ARRAY_BUFFER目标上,以便后续对这个缓冲区进行操作
  2. gl.enableVertexAttribArray(positionLoc)
    1. 启用顶点属性数组,通过gl.getAttribLocaton(prg,'position')获取到的位置属性。使得在顶点着色器中可以访问这个属性。
  3. gl.vertexAttribPointer(positionLoc, 3, gl.FLOAT, false, 0, 0);
    1. positionLoc是属性的位置。
    2. 3表示每个顶点的位置由三个分量(X,Y,Z坐标)组成(如果画二维图形,一个顶点只需要2个坐标,不需要Z坐标)
    3. gl.Float表示从缓冲区读取到的数据类型是浮点数
    4. false表示不归一化处理
    5. 0表示步长为0,即连续存储,没有间隔
    6. 0表示偏移量为0,从缓冲区的起始位置开始读取
设置顶点法线数据
  1.  绑定法线数据缓冲区。
  2. 启用顶点属性数组(针对法线属性)。
  3. 使用gl.vertexAttribPointer设置法线属性的参数,同样每个法线由三个分量组成
设置顶点纹理坐标数据
  1. 绑定纹理坐标数据缓冲区。
  2. 启用顶点属性数组(针对纹理坐标属性)。
  3. 使用gl.vertexAttribPointer设置纹理坐标属性的参数,这里每个纹理坐标由两个分量(U、V)组成。所以是2
绑定索引缓冲区
  1. gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)
    1. 将存储顶点索引数据的缓冲区(indexBuffer)绑定到ELEMENT_ARRAY_BUFFER目标上,用于在绘制时指定哪些顶点来构建三角形。
使用着色器程序
  1. gl.useProgram(prg)
    1. 使用之前创建并链接好的着色器程序prg,使得后续渲染操作将使用这个程序进行顶点和片段进行处理

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

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

相关文章

轻量级的git-server工具:docker部署gogs

背景 创建一个自己使用的git server,让平时使用的代码之类的可以直接传到自己的服务器上,进行远程管理。由于一个人使用,gitlab 太重,所以选择gogs来实现功能。 系统:openEuler 22.03 (LTS-SP3) ip: 192.168.100.31 …

【Linux】Linux项目自动化构建工具 - make/Makefile

目录 一、make/Makefile的背景二、make/Makefile的基本概念三、依赖关系四、依赖方法五、make/Makefile原理六、Makefile的伪目标七、Makefile的变量八、Makefile的推导能力结尾 一、make/Makefile的背景 一个工程中的源文件不计数,其按类型、功能、模块分别放在若…

【Java 基础】:三大特征之多态

✨ 杏花疏影里,吹笛到天明 🌏 📃个人主页:island1314 🔥个人专栏:java学习 ⛺️ 欢迎关注:👍点赞 👂&…

JVM参数有哪些?

JVM调优主要是通过定制JVM参数来提Java应用程序的运行速度 JVM参数大致可以分为三类: 1、标准指令:-开头,这些是所有的HotSPot都支持的参数。可以用java -help打印出来; 2、非标准指令:-X开头…

Mysql高级篇(上)—— Mysql架构介绍(二)

Mysql高级篇(上) MySQL架构介绍(二)逻辑架构逻辑架构剖析MySQL8.0中SQL执行流程Linux环境下MySQL8.0中SQL执行原理MySQL语法顺序Oracle中SQL执行流程(了解)数据库缓存池 buffer pool(了解&#…

86、pod部署策略

一、集群的调度 集群的调度: 怎么把pod部署到节点的方法。 1.1、调度的过程: scheduler是集群的调度器,主要任务就是把pod部署到节点上。 1.2、自动调度: 1、公平,保证每个可用的节点都可以部署pod 2、资源的高…

什么是工控安全,产线工控安全加固的方法

一、工控安全概述 想要了解工控安全,首先要了解其资产对象本身,也就是工业控制系统。 1、什么是工控 关于工业控制系统的定义,网上有很多,我就不再赘述,下面这张图是我从csdn找到的,个人觉得还不错。对照…

【多线程】CountDownLatch的简单实现

通过上一篇对CountDownLatch的使用,我们也明白了他的基本原理,接下来我们一起来实现一个CountDownLatch的基础效果 新建一个抽象类,包含countDownLatch需要的参数和方法 package com.atguigu.signcenter.nosafe.chouxiang;/*** author: jd* …

k8s集群的调度

目录 自动调度的原则 调度约束机制:list-watch apiserver和组件之间的watch机制 调度过程的默认算法 1.预算策略 预算的算法 2.优选策略 优选的算法 *用户定制节点部署 1.强制性节点部署 2.节点标签部署(匹配机制) 标签的增删改查…

selenium无法定位元素的几种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: d…

Hadoop 下载

下载法一:官方下载 hadoop官网 1.选择要下载的版本,这里我以3.4.0为例进行说明; 2.跳转后,选择对应系统架构的,进行下载; 下载法二:国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

【已解决】Halcon错误代码4104

问题描述 在运行的时候发现报错4104,如下图所示 解决 从字面上理解就是超出了计算机的内存空间了,那么着手解决的话就需要把没次训练的张数减少一些即可。去相对应的修改batch_size即可。 结果 如下图所示,正常在使用GPU训练。 搞定&…

Xilinx FFT IP使用

简介 本章节主要介绍FFT原理,以及Xilinx的FFT IP使用说明做详细介绍。 FFT介绍 FFT主要是将时域信号转换成频域信号,转换后的信号更方便分析。首先,FFT是离散傅立叶变换 (DFT) 的快速算法,那么说到FFT,我们自然要先讲清楚傅立叶变换。先来看看傅立叶变换是从哪里来的? 傅…

虚拟机无法打开网卡 service network restart失败

问题描述 命令重启网卡服务,结果报错如下:Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details 根据提示&#xff…

Hi3061M开发板初测——点亮小灯

目录 前言环境配置点亮led源码IDA集成了串口监视器最后下载到开发板中运行 前言 海思MCU体验官活动,Hi3061M开发板到手后,配置环境初步测试点亮小灯。 环境配置 环境配置按照gitee提供的redeme一步一步来配置起来很顺利。具体可自行查阅:环境…

文件包含漏洞PHP伪协议利用方法

使用php伪协议的前提 php.ini中的allow_url_fopen 、allow_url_include这两个参数需要修改为on 1.file协议 使用file协议读取Windows的系统文件 http://127.0.0.1/123.php?cmdfile:///c:/windows/system32/drivers/etc/hosts 2.php://filter协议 使用php://filter协议可以…

JsonCpp库的使用

目录 一、Json数据格式 二、JsonCpp介绍 2.1 Json::Value 2.2 序列化接口 2.3 反序列化接口 三、JsonCpp的使用 3.1 头文件包含 3.2 序列化 3.3 反序列化 四、补充 Json 是⼀种数据交换格式,它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。 一、J…

P01-Java何谓数组

P01-Java何谓数组 一、数组声明创建 1.1 数组声明的语法 与c有所不同 在Java中,数组声明语法 首选语法: //数据类型[] 数组名称; int[] arr;次选,与c类似 //数据类型 数组名称[]; int arr[];1.2 数组创建语法 与c指针有所相似&#xff0…

嵌入式开发与应用按键外部中断实验二

一、实验目的 1. 通过实验掌握中断式键盘控制与设计方法; 2. 熟悉编写中断服务程序; 3. 掌握中断系统相关知识,掌握外部中断应用方法和处理过程; 4. 掌握实验处理器中断处理的软件编程方法; 5. 从按键程序的设计对系统的编程…

Prometheus_0基础_学习笔记

一、基本概念 Prometheus是由golang语言开发的一套开源的监控、报警、时间序列数据库的组合,是一款基于时序数据库的开源监控告警系统。 时间序列数据库:时间序列数据库(Time Serires Database , TSDB)不同于传统的关系型数据库。…