WebGL入门-WebGL常用API说明详解_点燃火柴的博客
文章推薦指數: 80 %
vertexAttrib3f()的同族函数7. 获取uniform变量地址gl.getUniformLocation()8. ... vertexAttrib3f(); 4.3 给attribute变量传值gl.
WebGL入门-WebGL常用API说明详解
点燃火柴
于 2021-05-0914:44:52 发布
938
收藏
7
分类专栏:
WebGL基础
文章标签:
WebGL
WebGL-API
三维API
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qw8704149/article/details/115152067
版权
WebGL基础
专栏收录该内容
45篇文章
21订阅
订阅专栏
WebGL常用API说明
1.设置背景色gl.clearColor()2.清空绘图区gl.clear()3.绘制操作gl.drawArrays()4.attribute变量4.1获取attribute变量地址gl.getAttribLocation()4.2给attribute变量传值gl.vertexAttrib3f()4.3给attribute变量传值gl.vertexAttrib3f()的同族函数
5.uniform变量5.1获取uniform变量地址gl.getUniformLocation()5.2向uniform变量传值gl.uniform4f()5.3向uniform变量传值gl.uniform4f()的同族函数
6.缓冲区对象(VBO)6.1创建缓冲区对象gl.createBuffer()6.2绑定缓冲区gl.bindBuffer()6.3向缓冲区对象写入数据gl.bufferData()6.4将缓冲区对象分配给attribute变量gl.vertexAttribPointer()6.5开启attribute变量gl.enableVertexAttribArray()
7.类型化数组8.向4*4矩阵传值gl.uniformMatrix4fv()9.varying变量使用9.1顶点着色器中声明varying变量9.2片元着色器中声明与使用varying变量9.3通过缓冲区对象给attribute变量传值
10.片元着色器的内置变量gl_FragCoord11.纹理对象使用11.1创建纹理对象gl.createTexture()11.2处理加载的纹理图像gl.pixelStorei()11.3激活纹理单元gl.activeTexture()11.4绑定纹理对象gl.bindTexture()11.5设置纹理填充方式gl.texParameteri()11.6纹理图像分配gl.texImage2D()
12.Matrix4对象的方法和属性13.隐藏面消除13.1开启隐藏面消除gl.enable()13.2关闭隐藏面消除gl.disable()
14.解决深度冲突设置多边形偏移gl.polygonOffset()15.通过顶点索引绘制物体gl.drawElements()16.着色器对象16.1创建着色器对象gl.createShader()16.2指定着色器代码gl.shaderSource()16.3编译着色器gl.compileShader()16.4获取着色器信息gl.getShaderParameter()16.5获取写入着色器日志gl.getShaderInfoLog()
17.程序对象17.1创建程序对象gl.createProgram()17.2删除程序对象gl.deleteProgram()17.3为程序对象分配着色器对象gl.attachShader()17.4取消程序对象分配的着色器对象gl.detachShader()17.5连接程序对象gl.linkProgram()17.6检查着色器是否连接成功gl.getProgramParameter()17.7获取程序对象的日志gl.getProgramInfoLog()17.8使用程序对象gl.useProgram()
18.读取指定区域的像素颜色gl.readPixels()19.指定混合gl.blendFunc()20.释放锁定深度缓冲区gl.depthMask()21.帧缓冲区对象(FBO)21.1创建帧缓冲区对象gl.createFramebuffer()21.2删除帧缓冲区对象gl.deleteFramebuffer()21.3创建渲染缓冲区对象gl.createRenderbuffer()21.4删除渲染缓冲区对象gl.deleteRenderbuffer()21.5绑定渲染缓冲区gl.bindRenderbuffer()21.6设置渲染缓冲区尺寸gl.renderbufferStorage()21.7绑定帧缓冲区gl.bindFramebuffer()21.8纹理对象关联到帧缓冲区对象gl.framebufferTexture2D()21.9将渲染缓冲区对象关联到帧缓冲区对象gl.framebufferRenderbuffer()21.10检查帧缓冲区的配置gl.checkFramebufferStatus()21.11设置绘图区域gl.viewport()
1.设置背景色gl.clearColor()
在清空绘图区之前需要设置背景色。
一旦指定了背景色后,背景色就会驻存在WebGL系统中,在下次调用gl.clearColor()方法前不会改变
函数功能:指定绘图区域的背景色
-----------------------------------------------------------
调用示例:gl.clearColor(red,green,blue,alpha)
-----------------------------------------------------------
参数
red 指定红色值(从0.0到1.0)
green 指定绿色值(从0.0到1.0)
blue 指定蓝色值(从0.0到1.0)
alpha 指定透明度值(从0.0到1.0)
小于0.0的值会被截断为0.0,大于1.0的值会被截断为1.0
-----------------------------------------------------------
返回值 无
-----------------------------------------------------------
错误 无
2.清空绘图区gl.clear()
清空绘图区实际上是清空颜色缓冲区,在WebGL中缓冲区有三类:颜色缓冲区、深度缓冲区、模板缓冲区
函数功能:将指定缓冲区设置为预定的值-预定的值指的是gl.clearColor()设置的值
-----------------------------------------------------------------------------------
调用示例:gl.clear(buffer)
-----------------------------------------------------------------------------------
参数
buffer 指定待清空的缓冲区,位操作位|可以用来指定多个缓冲区
gl.COLOR_BUFFER_BIT 代表清空颜色缓冲区
gl.DEPTH_BUFFER_BIT 代表清空深度缓冲区
gl.STENCIL_BUFFER_BIT 代表清空模板缓冲区
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 INVALID_VALUE 缓冲区不是以上三种类型
如果没有指定背景色(没有调用gl.clearColor()函数),直接调用gl.clear(),那么使用的默认值如下所示
缓冲区名称默认值相关函数颜色缓冲区(0.0,0.0,0.0,0.0)gl.clearColor(red,green,blue,alpha)深度缓冲区1.0gl.clearDepth(depth)模板缓冲区0gl.clearStencil(s)
3.绘制操作gl.drawArrays()
建立了着色器之后,我们就要进行绘制了,gl.drawArrays()是一个强大的函数,可以用来绘制各种图形,该函数的规范如下所示
函数功能:执行顶点着色器,按照mode参数指定的方式绘制图形
--------------------------------------------------------------------------
调用示例:gl.drawArrays(mode,first,count)
--------------------------------------------------------------------------
参数
mode 指定绘制的方式,可以接收以下常量符号:
gl.POINTS,gl.LINES,gl.LINE_STRIP,gl.LINE_LOOP
gl.TRIANGLES,gl.TRIANGLE_STRIP,gl.TRIANGLE_FAN
first 指定从哪个点开始绘制-整形数
count 指定要绘制多少个顶点-整形数
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 INVALID_ENUM 传入的mode参数不是指定参数
INVALID_VALUE 参数first或count是负数
第一个参数mode说明gl.drawArray()方法可以绘制各种图形,它的第一个参数可以取众多常量:gl.POINTS,gl.LINES,gl.LINE_STRIP,gl.LINE_LOOP,gl.TRIANGLES,gl.TRIANGLE_STRIP,gl.TRIANGLE_FAN,接下来通过一张图来解释一下每一个值代表的意思
4.attribute变量
4.1获取attribute变量地址gl.getAttribLocation()
我们在着色器程序中声明的attribute变量都会有一个自己的存储地址,通过这个地址我们可以在外部程序中给它赋值,gl.getAttribLocation()方法就是帮我们获取这个地址的利器
函数功能:获取有name指定的着色器中attribute变量的存储地址
--------------------------------------------------------------------------
调用示例:gl.getAttribLocation(program,name)
--------------------------------------------------------------------------
参数
program 指定包含顶点着色器和片元着色器的着色器程序对象
name 指定想要获取其存储地址的attribute变量名称
--------------------------------------------------------------------------
返回值 >=0 attribute变量的存储地址
-1 指定的变量名不存在,或命名具有gl_或webgl_前缀
--------------------------------------------------------------------------
错误 INVALID_OPERATION 程序对象未能连接成功
INVALID_VALUE name参数的长度大于最大长度,默认256字节
示例代码
//获取着色器attribute变量a_Position的存储地址
vara_Position=gl.getAttribLocation(gl.program,'a_Position');
4.2给attribute变量传值gl.vertexAttrib3f()
gl.getAttribLocation()方法帮我们获取到了着色器变量的地址,这时就需要请出gl.vertexAttrib3f()方法了,通过这个方法我们就可以在JavaScript程序中把想要赋的值赋给着色器中的attribute变量
函数功能:将数据v0,v1,v2传给由location参数指定的着色器的attribute变量
------------------------------------------------------------------------------
调用示例:gl.vertexAttrib3f(location,v0,v1,v2)
------------------------------------------------------------------------------
参数
location 指定将要修改的attribute变量的存储地址
v0 指定填充attribute变量第一个分量的值
v1 指定填充attribute变量第二个分量的值
v2 指定填充attribute变量第三个分量的值
------------------------------------------------------------------------------
返回值 无
------------------------------------------------------------------------------
错误 INVALID_OPERATION 没有当前的program对象
INVALID_VALUE location大于等于attribute变量的最大数据,默认为8
示例代码
//向着色器attribute变量a_Position传值
gl.vertexAttrib3f(a_Position,0.0,0.0,0.0)
4.3给attribute变量传值gl.vertexAttrib3f()的同族函数
gl.vertexAttrib3f()方法是一系列同族函数中的一个,该系列函数的任务就是从JavaScript程序中向顶点着色器中的attribute变量传值
函数功能:将数据[1~4个分量]传给由location参数指定的着色器的attribute变量
------------------------------------------------------------------------------
gl.vertexAttrib1f(location,v0)
gl.vertexAttrib2f(location,v0,v1)
gl.vertexAttrib3f(location,v0,v1,v2)
gl.vertexAttrib4f(location,v0,v1,v2,v3)
------------------------------------------------------------------------------
参数
location 指定将要修改的attribute变量的存储地址
v0,v1,v2,v3 指定传输给attribute变量的四个分量的值
------------------------------------------------------------------------------
返回值 无
------------------------------------------------------------------------------
错误 INVALID_VALUE location大于等于attribute变量的最大数据,默认为8
你同样可以使用这些方法的矢量版本,它们的名字以"v"作为结尾。
并接受类型化数组作为参数,函数名中数字表示数组中元素的个数
varposition=newFloat32Array([1.0,2.0,3.0,1.0]);
gl.vertexAttrib4fv(position);
5.uniform变量
5.1获取uniform变量地址gl.getUniformLocation()
与attribute变量一样,要在JavaScript程序中使用着色器中的变量,首先要获取该变量的存储地址,attribute变量通过gl.getAttribLocation()方法获取,uniform变量则通过gl.getUniformLocation()方法获取
函数功能:获取由name指定的uniform变量的存储地址
--------------------------------------------------------------------------
调用示例:gl.getUniformLocation(program,name)
--------------------------------------------------------------------------
参数
program 指定包含顶点着色器和片元着色器的着色器程序对象
name 指定想要获取其存储地址的uniform变量名称
--------------------------------------------------------------------------
返回值 non-null uniform变量的存储地址
null 指定的uniform变量不存在,或命名具有gl_或webgl_前缀
--------------------------------------------------------------------------
错误 INVALID_OPERATION 程序对象未能连接成功
INVALID_VALUE name参数的长度大于uniform变量名的最大长度,默认256字节
示例代码
//获取片元着色器uniform变量u_FragColor的存储地址
varu_FragColor=gl.getUniformLocation(gl.program,'u_FragColor');
5.2向uniform变量传值gl.uniform4f()
gl.getUniformLocation()方法帮我们获取到着色器uniform变量的地址,我们在JavaScript程序中处理完,需要把新的值再传给这个uniform变量。
这时就需要用到gl.uniform4f()方法了
函数功能:将数据v0,v1,v2,v3传给由location参数指定的uniform变量
---------------------------------------------------------------------------------
调用示例:gl.uniform4f(location,v0,v1,v2,v3)
---------------------------------------------------------------------------------
参数
location 指定将要修改的uniform变量的存储地址
v0 指定填充uniform变量第一个分量的值
v1 指定填充uniform变量第二个分量的值
v2 指定填充uniform变量第三个分量的值
v2 指定填充uniform变量第四个分量的值
---------------------------------------------------------------------------------
返回值 无
---------------------------------------------------------------------------------
错误 INVALID_OPERATION 没有当前的program对象,或者location是非法的存储位置
示例代码
//向片元着色器uniform变量u_FragColor传值
gl.uniform4f(u_FragColor,1.0,0.0,0.0,1.0)
5.3向uniform变量传值gl.uniform4f()的同族函数
gl.uniform4f()方法是一系列同族函数中的一个,该系列函数的任务就是从JavaScript程序中向着色器中的uniform变量传值
函数功能:将数据[1~4个分量]传给由location参数指定的uniform变量
------------------------------------------------------------------------------
gl.uniform1f(location,v0)
gl.uniform2f(location,v0,v1)
gl.uniform3f(location,v0,v1,v2)
gl.uniform4f(location,v0,v1,v2,v3)
------------------------------------------------------------------------------
参数
location 指定将要修改的uniform变量的存储地址
v0,v1,v2,v3 指定传输给uniform变量的四个分量的值
------------------------------------------------------------------------------
返回值 无
------------------------------------------------------------------------------
错误 INVALID_OPERATION 没有当前的program对象,或者location是非法的存储位置
友情提示:gl.uniform1f()只需要传输一个值,这个值将被填充到uniform变量的第一个分量中,第二、第三个分量将被设置为0.0,第四个分量将被设置为1.0,其他同族函数类推
6.缓冲区对象(VBO)
6.1创建缓冲区对象gl.createBuffer()
6.2绑定缓冲区gl.bindBuffer()
6.3向缓冲区对象写入数据gl.bufferData()
6.4将缓冲区对象分配给attribute变量gl.vertexAttribPointer()
6.5开启attribute变量gl.enableVertexAttribArray()
7.类型化数组
为了优化性能,WebGL引入了一种特殊的数组-类型化数组,我们先来看一下类型化数组的种类
数组类型每个元素所占字节数描述(C语言还在那个的数据类型)Int8Array18位整形数(signedchar)UInt8Array18位无符号整形数(unsignedchar)Int16Array216位整形数(signedshort)UInt16Array216位无符号整形数(unsignedshort)Int32Array432位整形数(signedint)UInt32Array432位无符号整形数(unsignedint)Float32Array432位单精度浮点数(float)Float64Array864位双精度浮点数(double)
类型化数组与JavaScript中的数组有所不同,它不支持pus(),pop()等方法,但是它有自己一系列的方法和属性,具体请查阅下表
方法、属性和常量描述get(index)获取第index个元素的值set(index,value)设置第index个元素的值为valueset(array,offset)从第offset个元素开始将数组array中的值填充进去length数组的长度BYTES_PER_ELEMENT数组中每个元素所占的字节数
8.向4*4矩阵传值gl.uniformMatrix4fv()
调用示例:gl.uniformMatrix4fv(location,transpose,array)
----------------------------------------------------------------------------------
函数功能:将array表示的4*4矩阵分配给由location指定的uniform变量
----------------------------------------------------------------------------------
参数
location uniform变量的存储地址
transpose 在WebGL中必须指定为false
array 待传输的类型化数组,4*4矩阵按列主序
----------------------------------------------------------------------------------
返回值 无
----------------------------------------------------------------------------------
错误 INVALID_OPERATION 不存在当前程序对象
INVALID_VALUE transpose不为false,或者数组的长度小于16
示例代码
//在x、y、z轴方向上平移的距离
varTx=0.5
varTy=0.5
varTz=0.0
//创建平移矩阵的类型化数组
vartranslateMatrix=newFloat32Array([
1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,1.0,0.0,
Tx,Ty,Tz,1.0
])
//获取顶点着色器uniform变量u_TranslateMatrix(平移矩阵)的存储地址
varu_TranslateMatrix=gl.getUniformLocation(gl.program,'u_TranslateMatrix')
//向顶点着色器uniform变量u_TranslateMatrix传值
gl.uniformMatrix4fv(u_TranslateMatrix,false,translateMatrix)
9.varying变量使用
9.1顶点着色器中声明varying变量
9.2片元着色器中声明与使用varying变量
在片元着色器中同样也要先声明varying变量v_Color,这样片元着色器与顶点着色器通过v_Color变量建立了通讯通道,就可以接收顶点着色器传送的片元颜色信息,同时将接受到的颜色信息赋值给片元着色器的内置变量gl_FragColor
9.3通过缓冲区对象给attribute变量传值
创建类型化数组。
这里创建的类型化数组用来存放顶点坐标和顶点颜色信息,大家看一下注释,这个数组中有三行,每一行是一个顶点,在以顶点1为例,前两个元素是顶点坐标,后三个元素是顶点颜色信息。
创建缓冲区对象并绑定和写入数据。
这一步需要创建缓冲区对象,绑定目标,并将创建的存储顶点坐标和颜色信息的类型化数组写入它a_Position的分配缓存与开启。
在这里我们注意一下函数gl.vertexAttribPointer()的第五个参数和第六个参数,第五个参数stride指的是每一个顶点的大小,传值为FSIZE*5,其实就是告诉缓存,每取一个点,我要取五个数,第六个参数offset指的是缓冲区对象中的偏移量,我们设置为0,因为每一个点,它都是从开始取值a_Color的分配缓存与开启。
在这里我们也注意一下gl.vertexAttribPointer()的参数,第五个参数stride与上一次分配a_Position一样,也值为FSIZE*5,因为每个点五个元素没有改变。
第六个参数offset这次设置为FSIZE*2,因为每一个顶点的前两个元素是顶点坐标,后三个元素是颜色信息
10.片元着色器的内置变量gl_FragCoord
类型和变量描述vec4gl_FragCoord该内置变量的第一参数表示片元在canvas坐标系中的横坐标,第二参数表示片元在canvas坐标系中的纵坐标
使用示例
'precisionmediumpfloat;\n'+//设置精度
'uniformfloatu_Width;\n'+//声明uniform变量u_Width,用来接收canvas画布的宽度
'uniformfloatu_Height;\n'+//声明uniform变量u_Height,用来接收canvas画布的高度
'voidmain(){\n'+
//使用内置变量gl_FragCoord计算颜色并赋值给内置变量gl_FragColor
'gl_FragColor=vec4(gl_FragCoord.x/u_Width,0.0,gl_FragCoord.y/u_Height,1.0);\n'+
'}\n';
//获取着色器uniform变量u_Width的存储地址,并传值
varu_Width=gl.getUniformLocation(gl.program,'u_Width');
gl.uniform1f(u_Width,gl.drawingBufferWidth);
//获取着色器uniform变量u_Height的存储地址,并传值
varu_Height=gl.getUniformLocation(gl.program,'u_Height');
gl.uniform1f(u_Height,gl.drawingBufferHeight);
以上示例中片元的颜色取决于它的坐标位置,片元颜色会随着片元位置的变化而逐渐变化,所以呈现的图形颜色会有平滑的渐变效果
11.纹理对象使用
11.1创建纹理对象gl.createTexture()
11.2处理加载的纹理图像gl.pixelStorei()
11.3激活纹理单元gl.activeTexture()
11.4绑定纹理对象gl.bindTexture()
11.5设置纹理填充方式gl.texParameteri()
通过上面的介绍,你会发现纹理参数pname的每个可选值都有一个默认值,如果你不调用gl.texParameteri()方法,也会使用默认值,需要注意的是gl.TEXTURE_MIN_FILTER纹理缩小方法的默认值是gl.NEAREST_MIPMAP_LINEAR这个默认值是一个被称为MIPMAP(金字塔)的纹理类型。
实际上MIPMAP是一系列的纹理,它们包括:gl.NEAREST_MIPMAP_NEAREST、gl.LINEAR_MIPMAP_NEAREST、gl.NEAREST_MIPMAP_LINEAR、gl.LINEAR_MIPMAP_LINEAR
11.6纹理图像分配gl.texImage2D()
12.Matrix4对象的方法和属性
这里我们介绍一下cuon-matrix.js中的Matrix4对象的图形变换相关方法和属性
方法/属性名称描述Matrix4.setIdentity()将Matrix4实例初始化为单位矩阵Matrix4.setTranslate(x,y,z)将Matrix4实例设置为平移矩阵,参数x,y,z分别代表在X轴,Y轴,Z轴上平移的距离Matrix4.setRotate(angle,x,y,z)将Matrix4实例设置为旋转矩阵,旋转的角度为angle,旋转轴为(x,y,z)Matrix4.setScale(x,y,z)将Matrix4实例设置为缩放矩阵,在三个轴上的缩放因子分别是x,y,zMatrix4.translate(x,y,z)将Matrix4实例乘以一个平移矩阵,该平移矩阵在X轴上平移x,Y轴上平移y,Z轴上平移z,相乘的结果还是储存在Matrix4中Matrix4.rotate(angle,x,y,z)将Matrix4实例乘以一个旋转矩阵,该旋转矩阵旋转的角度为angle,旋转轴为(x,y,z),相乘的结果还是储存在Matrix4中Matrix4.scale(x,y,z)将Matrix4实例乘以一个缩放矩阵,该缩放矩阵在三个轴上的缩放因子分别是x,y,z。
相乘的结果还是储存在Matrix4中Matrix4.set(m)将Matrix4实例设置为m,m必须也是一个Matrix4实例Matrix4.elements保存了Matrix4实例的矩阵元素的类型化数组,该类型化数组的种类为Float32ArrayMatrix4.setLookAt(eyeX,eyeY,eyeZ,atX,atY,atZ,upX,upY,upZ)根据视点(eyeX,eyeY,eyeZ)、观察点(atX,atY,atZ)、上方向(upX,upY,upZ)创建视图矩阵,视图矩阵的类型是Matrix4,观察点映射到的中心点Matrix4.setOrtho(left,right,bottom,top,near,far)根据参数top、bottom、left、right、near、far计算正投影矩阵Matrix4.setPerspective(fov,aspect,near,far)根据参数fov,aspect,near,far计算透视投影矩阵Matrix4.setInverseOf(m)使自身称为矩阵m的逆矩阵Matrix4.transpose()对自身进行转置操作,并将自身设置为转置后的结果
从上表中发现,包含set前缀的方法会更加参数计算出变换矩阵,并将该矩阵写入到自身中,即你可以通过Matrix4.elements获取该矩阵的内容,而不包含set前缀的方法,会先根据参数计算出变换矩阵,然后将自身和得到的变换矩阵相乘,最后把相乘后的矩阵写入到自身中,也就是说如果你需要对一个图形进行复合变换需要使用没有set前缀的方法。
13.隐藏面消除
13.1开启隐藏面消除gl.enable()
函数功能:开启cap表示的功能
-----------------------------------------------------------------------------------
调用示例:gl.enable(cap)
-----------------------------------------------------------------------------------
参数
cap 指定需要开启的功能,可以是以下几个
gl.DEPTH_TEST 隐藏面消除
gl.BLEND 混合
gl.POLYGON_OFFSET_FILL 多边形位移
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 INVALID_ENUM cap的值无效
13.2关闭隐藏面消除gl.disable()
函数功能:关闭cap表示的功能
-----------------------------------------------------------------------------------
调用示例:gl.disable(cap)
-----------------------------------------------------------------------------------
参数
cap 指定需要开启的功能,可以是以下几个
gl.DEPTH_TEST 隐藏面消除
gl.BLEND 混合
gl.POLYGON_OFFSET_FILL 多边形位移
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 INVALID_ENUM cap的值无效
14.解决深度冲突设置多边形偏移gl.polygonOffset()
函数功能:指定加到每个顶点绘制后Z值上的偏移量,偏移量按照公式m*factor+r*units计算,其中
m表示顶点所在表面相对于视线的角度,r表示硬件能够区分两个Z值之差的最小值
-----------------------------------------------------------------------------------
调用示例:gl.polygonOffset(factor,units)
-----------------------------------------------------------------------------------
参数
factor 指定每个多边形的可变深度偏移的比例因子,默认0
units 指定与顶点所在表面相对于视线的角度相乘的偏移乘数,默认0
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 无
15.通过顶点索引绘制物体gl.drawElements()
函数功能:执行着色器,按照mode参数指定的方式,根据gl.ELEMENT_ARRAY_BUFFER的缓冲区的顶点索引绘制图形
--------------------------------------------------------------------------
调用示例:gl.drawArrays(mode,count,type,offset)
--------------------------------------------------------------------------
参数
mode 指定绘制的方式,可以接收以下常量符号:
gl.POINTS,gl.LINES,gl.LINE_STRIP,gl.LINE_LOOP
gl.TRIANGLES,gl.TRIANGLE_STRIP,gl.TRIANGLE_FAN
count 指定绘制顶点的个数
type 指定索引值数据类型,可以以下值
gl.UNSIGNED_BYTE
gl.UNSIGNED_SHORT
offset 指定索引数组中开始绘制的位置,以字节为单位
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 INVALID_ENUM 传入的mode参数不是指定参数
INVALID_VALUE 参数count或offset是负数
第一个参数mode说明gl.drawArray()方法可以绘制各种图形,它的第一个参数可以取众多常量:gl.POINTS,gl.LINES,gl.LINE_STRIP,gl.LINE_LOOP,gl.TRIANGLES,gl.TRIANGLE_STRIP,gl.TRIANGLE_FAN,接下来通过一张图来解释一下每一个值代表的意思
16.着色器对象
16.1创建着色器对象gl.createShader()
在WebGL中所有的着色器对象必须通过调用gl.createShader()来创建
gl.createShader()根据传入的type创建顶点着色器或者片元着色器,如果不在需要这个着色器了,可以像这样gl.deleteShader(shader)删除它,注:删除着色器的时候,如果着色器对象还在使用(使用gl.attachShader()函数使这个着色器附件在了程序对象上),那么调用删除函数后,不会立即删除着色器,要等到不在使用该着色器时才会删除掉
16.2指定着色器代码gl.shaderSource()
16.3编译着色器gl.compileShader()
GLSLES语言与C或C++相似,需要编译成二进制的可执行文件才能使用,对于我们创建的着色器,在向着色器对象传入源代码之后,同样需要进行编译才能使用,WebGL提供了gl.compileShader()函数,用来编译着色器注:如果调用gl.shaderSource()函数时,用新代码替换了旧代码,已编译好的可执行文件不会被自动替换掉,需要手动重新编译,即再次调用gl.compileShader()函数
16.4获取着色器信息gl.getShaderParameter()
16.5获取写入着色器日志gl.getShaderInfoLog()
通常gl.getShaderParameter()函数和gl.getShaderInfoLog()函数是配合使用的,一般是将gl.getShaderParameter()函数的参数pname指定为gl.COMPILE_STATUS就可以检查着色器是否编译成功,如果编译失败通过gl.getShaderInfoLog()函数获取错误信息示例如下:
17.程序对象
17.1创建程序对象gl.createProgram()
17.2删除程序对象gl.deleteProgram()
17.3为程序对象分配着色器对象gl.attachShader()
WebGL程序要运行起来,必须要有两个着色器,一个顶点着色器,一个片元着色器,就需要通过gl.attachShader()函数为程序对象分配这两个着色器
17.4取消程序对象分配的着色器对象gl.detachShader()
17.5连接程序对象gl.linkProgram()
17.6检查着色器是否连接成功gl.getProgramParameter()
如果程序已经连接成功,我们就得到一个二进制的可执行模块供WebGL调用,如果连接失败可以通过gl.getProgramInfoLog()函数获取连接出错的信息
17.7获取程序对象的日志gl.getProgramInfoLog()
17.8使用程序对象gl.useProgram()
18.读取指定区域的像素颜色gl.readPixels()
调用示例:gl.readPixels(x,y,width,height,format,type,pixels)
--------------------------------------------------------------------------
函数功能:从颜色缓冲区中读取由x,y,width,height参数确定的矩形中的所有像素值,
并保存在pixels指定的数组中
--------------------------------------------------------------------------
参数
x,y 指定颜色缓冲区中矩形块左上角的坐标
width,height 指定矩形的宽度和高度,以像素为单位
format 指定像素值的颜色格式,必须为gl.RGBA
type 指定像素值的数据格式,必须为gl.UNSIGNED_BYTE
pixels 指定用来接收像素数据的Uint8Array类型化数组
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 INVALID_VALUE pixels为null,或者,width或height是负值
INVALID_OPERATION pexels的长度不够存储所有像素值数据
INVALID_ENUM format或type值无效
19.指定混合gl.blendFunc()
在进行α混合时要用到两个颜色,即源颜色(sourcecolor)和目标颜色(destinationcolor),源颜色是待混合进去的颜色,目标颜色是待被混合进去的颜色
函数功能:通过参数src_factor和dst_factor指定进行混合操作的函数,混合后的颜色计算如下:
=xsrc_factor+xdst_factor
-----------------------------------------------------------------------------------
调用示例:gl.blendFunc(src_factor,dst_factor)
-----------------------------------------------------------------------------------
参数
src_factor 指定源颜色在混合后颜色中的权重一种,如下表所示
dst_factor 指定目标颜色在混合后颜色中的权重一种,如下表所示
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 INVALID_VALUE src_factor或dst_factor的值不在下表中
可以指定给src_factor和dst_factor的常量
常量R分量的系数G分量的系数B分量的系数gl.ZERO0.00.00.0gl.ONE1.01.01.0gl.SRC_COLORRsGsBsgl.ONE_MINUS_SRC_COLOR(1-Rs)(1-Gs)(1-Bs)gl.DST_COLORRdGdBdgl.ONE_MINUS_DST_COLOR(1-Rd)(1-Gd)(1-Bd)gl.SRC_ALPHAAsAsAsgl.ONE_MINUS_SRC_ALPHA(1-As)(1-As)(1-As)gl.DST_ALPHAAdAdAdgl.ONE_MINUS_DST_ALPHA(1-Ad)(1-Ad)(1-Ad)gl.SRC_ALPHA_SATURATEmin(As,Ad)min(As,Ad)min(As,Ad)
上表中(Rs,Gs,Bs,As)表示源颜色的各个分量,(Rd,Gd,Bd,Ad)表示目标颜色的各个分量
接下来以gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA)为配置说明一下混合过程假设:源颜色(0.0,1.0,0.0,0.4),目标颜色(1.0,1.0,0.0,1.0)从假设中得知As=0.4,依据上表推出参数gl.SRC_ALPHA指定的源颜色的权重因子src_factor=(0.4,0.4,0.4),推出参数gl.ONE_MINUS_SRC_ALPHA指定的目标颜色的权重因子dst_factor=(0.6,0.6,0.6)
计算混合颜色的公式=xsrc_factor+xdst_factor带入以上公式=(0.0,1.0,0.0)x(0.4,0.4,0.4)+(1.0,1.0,0.0)x(0.6,0.6,0.6)=(0.0,0.4,0.0)+(0.6,0.6,0.0)=(0.6,1.0,0.0)
加法混合src_factor和dst_factor可以指定为上表中的任意常量,有一种比较常用的混合方式叫加法混合(additiveblending),加法混合的设置函数为gl.blendFunc(gl.SRC_ALPHA,gl.ONE)由于gl.ONE指定的权重因子的三个分量值都是1,所以加法混合会使被混合的区域更加明亮,通常用来实现爆炸的光照效果,或者一些需要引起注意的物品
20.释放锁定深度缓冲区gl.depthMask()
函数功能:锁定或释放深度缓冲区的写入操作
-----------------------------------------------------------------------------------
调用示例:gl.depthMask(mask)
-----------------------------------------------------------------------------------
参数 mask 指定是锁定(false)还是释放(true)深度缓冲区的写入操作
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 无
21.帧缓冲区对象(FBO)
21.1创建帧缓冲区对象gl.createFramebuffer()
调用示例:gl.createFramebuffer()
--------------------------------------------------------------------------
函数功能:创建帧缓冲区对象
--------------------------------------------------------------------------
参数 无
--------------------------------------------------------------------------
返回值 non-null 新创建的帧缓冲区对象
null 创建帧缓冲区对象失败
--------------------------------------------------------------------------
错误 无
21.2删除帧缓冲区对象gl.deleteFramebuffer()
调用示例:gl.deleteFramebuffer(framebuffer)
--------------------------------------------------------------------------
函数功能:删除帧缓冲区对象
--------------------------------------------------------------------------
参数 framebuffer 指定要删除的帧缓冲区对象
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 无
21.3创建渲染缓冲区对象gl.createRenderbuffer()
调用示例:gl.createRenderbuffer()
--------------------------------------------------------------------------
函数功能:创建渲染缓冲区对象
--------------------------------------------------------------------------
参数 无
--------------------------------------------------------------------------
返回值 non-null 新创建的渲染缓冲区对象
null 创建渲染缓冲区对象失败
--------------------------------------------------------------------------
错误 无
21.4删除渲染缓冲区对象gl.deleteRenderbuffer()
调用示例:gl.deleteRenderbuffer(renderbuffer)
--------------------------------------------------------------------------
函数功能:删除渲染缓冲区对象
--------------------------------------------------------------------------
参数 renderbuffer 指定要删除的渲染缓冲区对象
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 无
21.5绑定渲染缓冲区gl.bindRenderbuffer()
在使用创建出的渲染缓冲区之前,还需要先将它绑定到目标上
调用示例:gl.bindRenderbuffer(target,renderbuffer)
--------------------------------------------------------------------------
函数功能:将renderbuffer指定的渲染缓冲区对象绑定在target目标上,
如果renderbuffer为null,则将已经绑定在target目标上的渲染缓冲区对象解除绑定
--------------------------------------------------------------------------
参数
target 必须为gl.RENDERBUFFER
renderbuffer 指定要绑定的渲染缓冲区对象
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.RENDERBUFFER
21.6设置渲染缓冲区尺寸gl.renderbufferStorage()
渲染缓冲区完成绑定后,就可设置它的格式、宽度、高度等,这里需要注意作为深度关联对象的渲染缓冲区,宽度和高度必须与作为颜色关联对象的纹理缓冲区一致
调用示例:gl.renderbufferStorage(target,internalforamt,width,height)
-----------------------------------------------------------------------------------
函数功能:创建并初始化渲染缓冲区的数据区
-----------------------------------------------------------------------------------
参数
target 必须为gl.RENDERBUFFER
internalforamt 指定渲染缓冲区中的数据格式,可以是以下几项参数
gl.EDPTH_COMPONENT16 表示渲染缓冲区将替代深度缓冲区
gl.STENCIL_INDEX8 表示渲染缓冲区将替代模板缓冲区
gl.RGBA4 表示渲染缓冲区将替代颜色缓冲区,RGBA四个分量各占4比特
gl.RGB5_A1 表示渲染缓冲区将替代颜色缓冲区,RGB各占5比特,A占1比特
gl.RGB565 表示渲染缓冲区将替代颜色缓冲区,RGB分别占5、6、5比特
width和height 表示渲染缓冲区的宽度和高度,以像素为单位
-----------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.RENDERBUFFER
INVALID_OPERATION target上没有绑定渲染缓冲区
21.7绑定帧缓冲区gl.bindFramebuffer()
调用示例:gl.bindFramebuffer(target,framebuffer)
--------------------------------------------------------------------------
函数功能:将framebuffer指定的帧缓冲区对象绑定在target目标上,
如果framebuffer为null,则将已经绑定在target目标上的帧缓冲区对象解除绑定
--------------------------------------------------------------------------
参数
target 必须为gl.FRAMEBUFFER
framebuffer 指定要绑定的帧缓冲区对象
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.FRAMEBUFFER
21.8纹理对象关联到帧缓冲区对象gl.framebufferTexture2D()
调用示例:gl.framebufferTexture2D(target,attachment,textarget,texture,level)
-----------------------------------------------------------------------------------------
函数功能:将texture指定的纹理对象关联到绑定在target目标上的帧缓冲区对象
-----------------------------------------------------------------------------------------
参数
target 必须为gl.FRAMEBUFFER
attachment 指定关联的类型
gl.COLOR_ATTACHMENT0 表示texture是颜色关联对象
gl.DEPTH_ATTACHMENT 表示texture是深度关联对象
textarget gl.TEXTURE_2D或gl.TEXTURE_BUVE_MAP分别代表二维纹理和立方体纹理
texture 指定关联的纹理对象
level 指定为0(在使用MIPMAP纹理时指定纹理的层级)
-----------------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.FRAMEBUFFER或者attachment或textarget的值无效
INVALID_VALUE level的值无效
INVALID_OPERATION target上没有绑定帧缓冲区
21.9将渲染缓冲区对象关联到帧缓冲区对象gl.framebufferRenderbuffer()
调用示例:gl.framebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer)
-----------------------------------------------------------------------------------------
函数功能:将renderbuffer指定的渲染缓冲区对象关联到绑定在target目标上的帧缓冲区对象
-----------------------------------------------------------------------------------------
参数
target 必须为gl.FRAMEBUFFER
attachment 指定关联的类型
gl.COLOR_ATTACHMENT0 表示renderbuffer是颜色关联对象
gl.DEPTH_ATTACHMENT 表示renderbuffer是深度关联对象
gl.STENCIL_ATTACHMENT 表示renderbuffer是模板关联对象
renderbuffertarget 必须是gl.RENDERBUFFER
renderbuffer 指定要关联的渲染缓冲区对象
-----------------------------------------------------------------------------------------
返回值 无
-----------------------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.FRAMEBUFFER或者renderbuffer不是gl.RENDERBUFFER,
或者attachment的值无效
21.10检查帧缓冲区的配置gl.checkFramebufferStatus()
调用示例:gl.checkFramebufferStatus(target)
-----------------------------------------------------------------------------------------
函数功能:检查绑定在target上的帧缓冲区对象的配置状态
-----------------------------------------------------------------------------------------
参数 target 必须为gl.FRAMEBUFFER
-----------------------------------------------------------------------------------------
返回值 0 target不是gl.FRAMEBUFFER
其他
gl.FRAMEBUFFER_COMPLETE 帧缓冲区对象已正确配置
gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT 某一个关联对象为空,或者关联对象不合法
gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS 颜色关联对象和深度关联对象尺寸不一致
gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 帧缓冲区未关联任何关联对象
-----------------------------------------------------------------------------------------
错误 INVALID_ENUM target不是gl.FRAMEBUFFER
21.11设置绘图区域gl.viewport()
在进行离线绘图前还需要做一项工作,设置绘图区域的大小
调用示例:gl.viewport(x,y,width,height)
--------------------------------------------------------------------------
函数功能:设置gl.drawArrays()和gl.drawElements()函数的绘图区域,
在canvas上绘图时,x和y就是canvas中的坐标
--------------------------------------------------------------------------
参数
x,y 指定绘图区域的左上角,以像素为单位
width,height 指定绘图区域的宽度和高度
--------------------------------------------------------------------------
返回值 无
--------------------------------------------------------------------------
错误 无
点燃火柴
关注
关注
0
点赞
踩
0
评论
7
收藏
打赏
扫一扫,分享内容
点击复制链接
专栏目录
WebGL入门(十二)-使用varying变量在顶点着色器给片元着色器传值,绘制彩色三角形
点燃火柴的博客
03-13
295
使用varying变量绘制彩色三角形1.demo效果2.相关知识点2.1varying变量介绍2.2varying变量使用步骤2.2.1顶点着色器中声明varying变量2.2.2片元着色器中使用varying变量2.2.3通过缓冲区对象给attribute变量传值3.demo代码
1.demo效果
如上图,绘制了一个顶点不同颜色的三角形。
是使用varying变量在顶点着色器给片元着色器传值绘制的图形
2.相关知识点
2.1varying变量介绍
之前已经学习了attribute变量和unif
参与评论
您还未登录,请先
登录
后发表或查看评论
webgl内置函数--矢量函数与纹理查询函数
weixin_33795743的博客
10-23
273
现在我们一起来看一下矢量函数都有那些
第一个矢量函数:bvec2lessThan(vec2x,vec2y)
此函数会逐分量的比较x
延伸文章資訊
- 1在JavaScript程序通过attribute变量向顶点着色器传值 - CSDN博客
gl.vertexAttrib3f() 方法是一系列同族函数中的一个,该系列函数的任务就是从JavaScript程序中向顶点着色器中的attribute变量传值
- 2webgl 入门(二) - 简书
在JavaScript 中使用gl.vertexAttrib3f函数对attribute 变量赋值. gl.vertexAttrib3f()函数拥有很多同族函数,比如gl.vertexAttri...
- 3opengl es - WebGL - which API to use? - Stack Overflow
gl.vertexAttrib3f only lets you supply a single constant value to a GLSL attribute so you'll need...
- 4使用attribute 變數
const gl = getGLContext(document. ... getAttribLocation(prog, 'position'); const gl_size = gl. .....
- 5egaku2d_core::gl::VertexAttrib3f - Rust - Docs.rs
API documentation for the Rust `VertexAttrib3f` mod in crate `egaku2d_core`. ... [−][src]Module e...