openGLES3.0基本概念

17 篇文章 3 订阅
本文介绍了OpenGL ES着色语言的基础知识,包括版本声明、着色器限定符、统一变量、布局限定符和差值限定符。重点讲解了统一变量的使用和内存布局,以及平滑着色和平面着色的区别。通过实例展示了不同的着色效果,并提供了源码示例。
摘要由CSDN通过智能技术生成

前言

           学习openGL已经有一段时间了,断断续续大概2年左右,发现有些概念还是没有搞清楚,下面记录一下,有空的时候时不时的回顾一下,免得忘记,哎。。。。。。上年纪了,记性越来越差了。

openGLES着色语言

         1.  #version 300 es

        声明着色器版本号,目前官网是3.2

     openGLES官网地址

        2. 着色器语言限定符:函数参数限定符

            in :没有指定时的默认限定符,这个限定符指定参数按值传递,函数不能修改

            out :表示该变量的值不被传入函数,但是在函数返回时将被修改

            inou:规定变量按照引用传入函数,如果该值被修改,他将在函数退出后变化

    例子:

vec4 myFunc(inout float myFloat, // inout parameter
out vec4 myVec4, // out parameter
mat4 myMat4); // in parameter (default)

 3. 统一变量(uniform)

    openGLES着色语言中的变量类型限定符之一是统一变量。统一变量存储应用程序通过openGLES3.0 API 传入着色器的只读值,对于保存着色器所需的所有数据类型(如变化矩阵、照明参数和颜色)都很有用。本质上,一个着色器的任何参数在所有定点或片段中都应该以统一变量的形式传入。在编译时已知值的变量应该是常量,而不是统一变量,这样可以提高效率。

还要注意:统一变量的命名空间在定点着色器和片元着色器中都是共享的。也就是说,如果定点着色器好片元着色器一起链接到一个程序对象,他们就会共享同一组统一变量。因此,如果在定点着色器和片元着色器都声明一个统一变量,那么两个声明必须匹配。应用程序通过API加载统一变量时,他的值在定点着色器和片元着色器中都可用。

统一变量通常保存在硬件中,这个区域被称作“常量存储”,是硬件中为存储常量值而分配的特殊空间。因为常量存储的大小一般是固定的,所以程序中可以使用的统一变量数量受到限制,可以通过函数glGetIntegerv查询。

 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &testNumber);	//testNumber=1024
 glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &testNumber); //testNumber=1024
 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &testNumber);			//testNumber=16
 glGetIntegerv(GL_MAX_VERTEX_OUTPUT_COMPONENTS, &testNumber); //testNumber=128

4. 布局限定符(layout)

一些可选的布局限定符可用于指定支持统一变量块的统一缓冲区对象在内存中的布局方式。布局限定符可以提供给单独的统一变量块,或者用于所有统一变量块。在全局作用域内,为所以统一变量块设置默认布局的方法如下:

layout(shared, column_major) uniform; // default if not
// specified
layout(packed, row_major) uniform;
layout(std140) uniform TransformBlock
{
    mat4 matViewProj;
    layout(row_major) mat3 matNormal;
    mat3 matTexGen;
};

 shared : shared限定符指定多个着色器或者多个程序中统一变量块的内存布局相同。

                 要使用这个限定符,不同定义中row_major/column_major值必须相等。覆盖std140和                     packed(默认)。

packed :packed限定符指定编译器可以优化统一变量块的内存布局。使用这个限定符时必须查询                 偏移量位置,而统一变量块无法在定点/片元着色器或者程序间共享。覆盖std140和                         shared。

std140:std140布局限定符指定统一变量块的不均基于openGLES3.0规范的“标准统一变量布局”                  一节中定义的一组标准规则。覆盖shared和packed。

row_major:矩阵在内存中以行优先顺序布局。

column_major:矩阵在内存中以列优先顺序布局(默认)。

   5. 差值限定符

      平滑着色(smooth):在没有指定限定符时,默认的差值行为是执行平滑着色。也就是说,来自顶点着色器的输出变量在图元中线性差值。片段着色器接收线性插值之后的数值作为输入。我们可以明确地请求平滑着色,而不是依赖默认行为。

// ...Vertex shader...
// Vertex shader output
smooth out vec3 v_color;
// ...Fragment shader...
// Input from vertex shader
smooth in vec3 v_color;

平滑着色效果:

平面着色效果:

平面着色(flat):

      在平面着色中,图元中的值没有进行插值,而是将其中一个顶点视为驱动顶点(Provoking Vertex,取决于图元类型),该顶点的值被用于图元中的所有片段。

6. 质心采样限定符(centroid sampling)

    本质上,使用多重采样渲染时,centroid关键字可用于强制插值发生在被渲染图元内部(否则,在图元的边缘可能产生伪像)。

// ...Vertex shader...
// Vertex shader output
smooth centroid out vec3 v_color;
// ...Fragment shader...
// Input from vertex shader
smooth centroid in vec3 v_color;

源码例子工程

string recipe = argv[2];//1:平行光   把2改成1~6几个数字,看效果变化

先看下效果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值