WebGL 创建和初始化着色器过程
1.编译GLSL ES代码,创建和初始化着色器供WebGL使用。这些过程一般分为7个步骤:
创建着色器对象(gl.createBuffer());
向着色器对象中填充着色器程序的源代码(gl.shaderSource());
编译着色器(gl.compileShander());
创建程序对象(gl.createProgram());
为程序对象分配着色器(gl.attachShader());
连接程序对象(gl.linkProgram());
使用程序对象(gl.useProgram());
2.着色器对象和程序对象
着色器对象:着色器对象管理一个顶点着色器或一个片元着色器。每个着色器都有一个着色器对象。
程序对象:程序对象是管理着色器对象的容器。WebGl中,一个程序对象必须包含一个顶点着色器和一个片元着色器。
3.gl.createShader(type)创建着色器
创建由type指定的着色器对象。参数:
type:指定创建着色器对象的类型,gl.VERTEX_SHADER表示顶点着色器,gl.FRAGEMENT_SHADER表示片元着色器
4.gl.deleteShader(shader)
删除shader指定的着色器对象。参数:
shader:待删除的着色器对象
5.gl.shaderSource(shader, source)指定着色器对象的代码
将source指定的字符串形式代码传入shader指定的着色器。如果之前已经向shader传入过代码了,旧的代码会被替换掉。参数:
shader:指定需要传入代码的着色器对象
source:指定字符串形式的代码
6.gl.compileShader(shader)编译着色器
编译shader指定的着色器中的源代码。参数:
shader:待编译的着色器
7.gl.getShaderParameter(shader, pname)
获取shader指定的着色器中,pname指定的参数信息。参数:
shader:指定待获取参数的着色器
pname:自定待获取参数的类型,可以是gl.SHADER_TYPE、gl.DELETE_STATUS或者gl.COMPILE_STATUS
返回值:根据pname的不同,返回不同的值。type为gl.SHADER_TYPE,返回时顶点着色器(gl.VERTEX_SHADER)还是片元着色器(gl.FRAGEMENT_SHADER);type为gl.DELETE_STATUS返回着色器是否被删除成功;type为COMPILE_STATUS,返回是否编译成功。
8.gl.getShaderInfoLog(shader)
获取shader指定着色器的信息日志。参数:
shader:包含日志信息的字符串
9.gl.createProgram()
创建程序对象。如前所述,程序对象包含了顶点着色器和片元着色器
10.gl.deleteProgram(program)
删除program指定的程序对象,如果该程序对象正在被使用,则不立即删除。而是等它不在被使用后再删除。参数:
program:指定待删除的程序对象
11.gl.attachShader(program, shader)
将shader指定的着色器对象分配给program指定的程序对象。参数:
program:指定程序对象
shader:指定着色器对象
着色器在附给程序对象前,并不定义要为其指定代码或进行编译(也就是说,把空的着色器附给程序对象也是可以的)。
12.gl.detachShader(program, shader)
取消shader指定的着色器对象对program指定的程序对象的分配。参数:
program:指定程序对象
shader:指定着色器对象
13.gl.linkProgram(program)
连接program指定的程序对象中的着色器。参数:
program:指定程序对象
程序对象进行着色器连接操作,目的是保证:(1)顶点着色器和片元着色器的varying变量同名同类型,且一一对应;(2)顶点着色器对每个varying变量赋了值;(3)顶点着色器和片元着色器中的同名uniform变量也是同类型的;(4)着色器中的attribute变量、uniform变量和varying变量的个数没有超过着色器的上限,等等。
14.gl.getProgramParameter(program, pname)
获取program指定的程序对象中pname指定的参数信息。返回值随着pname的不同而不同。参数:
program:指定程序对象
pname:指定待获取参数的类型,可以是gl.DELETE_STATUS、gl.LINKE_STATUS、gl.VALIDATE_STATUS、gl.ATTACHED_SHDERS、gl.ACTIVE_ATTRIBUTES或gl.ACTIVE_UNIFORMS
返回值:根据pname的不同。返回不同的值。pname为gl.DELETE_STATUS,返回是否被删除(true或false);pname为gl.LINKE_STATUS,程序是否连接成功(true或false);pname为gl.VALIDATE_STATUS,程序是否已经通过验证(true或false);pname为ATTACHED_SHDERS,已被分配给程序的着色器数量;pname为gl.ACTIVE_ATTRIBUTES,顶点着色器中attribute变量的数量;pname为gl.ACTIVE_UNIFORMS,程序中uniform变量的数量。
15.gl.getProgramInfoLog(program)
获取program指定的程序对象的信息日志。参数:
program:指定待获取信息日志的程序对象
16.gl.useProgram(program)
告知WebGl系统绘制时使用prgoram指定的程序对象。参数:
program:指定待使用的程序对象
WebGL 创建和初始化着色器过程的更多相关文章
- [WebGL入门]十一,着色器编译器和连接器
注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语,假设翻译有误.欢迎大家 ...
- Initialize the shader 初始化着色器
目录 Loads the shader files and makes it usable to DirectX and the GPU 加载着色器文件并使其可用于DirectX和GPU Compil ...
- WebGL中的OpenGL着色器语言
在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于G ...
- webgl巧妙方式写着色器代码
var VSHADER_SOURCE = function(){ /* void main(){ gl_Position = vec4(0.0,0.0,0.0,1.0); gl_PointSize = ...
- WebGL编程指南案例解析之多数据存储于一个缓冲区以及着色器通信
//顶点着色器往片元着色器传值 //多个参数值存于一个缓冲对象中 var vShader = ` attribute vec4 a_Position; attribute float a_PointS ...
- WebGL简易教程(二):向着色器传输数据
目录 1. 概述 2. 示例:绘制一个点(改进版) 1) attribute变量 2) uniform变量 3) varying变量 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL ...
- OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...
- OpenGL ES着色器语言之静态使用(static use)和预处理
OpenGL ES着色器语言之静态使用(static use) 在OpenGL ES中有一个术语叫静态使用(static use),什么叫静态使用呢? 在写代码中,对于一个变量可能具有以下三种情况: ...
- 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解
最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...
随机推荐
- 【排序算法】希尔排序算法 Java实现
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...
- javascript深入理解js闭包(转载)
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- ERP库位分布看板(库位管理)
客户正在使用的看板管理,根据厂家需求,做的二次开发. 一:看板效果 二:客户需求 1.客户需求:XX是一家汽车零部件(胶管,硅胶管等)的生产厂家,因此对原料,半成品的有效期有严格的要求. 多次调研得知 ...
- 令人眼前一亮的下拉式终端 Tilda & Guake
前言 老夫是 Linux 的老用户. 大一的时候某不方便透露姓名的校内组织给了一个 Fedora 13 的安装光盘,然后老夫学会了重装 Windows. 大二的时候知道了 Ubuntu ,开始在虚拟机 ...
- python excel操作总结
1.openpyxl包的导入 Dos命令行输入 pip install openpyxl==2.3.3 这里注意一下openpyxl包的版本问题 版本装的太高有很多api不支持了,所以笔者这里用的是2 ...
- html 框架 2017-03-11
1. 框架frameset (不在body中编写) Eg: 显示如下框架 第一步: <frameset rows="100,100,*" frmameborder=&qu ...
- CSS知识点汇总 (全是干货O(∩_∩)O~ )
一.CSS选择器 [选择器的命名规则] 1.只能有字母数字下划线组成,不能有其他任何特殊字符 2.开头不能是数字 [通用选择器]1.写法:*{}2.作用:选中页面中的所有标签(大范围修改)3.优先级: ...
- Visual Studio 2015创建ASP.NET5项目“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' 无法安装的错误
使用asp.net5建立web application时遇到DNX SDK版本 “dnx-clr-win-x86.1.0.0-beta5”无法安装的错误 解决办法: 运行cmd: 1.输入: @pow ...
- 如何修改SVN客户端中保存的密码
本文主要讲述Linux命令行下怎么修改已经保存的客户端密码: 第一步,删除 subvision文件: rm -rf ~/.subvision 第二步:执行任意需要访问服务器的svn命令,会提示是否永久 ...
- Android中的Drawable和动画
Android中Drawable是一种可以在Canvas上进行绘制抽象的概念,种类很多,常见的颜色和图片都可以是一个Drawable.Drawable有很多种,它们表示一种图像的概念,但是它们又不全是 ...