首页 > 编程知识 正文

如何确定执行opengl的显卡,和平精英opengl和vulkan

时间:2023-05-06 11:20:55 阅读:62679 作者:3056

ZERO,版本支持(Android )EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,其主要角色:

与设备的本地窗口系统通信;

查询工程图曲面的可用类型和设定;

创建绘图曲面;

在OpenGL ES和其他图形渲染API之间同步渲染;

管理渲染资源,如纹理贴图。

OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异(Apple 提供了自己的 EGL API 的 iOS 实现,自称 EAGL)。

EGL10-

EGL11-

egl14-egl1.4中定义的规格-实施-Android4.2(API17 )

EGL15-EGL新规范的补充

OpenGL ES的当前主版本是1.0/1.1/2.0/3.0/3.1。 这些版本的主要情况如下。

OpenGL ES1.0 -基于OpenGL 1.3,OpenGL ES1.1基于OpenGL 1.5。 Android1.0及更高版本支持此API规范。 OpenGL ES 1.x适用于固定硬件管道。 OpenGL es 2.0 -基于OpenGL 2.0,与OpenGL ES 1.x不兼容。 Android2.2(API8)和更高版本支持此API规范。 OpenGL ES 2.x面向可编程硬件管道。 OpenGL ES3.0 -的技术特性几乎完全来自OpenGL 3.x,与OpenGL ES 2.x向后兼容。 Android4.3(API18 )及更高版本支持此API规范。 OpenGL ES3.1 -基本上属于OpenGL 4.x的子集,并与OpenGL ES3.0/2.0向后兼容。 Android5.0(API21 )和更高版本支持此API规范。 OpenGL和OpenGL ES官网1,基本数据类型

1 void函数没有返回值,必须声明为void。 没有默认的函数返回值。 关键字void不能用于其他声明,空参数列表除外。

2 bool布尔值。 只有两个值为true或false。

bool success,done=false;

3 int整数型主要承担编程援助的作用。 在硬件级别,正整数有助于有效地实现循环、数组索引和纹理单元索引。 但是,着色语言不需要将整数映射到硬件级整数。 我们不赞成底层硬件充分支持广泛的整数操作。 OpenGL ES着色语言将整数转换为浮点数进行操作。 整数可以是从0开始的十进制、八进制、十六进制或0x开始的数字。

int i,j=42;

4浮点型用于广泛的标量计算。 浮点数可以定义为:

浮动a,b=1.5;

5 Vector OpenGL ES着色语言包含通用表示形式,如2--、3--、4-浮点数、整数和布尔向量。 浮点向量存储各种有用的图形数据,包括颜色、位置和纹理坐标。

vec2 texCoord1,texCoord2;

VEC3位置;

vec4 rgba;

ivec 2纹理查找;

bvec3 lessThan;

的初始化工作可以在构造函数中完成。

6矩阵是计算机图形学中另一种非常有用的数据类型,OpenGL ES着色语言支持2*2、3*3和4*4浮点矩阵。

mat2 mat2D; 2x2

mat3opt矩阵; 3x3

mat 4视图,项目; 4x4

矩阵初始化工作可以在构造函数中完成。

7采样器类型(例如sampler2D )实际上是纹理的不透明句柄。 使用内置的纹理函数指定要访问的纹理。 它们只能声明为函数参数或统一格式。 除了纹理查找函数的参数、数组索引、结构字段选择和括号之外,采样器不能显示在表达式中。 取样器既不能用作左值,也不能用作函数的out或inout参数。 这些限制也适用于包含采样器的结构。 对于统一格式,由OpenGL ES API初始化。 只有匹配的采样器类型作为函数参数传递。 这样可以在执行着色器之前对着色器纹理访问和OpenGL ES纹理状态进行一致性检查。

二.记忆修饰符

>

1 const

任何使用const声明的变量在其所属的着色器中均是只读的。

