glsl着色器学习(六)

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

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,  // location3,            // size (components per iteration)gl.FLOAT,     // type of to get from bufferfalse,        // normalize0,            // 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,  // location3,          // size (components per iteration)gl.FLOAT,   // type of to get from bufferfalse,      // normalize0,          // 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,  // location2,            // size (components per iteration)gl.FLOAT,     // type of to get from bufferfalse,        // normalize0,            // 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.rhkb.cn/news/418211.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks Lakehouse 快速入门——Apache Iceberg

导读: StarRocks Lakehouse 快速入门旨在帮助大家快速了解湖仓相关技术,内容涵盖关键特性介绍、独特的优势、使用场景和如何与 StarRocks 快速构建一套解决方案。最后大家也可以通过用户真实的使用场景来了解 StarRocks Lakehouse 的最佳实践&#xff01…

判断给定的一个不限长的数字串大小变化趋势、经典面试题:猴子排成圈踢出求最后剩下大王编号以及Debian服务器php中安装IMAP扩展各种报错解决过程

一、判断给定的一个不限长的数字串大小变化趋势 自制了一道面试题:给定一个不限长的数字字符串,判断每一位数字的大小变化趋势是否是^或v趋势,如果是就返回true,如果不是就返回false。比如121即属于^,322129即属于v。这…

SSM健身俱乐部网站—计算机毕业设计源码25623

摘 要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在健身俱乐部的要求下,开发一款整体式结构的健身俱乐部网站…

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测 目录 多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变…

​​NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002

继续,执行pom.xml引入依赖以后,发现以下几种报错: 可以看到在下载aws-java-sdk-bundle 1.12.710版本的时候报错了 可以看到日志信息,就是在阿里云上下载的,因为阿里云上缺少这个jar包 aws-java-sdk-bundle-1.12.710.jar 这个jar包,我还特意去阿里云上查询了一下 https://deve…

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供…

java基础-线程实现

文章目录 什么是线程线程的基本特性线程的状态线程的调度 线程的实现方式1. 继承 Thread 类2. 实现 Runnable 接口3. 使用 Callable 和 Future4. 使用 ExecutorService总结 什么是线程 线程(Thread)是计算机科学中的一个重要概念,它是操作系…

蔬菜识别数据集 蔬菜数据集 用于训练,有十种蔬菜,如图已经标注好的版本

数据集概述 该数据集包含十种常见的蔬菜:胡萝卜、包菜、水果辣椒、青瓜、南瓜、土豆、花菜和西红柿。数据集已经进行了精细的标注,适用于深度学习模型的训练,尤其是用于物体检测和分类任务。 数据集特点 种类多样:涵盖了八种蔬菜…

maven-helper插件解决jar包冲突实战

经常遇到jar包冲突问题&#xff0c;今天梳理一下&#xff1a; 1、打开idea 2、安装后 打开pom文件 点击 3、点击common-io 展示冲突的jar,标红的就是冲突版本&#xff0c;白色的是当前的解析版本。 pom文件多了排除的信息 <dependency><groupId>org.springframew…

0基础跟德姆(dom)一起学AI Python进阶07-多线程_生成器

* 多进程案例 * 带参数的多进程代码**(重点)** * 查看进程的id * 演示: 进程之间数据是相互隔离的 * 多线程案例 * 入门案例 * 带参数的多线程代码**(重点)** * 演示: 线程之间数据是相互共享的 * 互斥锁 * 上下文管理器**(重点)** > 解析: with open原理, 为啥…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…

机器学习中的聚类艺术:探索数据的隐秘之美

一 什么是聚类 聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇&#xff…

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …

大路灯护眼灯有必要吗安全吗?性价比高落地护眼灯推荐

大路灯护眼灯有必要吗安全吗&#xff1f;近几年来&#xff0c;随着生活节奏的加快&#xff0c;目前青少年的近视率呈现一个直线上升的趋势&#xff0c;其中占比达到了70%以上&#xff0c;并且最令人意外的是小学生竟然也占着比较大的比重&#xff0c;这一系列的数据不仅表明着近…

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中&#xff0c;Buffer Cache&#xff08;缓冲区缓存&#xff09;是内核用来优化对块设备&#xff08;如磁盘&#xff09;读写操作的一种机制&#xff08;故而有一种说法叫做块缓存&#xff09;。尽管在较新的Linux内核版本中&a…

联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态

近年来&#xff0c;中国汽车消费市场呈现出蓬勃发展的态势&#xff0c;而汽车金融服务作为降低购车门槛、优化购车体验的重要手段&#xff0c;正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示&#xff0c;相较于前一年&#xff0c;今年选择汽车金融服务的市场消费…

实战docker第二天——cuda11.8,pytorch基础环境docker打包

在容器化环境中打包CUDA和PyTorch基础环境&#xff0c;可以将所有相关的软件依赖和配置封装在一个Docker镜像中。这种方法确保了在不同环境中运行应用程序时的一致性和可移植性&#xff1a; Docker&#xff1a;提供了容器化技术&#xff0c;通过将应用程序及其所有依赖打包在一…

天然药物化学史话:甾体化合物-文献精读45(甾体化合物化学历史综述-地表最强综述系列-45)

天然药物化学史话:甾体化合物&#xff0c;极好的一篇综述&#xff0c;地表最强综述系列-45 摘要 甾体化合物是一类重要的天然产物,在人类发展史上不仅为人类的健康做出了特殊的贡献,而且其立体结构的特殊性方面也在有机化学发展史,特别是有机化学理论上占有极其重要的地位,完善…