主场景模型用的是固定管线来渲染阴影效果,把主场景模型的一部分做了二次渲染,来实现反射效果,用的是glsl4.3的shader,运行发现二次渲染的部分总是抖动,后来分析可能是固定管线和可编程管线在这部分计算顶点的坐标有误差导致的,然后把发射效果的shader中顶点坐标计算改成了内置函数 gl_Position = ftransform();
参考:
自己执行变换的另一种方式是使用内置函数ftransform,它对需要处理的顶点模拟了固定功能管线的顶点变换。这在混合固定功能和顶点着色器绘制同一个几何图形时很有用,可以防止Z值的细微差异导致的Z-fighting。
https://my.oschina.net/sweetdark/blog/214220
gl_Position =gl_ModelViewProjectionMatrix * gl_Vertex;
能够获得和固定功能流水线相同的结果吗?理论上是如此,但实际上对顶点变换操作的顺序可能会不同。顶点变换通常在显卡中是高度优化的任务,所以有一个利用了这种优化的特定函数用来处理这个任务。这个神奇的函数如下:
vec4 ftransform();
使用这个函数的另一个原因是float数据类型的精度限制。由于数据精度的限制,当使用不同的顺序计算时,可能得到不同的结果,因此GLSL提供这个函数保证获得最佳性能的同时,还能得到与固定功能流水线相同的结果。
https://blog.csdn.net/racehorse/article/details/6638455
文章评论