OpenGL 学习笔记

1.GL状态还原

GL相当于状态机,当开启一个状态需要关闭状态进行还原状态避免下个渲染状态出错导致渲染错误

2.glDrawElements 1282报错问题

这个问题找了挺久,单独绘制没问题,和C++ 3D渲染引擎一起绘制就会有时报错1282,初步判断3D渲染引擎的封装改变了GL状态,根据断点和现象分析,最后绘制是3D模型就会报错,而2D的不会。只好继续分析3D和2D的流程,才发现GL_ELEMENT_ARRAY_BUFFER被改变导致

  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
复制代码
3.GL录屏深度缓冲区问题

开启录屏后,3D模型渲染有问题,结合现象判断可能是抗锯齿或者深度问题,同样深度16依然有问题,用 GLES11Ext.GL_DEPTH_COMPONENT24_OES 深度24才解决。

 GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,       GLES11Ext.GL_DEPTH_COMPONENT24_OES, width, height);
复制代码
4.3D透明深度缓冲区

3D模型开启深度测试透明渲染有问题,可以设置当前node的TAG是否透明,根据在render的时候node的TAG判断是否需要开启glDepthMask,glDepthMask 用来判断允许或不允许写入深度缓冲区,也可以用渲染队列统一管理,避免频繁开关glDepthMask

  glDepthMask(GL_TRUE);
复制代码
5.shader UV镜像翻转

图像需要镜像翻转,shader UV进行转换一下就行了,或者通过矩阵运算也可以解决问题

  x轴镜像:1.0-vTextureCoord.x
  y轴镜像:1.0-vTextureCoord.y
复制代码
6.3D模型表情的Alpha测试(使用Discard)

3D模型的表情是带有透明的贴图,渲染出来透明的地方带颜色且半透着背景,通过现象观察,感觉不渲染透明的片段就可以了,用Discard实现Alpha测试。

    #if defined(TEXTURE_DISCARD_ALPHA)
    if (gl_FragColor.a < 0.25)
        discard;
    #endif
复制代码

上面片段着色器代码Texture是RGBA,Alpha通道用于Alpha测试。Alpha值小于0.25,就会被Discard“杀死”片段,不渲染这个片段。当然0.25不是固定值,可以根据需求更改。如果你的片段着色器没有用到defined,直接写下面代码即可

    if (gl_FragColor.a < 0.25)
        discard;
复制代码
7.透明剔除(使用blend混合)

用Discard实现Alpha剔除,旋转或者缩放发现不太稳定,而且逐像素剔除效率不高,所以推荐使用blend混合进行Alpha剔除

        blendSrc = SRC_ALPHA
        blendDst = ONE_MINUS_SRC_ALPHA
复制代码

转载于:https://juejin.im/post/5c89f6ebe51d454530230561

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值