LearnOpenGL记录一

图形学基础

深度测试

本节Reference:https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/
计算流程:深度缓冲是在片段着色器运行之后(以及模板测试(Stencil Testing)运行之后)在屏幕空间中运行的。

接口
  • glEnable(GL_DEPTH_TEST);
  • glClear(GL_DEPTH_BUFFER_BIT);
  • glDepthMask(false);
  • glDepthFunc(GL_LESS);
深度值精度问题
  • 线性变换
    在这里插入图片描述
    这不是实际的透视投影对z值的变换公式。

  • 非线性变换
    透视投影矩阵对z的变换公式
    透视投影矩阵对z的变换公式,可以根据举证变换公式推导。具体变换如下图所示,可见其接近近平面时变化较快,精度也相对较高,远平面附件则精度较低,这也符合我们希望的在较远处不需要记录太精确的深度值。
    在这里插入图片描述

深度冲突解决方法
  • 手动移动深度很接近的物体,例如给一个offset偏移;
  • 使用更高精度记录深度值,比如使用两个float记录;
  • 尽可能将近平面设置的远一些,因为近平面如果设置较近,则精度记录教精确,发生深度冲突的可能性就更大;

模板测试

接口
  • glEnable(GL_STENCIL_TEST);
  • glClear(GL_STENCIL_BUFFER_BIT);
  • glStencilMask(0x00);// 0xff
  • glStencilFunc(func:GL_LESS测试函数,ref设置用于与模板缓冲比较的值,mask掩码用于在比较之前和ref进行与运算);
  • glStencilOp((GLenum sfail, GLenum dpfail, GLenum dppass)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
用途(高亮物体轮廓)
  • 开启深度测试,关闭模板测试,正常绘制地板
  • 开启模板测试,gl_stencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);glStencilMask(0xff);glStencilFunc(GL_AlWAYS,1,0xff);绘制BOX;
  • box放大一点点,禁止模板写入(可读取)和深度测试,glStencilMask(0x00);glStencilFunc(GL_NOT_EQUAL,1,0xff);
    在这里插入图片描述
    在这里插入图片描述

面剔除

  • glEnable(GL_CULL_FACE) 开启面剔除(一般不会把视角放到物体内部的话可以开启这个,比如地球球体可以开启因为视角不会钻到地下)
  • glCullFace(GL_FRONT)默认配置,前向面剔除
  • glFrontFace(GL_CCW)默认配置,逆时针为前向面(这个和数据定义有关,一般数据准备都是逆时针顺序定义三角面片的)

混合

利用blend的普通混合
  • 将不透明物体先绘制,然后将半透明物体进行排序,按照从远到近的顺序进行逐步绘制;每次绘制时,根据colorBuffer上结果结合混合公式得到当前DrawCall的绘制结果;
  • 在这里插入图片描述
OIT(order independent transparency)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值