opengles2.0 片段shader之后的操作 备忘

本文详细介绍了OpenGL ES中的渲染管线流程,包括剪刀测试、模板测试、深度测试等阶段,并阐述了颜色缓存、深度缓存及模板缓存的作用及配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各种测试的顺序:
 
    剪刀测试-模板测试-深度测试-混合-抖动


opengles支持三种帧缓存,颜色,深度,模板缓存。

    颜色缓存一个有16位的RGB565和32位的RGBA,颜色缓存有前后缓存

    模板缓存是可选的,要么集成在深度缓存里面

    深度缓存至少16为,至少8为被模板缓存。


 缓存的clear:
 
     void glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

     void glClearColor(red,green,blue,alpha);
     void glClearDepthf(depth);
     void glClearStencil(GLint S);

     void glColorMask(BOOL red,bool green, bool blue, bool alpha);

        控制是否能写入这些颜色组件。

     void glDepthMask(bool depth);
     void glStencilMask(GLuint mask);这是一个bitmask,为1的位能写入。
     void glStencilMaskSeparate(GLenum face,GLuint mask);

       face 取值为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK.

 各种测试的开启:
 
     glEnbale();
     GL_DEPTH_TEST,GL_STENCIL_TEST, GL_BLEND, GL_DITHER, GL_SAMPLE_COVARAGE,
     GL_SAMPLE_ALPHA_TO_COVARAGE,
   
      GL_SCISSOR_TEST

  剪刀测试:
      glScissor(GLint x,GLint y,GLsizei width,GLsizei height);指定的是在视口里面的坐标

  模板测试:
      这个分为两步进行,第一步,给模板缓存填充值,就是在渲染几何物体的时候进行的,需要知道模板
      缓存中的值如何被写入,第二步,就是通过这些模板缓存中的值,控制颜色缓存的写入。
      模板测试是一种位测试,

      在程序开始的时候glClearStencil指定clear值,然后glClear清除模板缓存,这样模板缓存就有个
      初始值了。然后使用:
    
      void glStencilFunc(GLenum func,GLint ref,GLuint mask);
         func:设置比较函数

             GL_EQUAL,GL_NOTEQUAL,GL_LESS,GL_GREATER,

             GL_LEQUAL,GL_GEQUAL,GL_ALWAYS,
             GL_NEVER.
    ref:设置做比较的值。
    mask:将这个值和模板缓冲中的值做位与操作,在拿结果在与ref做比较。
   
    模板缓存中的值与mask按位与之后与ref比较,若符合func指定的比较函数,则模板测试通过。

    还可以有个机会更新模板缓存中的值。怎么更新模板缓存中的值呢?
    有三种情况:
   
        第一模板测试失败,后面的片段操作都不进行了,可以更新模板缓存。

        第二,模板测试通过,但深度测试没有通过,可以更新模板缓存。
 
        第三,模板测试和深度测试都通过了,可以更新模板缓存

        这三种情况怎么更新模板缓存,通过一个函数glStencilOp设置。
 
        glStencilOp(GLenum sfail,GLenum zfail,GLenum zpass);
        这三个枚举的取值为这些:
         GL_KEEP,保持不变
         GL_ZERO,设置为0,
         GL_REPLACE, 使用ref替换
         GL_INCR, 使模板缓存中的值加1,值clamp到0-2^n次方
         GL_DECR, 减1
         GL_INCR_WRAP 同上面的一样,只是值到最大的时候加1的话回到0.
         GL_DECR_WRAP,
         GL_INVERT. 对模板缓存中的值位取反。

        sfail:表示模板测试失败之后,怎么更新模板缓存中的值

        zfail:表示模板测试通过,深度测试失败时怎么更新模板缓存中的值。
 

        zpass:表示 模板测试和深度测试都通过之后怎么设置模板缓存中的值。


  深度测试:
  
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GLenum func);
      GL_GREATER,GL_LEQUAL,GL_GEQUAL,GL_EQUAL,GL_NOTEQUAL,GL_ALWAYS,GL_NEVER。


  混合:
  
      glEnable(GL_BLEND);
      混合公式:
          最后的颜色值=源因子*到来的颜色 OP  目的因子*在颜色缓存的值。

      源因子和目的因子有一个函数指定:
          glBlendFunc(GLenum sfactor,GLenum dfactor);
 
       可以取这些值:
       GL_ZERO
       GL_ONE
       GL_SRC_COLOR
       GL_ONE_MINUS_SRC_COLOR
       GL_SRC_ALPHA
       GL_ONE_MINUS_SRC_ALPHA
       GL_DST_COLOR
       GL_ONE_MINUS_DST_COLOR
       GL_DST_ALPHA
       GL_ONE_MINUS_DST_ALPHA
       GL_CONSTANT_COLOR
       GL_ONE_MINUS_CONSTANT_COLOR
       GL_SRC_ALPHA_SATURATE   MIN(As,1-Ad) alpha取1.
   
    这里有个GL_CONSTANT_COLOR,使用函数void glBlendColor(r,g,b,a);来指定。

    OP使用这个函数来指定:
 
       glBlendEquation(GLenum mode);
       GL_FUNC_ADD,
       GL_FUNC_SUBTRACT,
       GL_FUNC_REVERSE_SUBTRACT. 这个取GL_FUNC_SUBTRACT结果的相反数。

 

  抖动:
      这个只有开启和关闭的函数,具体用的什么算法,依赖于设备。

 


  读取颜色缓存中的值到内存:
  
      void glReadPixels(x,y,width,height,format,type,void* pixels);
 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值