OpenGL2.0 和 OpenGL3.0 的不同与共同点

来源:互联网 发布:7z解压软件for mac 编辑:程序博客网 时间:2024/05/18 19:40


OpenGL2.0 OpenGL3.0 的不同与共同点


OpenGL2.0vertex shader 可以不指定 version 如果不指定 version 对于iOS来说 默认认为是OpenGL2.0  OpenGL2.0中不能使用 in out inout 关键字 in out inout 关键字 OpenGL3.0中的关键字

但是对于要使用  

OpenGL3.0fragment shader中的vec4必须要指定 精度否则就会报错

报的错误为:ERROR: 0:8: 'vec4' : declaration must include a precision qualifier for type


iOS android

shader中使用

#version 300 es 指定使用OpenGL3.0

#version 100 es 指定使用OpenGL2.0 (不指定version 默认为OpenGL2.0)


如果shader文件没有声明版本,则会认为它使用的是OpenGL ES 2.0shader版本1.0。为了使版本号相匹配,OpenGL ES 3.0shader版本直接从1.0跳到了3.0


GLSL ES 3.0删除gl_FragDatagl_FragColor内置片段输出变量。而是使用out限定符声明自己的片段输出变量。


顶点缓冲区对象VBO与顶点数组对象VAO

VBO可以将顶点数据保存在显存中,绘制时直接从显存中取数据,减少了数据传输的开销。

通过VBO我们可以将顶点属性数据保存在显存中,当绘制时问题又来了,需要调用好几个函数,过程挺复杂的。为了解决这个问题,OpenGL又引入了VAO(Vertex Array Object)来关联VBO中的数据VAO详解),有了VAO,任何数组形式的GL函数调用都会添加到VAO的绘制列表当中(直到解除VAO绑定),当需要绘制的时候,我们仅需要重新绑定VAO,那么之前创建的绘制列表将会重新激活,使得绘制代码更加简洁。


glDrawArrays

glDrawElements


 默认精度修饰符 precision 解释


默认精度修饰符

         precision precision-qualifier type;

         precision可以用来确定默认精度修饰符。type可以是intfloat或采样器类型,precision-qualifier可以是lowp, mediump, 或者highp。任何其他类型和修饰符都会引起错误。如果typefloat类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的浮点数声明(标量,向量,矩阵)。如果typeint类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的整型数声明(标量,向量)。包括全局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将使用和它最近的precision语句中的精度。


         在顶点语言中有如下预定义的全局默认精度语句:

precision highp float;

precision highp int;

precision lowp sampler2D;

precision lowp samplerCube;


         在片元语言中有如下预定义的全局默认精度语句:

precision mediump int;

precision lowp sampler2D;

precision lowp samplerCube;

         片元语言没有默认的浮点数精度修饰符。因此,对于浮点数,浮点数向量和矩阵变量声明,要么声明必须包含一个精度修饰符,要不默认的精度修饰符在之前已经被声明过了。


修饰顺序

        当需要使用多个修饰时,它们必须遵循严格的顺序:

(1)invariant-qualifier   storage-qualifier   precision-qualifier

(2)storage-qualifier    parameter-qualifier    precision-qualifier



参考内容:

http://www.xuebuyuan.com/1980605.html

原创粉丝点击