2 attribute

 attribute修饰符用于声明通过OpenGL ES应用程序传递到顶点着色器中的变量值。在其它任何非顶点着色器的着色器中声明attribute变量是错误的。在顶点着色器被程序使用之前,attribute变量是只读的。attribute变量的值通过OpenGL ES顶点API或者作为顶点数组的一部分被传进顶点着色器。它们传递顶点属性值到顶点着色器,并且在每一个运行的顶点着色器中都会改变。attribute修饰符只能修饰float, vec2, vec3, vec4,mat2,mat3,mat4。attribute变量不能声明为数组或结构体。

3 uniform

uniform修饰符用来修饰那些在整个图元被处理的过程中保持不变的全局变量。所有的uniform变量都是只读的,可以通过应用程序调用API命令初始化,或者通过OpenGL ES间接初始化。

4 varying

 varying变量提供了顶点着色器,片元着色器和二者通讯控制模块之间的接口。顶点着色器计算每个顶点的值(如颜色,纹理坐标等)并将它们写到varying变量中。顶点着色器也会从varying变量中读值,获取和它写入相同的值。如果从顶点着色器中读取一个尚未被写入的varying变量,将返回未定义值。

        通过定义,每个顶点的varying变量以一种透视校正的方式被插入到正在渲染的图元上。如果是单采样,插值为片元中心。如果是多采样,插值可以是像素中的任何地方,包括片元中心或者其中一个片元采样。

        片元着色器会读取varying变量的值,并且被读取的值将会作为插值器,作为图元中片元位置的一个功能信息。varying变量对于片元着色器来说是只读的。

        在顶点和片元着色器中都有声明的同名varying变量的类型必须匹配,否则将引起链接错误。

三 参数修饰符

 函数参数修饰符有如下几种:

(1)<none: default>,默认情况下,是in

(2)in,作为函数的传入参数

(3)out,作为函数的传出参数

(4)inout,即作为传入参数,又作为传出参数

四 精度修饰符

任何浮点数或者整数声明前面都可以添加如下精度修饰符:

以下是精度修饰符要求的最低范围和精度:

   Floating Point Magnitude Range是非零值量级的范围。对于Floating Point Precision,relative意思是任何度量的值的精度都是相对于这个值的。对于所有的精度级别,0必须被精确的表示出来。任何不能提供着色器存储变量所声明的精度的实现都会引起一个编译或链接错误。

        对于高精度和中级精度,整型范围必须可以准确地转化成相应的相同精度修饰符所表示的float型。这样的话,highp int 可以被转换成highp float, mediump int 可以被转换成mediump float,但是lowp int 不能转换成相应的lowp float。

        顶点语言要求编译和链接任何lowp, mediump和highp应用都不能出现错误。

        片元语言要求编译和链接任何lowp, mediump应用都不能出现错误。但是highp支持是可选的。

        字符常量和布尔型没有精度修饰符.当浮点数和整数构造器不含带有精度修饰符的参数时也不需要精度修饰符。

        在这段文档中,操作包含运算符,内建函数和构造器,操作数包含函数参数和构造器参数。

        对于精度没有定义的常量表达式或子表达式,评估的精度结果是所有操作数中的最高精度(mediump或者highp) 。带评估的常量表达式必须是固定不变的,并且在编译期进行。

        另外,对于没有精度修饰符的操作数,精度将来自于其他操作数。如果所有的操作数都没有精度,那么接着看使用计算结果的其他表达式。这个操作是递归的,直到找到一个有精度的操作符为止。如果必要,这个操作也包含赋值运算的左值,初始化声明的变量,函数形参,函数返回值.如果这样依然不能决定精度,如果组成表达式的所有操作数都没有精度,如果结果没有被赋值,也没有当作参数传进函数,那么将使用默认或更大的类型.当这种情况出现在片元着色器中,默认的精度必须被定义.

五 默认精度修饰符 precision

precision precision-qualifier type;

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

六 不变体

在着色器中变体是允许的.如果要避免变体,可以使用invariant修饰符或invariant pragma

七 修饰顺序

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

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

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

八 内建变量

在着色器中我们一般都会声明变量来在程序中使用,但是着色器中还有一些特殊的变量,不声明也可以使用。这些变量叫做内建变量。內建变量,相当于着色器硬件的输入和输出点,使用者利用这些输入点输入之后,就会看到屏幕上的输出。通过输出点可以知道输出的某些数据内容。当然,实际上肯定不会这样简单,这么说只是为了帮助理解。在顶点着色器中的内建变量和片元着色器的内建变量是不相同的。着色器中的内建变量有很多,在此,我们只列出最常用的集中内建变量。

