OpenGL 天空盒Skybox实现 天空盒显示不全(天空盒部分被截断)

问题:

在实现OpenGL的天空盒的时候,Shader和顶点数据都保证了正确的前提下,渲染出来的画面总是无法显示完整,会有一部分没有像素颜色而显示的是glClearColor设置的颜色。旋转、贴图采样、view矩阵均正确。由于不好描述,所以也不方便查搜索问题,故而记录一下排查的过程。

在这里插入图片描述
在这里插入图片描述

排查过程

  1. 确定输入的顶点数据正确:在采样结果正确的情况下,部分顶点画面没有被采样出来,首先考虑到的就是节点数据错了,导致在顶点Shader处理的时候,部分顶点绘制错误,所以我先用了线框模式,确认顶点的绘制是不是有问题,结果如下:
    在这里插入图片描述
    这样的图明显是有问题的,正常来说进过VP转换后,矩形线框并不会出现这样的形状,所以怀疑是顶点数据都问题。因为我自己封装过一个顶点数据处理类,所以怀疑是处理过程出错了。
    但是,使用同样的数据去使用图中“木箱”的Shader时,结果是正确的,能够绘制出正确的形状,所以基本排除是顶点数据的问题。
  2. 确定Vert和Frag的Shader的传值都正确:确定不是Frag的问题很容易,首先图是采样正确了的(至少在看得见的部分是这样),然后我只让Frag输出固定的纯色,结果也是只能显示采样出来的部分,所以基本排除是Frag的问题。那么问题只可能是Vert的问题了,没其他地方在干扰顶点的绘制了。
  3. 排查Vert Shader的传入:天空盒的Shader是没有传入model矩阵的,只传入了View和Projection矩阵,我首先加上了一个model矩阵,确认了我的运算没有问题,能够正确绘制物体,那么到此问题就很模糊了,因为同样的矩阵数据,同样的Shader在绘制有和没有model物体的时候绘制的结果确是不同的。而天空盒本就不该和model关联
  4. 创建一个正常的盒子,进入内部观察:因为天空盒也是一个盒子,所以我创建一个盒子进入其内部观察也应该是一样的效果,于是我用skybox的顶点数据创建了一个正常的盒子,然后将镜头移动到内部进行观察。发现在未进入内部的时候表现正常,进入内部后,开始出现和天空盒类似的情况,用线框模式发现确实会有顶点绘制线被截断的情况,就像是Unity里面镜头和模型太靠近时候的现象,所以再次确定方向,排查view和projection
  5. 再次检查view和projection矩阵的传入:最后问题的方向还是只能去看view和Projection是不是在某个阶段传值错了。和标准答案对比了一下发现,projection的near近平面的值,我设置的是1,而标准答案是0.1,至此恍然大悟,因为近平面关系,导致部分内容被裁剪了,和我观察到的现象一直,修改了近平面的值后,结果正确
    在这里插入图片描述

在这里插入图片描述

总结

在绘制天空盒的时候,projection计算的时候,使用的近平面的值不能太大

猜你喜欢

转载自blog.csdn.net/qq_37421018/article/details/126159289