OpenGL ES 2.0编程基础

本人在学WebGL,WebGL的资料很少,由于WebGL是OpenGL ES 2.0的子集,所以先学习一下OpenGL ES 2.0的基础知识。OpenGL中既有固定管线处理流程,也可以使用shader进行可编程的管线处理,OpenGL ES 2.0是完全可编程的管线流程,而没有固定管线流程,这给我们增加了更多的灵活度,以前可以让OpenGL替我们做的事情,现在必须要我们在shader中自己去实现,这可以使我们更深入的理解OpenGL ES 2.0图形绘图流程。

本文参考了http://blog.youkuaiyun.com/racehorse/article/details/6593719


1.OpenGL中的图形处理固定管线流程:


现在的显卡允许程序员自己编程实现上述流水线中的两个阶段:

·顶点shader实现顶点变换阶段的功能

·片断shader替代片断纹理化和色彩化的功能


2.OpenGL ES 2.0中的可编程管线流程:



3.顶点着色器:



4.片段着色器:


5.Shader开发流程:

        a.编写vertex Shader和fragment shader源码。

        b.创建两个shader 实例:GLuint glCreateShader(GLenum type); [gl.createShader]

        c.给Shader实例指定源码。 glShaderSource [gl.shaderSource]

        d.编译shaer源码 void glCompileShader(GLuint shader) [gl.compileShader]

        e.创建shader program -- GLuint glCreateProgram(void) [gl.createProgram] 

        f.绑定shader到program 。 void glAttachShader(GLuint program, GLuint shader)。每个program必须绑定一个vertex shader 和一个fragment shader。 [gl.attachShader]         g.链接program 。 void glLinkProgram(GLuint program) [gl.linkProgram]

        h.使用porgram 。 void glUseProgram(GLuint program) [gl.useProgram]

        i.* 对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。


6.Uniforms变量:

Uniform变量是OpenGL ES着色器语言中的一种变量类型修饰符。Uniform变量用来存储只读值,这些值通过OpenGL ES 2.0 API传递给着色器。Uniforms常用于存储着色器需要的各种数据,比如变换矩阵、光线参数以及颜色等。输入着色器的常量参数(顶点或者片段)应该被作为Uniform类型传入进去。

  如果顶点着色器和片段着色器被连接到同一个program对象中,它们会分享相同的uniform变量。因此,如果一个Uniform变量在顶点着色器中声明了,并且也在片段着色器中声明了,那么二者的声明必须匹配。当应用程序通过API装载uniform变量时,其值在顶点着色器和片段着色器中均可获得。 Uniform变量常用于在硬件中进行“常量存储”。


7.Attributes变量:

Attribute变量只能够在顶点着色器中使用,用于逐个指定到顶点着色器的输入。Attributes典型的用来存储位置、法线、纹理坐标和颜色。理解的关键在于attributes存储着每个顶点绘制所需要的数据。下面这个例子中,a_position是位置属性,a_texCoord0是纹理坐标属性。

uniform mat4 m_matModelViewProjection;

attribute vec4 a_position;//position attribute

attribute vec4 a_texCoord0;//texture coordinate attribute

varying vec2 v_texCoord;

 

void main(void)

{

    gl_Position =matViewProjection* position;

    v_texCoord =  a_texCoord0;

}

注:gl_Position是内置的变量。


8.Varyings变量:

Varyings变量用来存储顶点着色器的输出,并且也是片段着色器的输入。每个顶点着色器输出需要传递给片段着色器的的数据,这些数据用一个或多个varying变量来声明。这些变量也同时在片段着色器中声明(有着相同的类型),并且在基元的光栅化过程中会进行线性插值。其声明如下所示:

varying vec2 texCoord;

varying vec4 color;

必须在顶点着色器和片段着色器中同时声明varying,且其声明必须完全相同。



9.给shader中的uniform赋值:

uniform vec3 uAmbientColor;这样给uAmbientColor赋值:

ambientColorLocation = gl.getUniformLocation(shaderProgram,"uAmbientColor");

gl.uniform3f( ambientColorLocation, 1.0,1.0,1.0 );

 

uniform bool uUseLighting;这样给uUseLighting赋值:

useLightingLocation = gl.getUniformLocation(shaderProgram,"uUseLighting");

gl.uniform1i(useLightingLocation,要赋值的布尔值);

 

uniform float uAlpha;赋值用到的是

alphaLocation = gl.getUniformLocation(shader, "uAlpha");

gl.uniform1f(alphaLocation,0.7);

 

uniform mat4 mv;这样给mat4赋值:

mvLocation = gl.getUniformLocation(shaderProgram, "mv");

gl.uniformMatrix4fv(mvLocation,false, new Float32Array([…]);

 

总结:uniform赋值时,先从shader中根据uniform变量的名称通过gl.getUniformLocation(shaderName,"uniformName")获取其地址,然后根据地址通过gl.uniform*(…)对其进行赋值。


10.给shader中的attribute赋值:

attribute vec3 position;

var positionLocation = gl.getAttribLocation(shader,"position");

gl.enableVertexAttribArray(positionLocation);

//////////////////////////////////////////////////////////////////

var positionBuffer = gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);

gl.bufferData(gl.ARRAY_BUFFER,newFloat32Array([…]), gl.STATIC_DRAW);

gl.vertexAttribPointer(positionLocation,3, gl.FLOAT, false, 0, 0);

 

与uniform赋值不同,对attribute进行赋值时,在initShaders时,首先要通过gl.getAttribLocation(shader,"attributeName")获取attribute变量的地址,然后通过调用gl.enableVertexAtribArray(attributeLocation)来启用该attribute变量。上面的操作只需要调用一次即可。然后在循环drawScene的时候,每次都要通过gl.bindBuffer和gl.bufferData给指定的buffer赋值,然后调用gl.vertexAttribPointer(attributeLocation,…)对shader中的attribute变量进行赋值。


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值