(1) 顶点着色器的内建变量

输入变量:

gl_Position:顶点坐标

gl_PointSize:点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。

(2)片段着色器的内建变量

输入变量:

gl_FragCoord:当前片元相对窗口位置所处的坐标。

gl_FragFacing:bool型,表示是否为属于光栅化生成此片元的对应图元的正面。

输出变量:

gl_FragColor:当前片元颜色

gl_FragData:vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。

九.常见的内置函数

radians(x):角度转弧度degrees(x):弧度转角度sin(x):正弦函数,传入值为弧度。相同的还有cos余弦函数、tan正切函数、asin反正弦、acos反余弦、atan反正切pow(x,y):xyxyexp(x):exexexp2(x):2x2xlog(x):logexlogexlog2(x):log2xlog2xsqrt(x):x−−√xinversesqr(x):1x−−√1xabs(x):取x的绝对值sign(x):x>0返回1.0,x<0返回-1.0,否则返回0.0ceil(x):返回大于或者等于x的整数floor(x):返回小于或者等于x的整数fract(x):返回x-floor(x)的值mod(x,y):取模(求余)min(x,y):获取xy中小的那个max(x,y):获取xy中大的那个mix(x,y,a):返回x∗(1−a)+y∗ax∗(1−a)+y∗astep(x,a):x< a返回0.0,否则返回1.0smoothstep(x,y,a):a < x返回0.0,a>y返回1.0,否则返回0.0-1.0之间平滑的Hermite插值。dFdx(p):p在x方向上的偏导数dFdy(p):p在y方向上的偏导数fwidth(p):p在x和y方向上的偏导数的绝对值之和

十.几何函数

length(x):计算向量x的长度distance(x,y):返回向量xy之间的距离dot(x,y):返回向量xy的点积cross(x,y):返回向量xy的差积normalize(x):返回与x向量方向相同,长度为1的向量

十一.矩阵函数

matrixCompMult(x,y):将矩阵相乘lessThan(x,y):返回向量xy的各个分量执行x< y的结果,类似的有greaterThan,equal,notEquallessThanEqual(x,y):返回向量xy的各个分量执行x<= y的结果,类似的有类似的有greaterThanEqualany(bvec x):x有一个元素为true,则为trueall(bvec x):x所有元素为true,则返回true,否则返回falsenot(bvec x):x所有分量执行逻辑非运算

十二.纹理采样函数

纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。

texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样Lod后缀,只适用于顶点着色器采样Proj表示纹理坐标st会除以q

纹理采样函数中,3D在OpenGLES2.0并不是绝对支持。我们再次暂时不管3D纹理采样函数。重点只对texture2D函数进行说明。texture2D拥有三个参数,第一个参数表示纹理采样器。第二个参数表示纹理坐标,可以是二维、三维、或者四维。第三个参数加入后只能在片元着色器中调用,且只对采样器为mipmap类型纹理时有效。

绘制方法。重点

OpenGL ES官方wiki

1.glDrawArrays

glDrawArrays有3个参数

void glDrawArrays(

int mode,

int first,

int count

)

第一个就是绘图的类型:

1.GL_TRIANGLES:每三个顶之间绘制三角形,之间不连接

2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角形

3.GL_TRIANGLE_STRIP:顺序在每三个顶点之间均绘制三角形。这个方法可以保证从相同的方向上所有三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形

参数2:从数组缓存中的哪一位开始绘制,一般都定义为0

参数3:顶点的数量

第一个三角形是逆时针第二个是顺时针,如果第二个是逆时针有时候可以画出总之很容易出问题,同glDrawElements一样。

glDrawElements 有四个参数,

void glDrawElements(

int mode,

int count,

int type,

java.nio.Buffer indices

)

第一个参数是点的类型,第二个参数是点的个数,第三个是第四个参数的类型,第四个参数是点的存储绘制顺序。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。