【WebGL系列-02】创建program上下文
WebGL程序program对象的创建
program对象由顶点着色器对象和片元着色器对象构成,因此,创建program对象包含了两部分,一个是着色器对象的创建,一个是program对象的创建。
总体流程
- 创建顶点着色器对象
- 创建片元着色器对象
- 创建
program对象 - 将顶点着色器和片元着色器添加到程序中
- 将程序链接到webgl上下文
- 使用创建的
program对象
着色器对象的创建
着色器对象的创建包含三步:
- 创建着色器对象
- 将着色器源码送入对象
- 编译着色器
代码实现
/**
* 创建shader对象
* @param {*} gl webgl上下文对象
* @param {*} type 创建的shader的类型,顶点着色器为gl.VERTEX_SHADER,片元着色器为gl.FRAGMENT_SHADER
* @param {*} source glsl源码
*/
function loadShader(gl, type, source) {
// 创建shader
const shader = gl.createShader(type);
// 将glsl源码送入shader对象
gl.shaderSource(shader, source);
// 编译shader
gl.compileShader(shader);
// 检查shader是否编译成功
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert("编译shader时发生错误:" + gl.getShaderInfoLog(shader));
// 编译失败,删除shader
gl.deleteShader(shader);
return null;
}
return shader;
}
接口
WebGLShader WebGLRenderingContext.createShader(type)
创建一个Shader对象
type:为WebGLRenderingContext.VERTEX_SHADER和WebGLRenderingContext.FRAGMENT_SHADER中的一个,表示创建的是顶点着色器还是片元着色器
void WebGLRenderingContext.shaderSource(WebGLShader shader, string source)
设置WebGLShader着色器对象的GLSL代码
shader:用于设置程序代码的WebGLShadersource:包含glsl程序代码的字符串
void WebGLRenderingContext.compileShader(WebGLShader shader)
编译GLSL着色器,使其称为一个二进制数据,然后被WebGLProgram所使用
shader:WebGLShader,顶点着色器或片元着色器
Object WebGLRenderingContext.getShaderParameter(WebGLShader shader, pname)
返回给定的着色器信息
shader:需要获取信息的着色器对象pname:指定要查询的信息的属性名称,可以是以下值:WebGLRenderingContext.DELETE_STATUS:标识着色器是否被删除,删除GL_TRUE,未删除GL_FALSEWebGLRenderingContext.COMPILE_STATUS:标识着色器是否编译成功,成功GL_TRUE,不成功GL_FALSEWebGLRenderingContext.SHADER_TYPE:标识着色器的类型WebGLRenderingContext.VERTEX_SHADER:顶点着色器WebGLRenderingContext.FRAGMENT_SHADER:片元着色器
Object WebGLRenderingContext.getShaderInfoLog(WebGLShader shader)
获取着色器的信息日志,包含警告、debug和编译信息
shader:需要获取信息的着色器对象
void WebGLRenderingContext.deleteShader(WebGLShader shader)
删除参数提供的shader对象,如果该对象已经被删除,这个方法无效
shader:需要删除的shader对象
DOMString WebGLRenderingContext.getShaderSource(shader)
以DOMString的形式返回shader的源码
shader:WebGLShader,要获取源码的shader
创建着色器程序对象
创建着色器程序对象需要四步:
- 创建program对象
- 将着色器程序与着色器对象绑定
- 将上下文链接到着色器程序
- 使用着色器程序
代码实现
/**
* 初始化着色器程序
* @param {*} gl webgl上下文
* @param {*} vsSource 顶点着色器源码字符串
* @param {*} fsSource 片元着色器源码字符串
*/
function initShaderProgram(gl, vsSource, fsSource) {
// 创建着色器对象
const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
// 创建着色器程序
const shaderProgram = gl.createProgram();
// 将着色器程序与shader绑定
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
// 将上下文链接到着色器程序
gl.linkProgram(shaderProgram);
// gl.validateProgram(shaderProgram);
// 检查着色器程序是否创建成功
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("初始化着色器程序错误:" + gl.getProgramInfoLog(shaderProgram));
// 如果创建失败,则删除着色器对象和着色器程序对象
gl.deleteProgram(shaderProgram);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
return null;
}
// 使用着色器程序
gl.useProgram(shaderProgram);
return shaderProgram;
}
接口
WebGLProgram WebGLRenderingContext.createProgram()
初始化一个WebGLProgram对象
void WebGLRenderingContext.attachShader(program, shader)
向WebGLProgram中添加一个着色器
program:WebGLProgram对象shader:WebGLShader对象
void WebGLRenderingContext.linkProgram(program)
链接给定的WebGLProgram,完成为程序的片元顶点着色器准备GPU代码的过程
program:WebGLProgram,指定的着色器程序
Object WebGLRenderingContext.getProgramParameter(program, pname)
返回program的信息
program:指定的programpname:Glenum,可以是以下类型:WebGLRenderingContext.DELETE_STATUS:GLboolean,是否被删除WebGLRenderingContext.LINK_STATUS:GLboolean,是否成功地链接WebGLRenderingContext.VALIDATE_STATUS:GLboolean,最后一次验证操作是否成功WebGLRenderingContext.ATTACHED_SHADERS:GLint,返回添加的着色器的数量,之后可以使用WebGLRenderingContext.getAttachedShaders()获取这些shaderWebGLRenderingContext.ACTIVE_ATTRIBUTES:GLint,返回shader中激活的attribute变量的数量,之后可以使用WebGLRenderingContext.getActiveAttrib()方法获取这些变量WebGLRenderingContext.ACTIVE_UNIFORMS:GLint,返回shader中激活的uniform变量的数量,之后可以使用WebGLRenderingContext.getActiveUniform()方法获取这些变量WebGLRenderingContext.TRANSFORM_FEEDBACK_BUFFER_MODE [ WebGL2 only ]:GLenum,返回transform feedback激活时的buffer modeWebGLRenderingContext.SEPARATE_ATTRIBSWebGLRenderingContext.INTERLEAVED_ATTRIBS
WebGLRenderingContext.TRANSFORM_FEEDBACK_VARYINGS [ WebGL2 only ]:GLint,indicating the number of varying variables to capture in transform feedback modeWebGLRenderingContext.ACTIVE_UNIFORM_BLOCKS [ WebGL2 only ]:GLint, indicating the number of uniform blocks containing active uniforms.
Object WebGLRenderingContext.getProgramInfoLog(program)
获取program中的信息,包括在link中的错误以及合法性的检查
program:WebGLProgram对象
void WebGLRenderingContext.deleteProgram(program)
删除一个program,如果已经删除,则不会产生任何效果
program:WebGLProgram,需要删除的program
void WebGLRenderingContext.useProgram(program)
将定义好的program对象添加到当前的渲染状态中
program:WebGLProgram对象
void WebGLRenderingContext.validateProgram(program)
检查program是否链接成功,同时检查能否在当前webgl中使用
注意一点,在WebGLProgram对象创建成功后,加入的WebGLShader对象就没有用了,可以调用deleteShader将其删除,防止占用内内存
【WebGL系列-02】创建program上下文的更多相关文章
- webgl 系列 —— 变换矩阵和动画
其他章节请看: webgl 系列 变换矩阵和动画 动画就是不停地将某个东西变换(transform).例如将三角形不停地旋转就是一个动画 和 CSS transform 类似,变换有三种形式:平移.缩 ...
- webgl 系列 —— 渐变三角形
其他章节请看: webgl 系列 渐变三角形 本文通过一个渐变三角形的示例逐步分析:varying变量.合并缓冲区.图形装配.光栅化.varying 内插 绘制三个点v1 需求:绘制三个相同颜色的点, ...
- webgl 系列 —— 绘制猫
其他章节请看: webgl 系列 绘制猫 上文我们了解了如何绘制渐变彩色三角形,明白了图形装配.光栅化,以及片元着色器计算片元的颜色. 现在如果让你绘制如下一只猫.难道绘制很多三角形,然后指定它们的颜 ...
- webgl 系列 —— 着色器语言
其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...
- 【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框
视频地址:http://v.qq.com/page/m/8/c/m0150izlt8c.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...
- Aoite 系列(02) - 超动感的 Ioc 容器
Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...
- SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming 字数545 阅读52 评论0 喜欢1 JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至 ...
- WPF入门教程系列(一) 创建你的第一个WPF项目
WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...
- JavaScript进阶系列02,函数作为参数以及在数组中的应用
有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...
随机推荐
- css实现文本溢出省略号
CSS常用属性: overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出不换行,只 ...
- AI 在 API 设计中的应用:如何利用 Al 快速实现 API 开发和测试
一.引言 在当今互联网技术的快速发展中,API 成为了越来越多的软件和系统之间交互的核心方式,而 API 的质量和效率对于软件的开发和运维都至关重要.为了提高 API 的设计.开发.测试和运维的效率和 ...
- shell和查找文件的一些操作
shell的操作 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) Ctrl + b :按字符后移(左向) Alt + f :按单词 ...
- CHS、LAB地址
CHS地址 CHS地址指的是柱面(Cylinder).磁头(Head).扇区(Sector)三个参数组成的地址,是用来表示磁盘上每个扇区位置的一种方式. 物理扇区号 = ((柱面号×磁头数) + 磁头 ...
- 编码器 | 基于 Transformers 的编码器-解码器模型
基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...
- 「AntV」X6开发实践:踩过的坑与解决方案
长期更新版文档请移步语雀(「AntV」X6开发实践:踩过的坑与解决方案 (yuque.com)) ️ | 如何自定义拖拽源? 相信你们在开发中更多的需求是需要自定义拖拽源,毕竟自定义的功能扩展性高一些 ...
- 从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档
VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的.本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 ...
- 逍遥自在学C语言 | 枚举的那些事儿
前言 在C语言中,枚举是一种方便组织和表示一组相关常量的工具.枚举类型有助于提高代码的可读性和可维护性.本文将介绍C语言枚举的基本概念.语法和用法,以及一些高级技巧. 一.人物简介 第一位闪亮登场,有 ...
- WPF之浅谈数据模板(DataTemplate)
数据模板有什么用 简而言之,数据模板能让你更方便.更灵活的显示你的各类数据.只有你想不到,没有它做不到的(感觉有点夸张,实践之后,你就觉得一点不夸张 ). 直接对比下效果: 无数据模板 应用了数据模板 ...
- ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作--登录和注销.ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用 ...