标签归档:stage3d

基于着色器的线框图(wireframe)实现(stage3D)

概述

线框图的目的主要是为了调试模型情况,在OPENGL或者DX中,有专门的方法可以用来显示线框图,比如OPENGL可以用glDrawElements的GL_LINES用来绘制线框图,而在Stage3D中没有这样的方法,你能修改的,只有顶点着色器及片段着色器。

方案

基于着色器的绘制线框图方案可以参考SolidWireframe,但是在这个文章中使用的方案是几何着色器,但是我们木有这个着色器!!!

但是我们可以从这个文章中读到一些基本的实现思路,比如应该得到每个顶点与对应边的距离,然后再通过这个距离算出是否需要绘制颜色。虽然这个思路看起来比较简单,但是在实现中会遇到如下几个问题。

  • 如何得到这个距离,要知道,这个距离是在屏幕空间中的距离,而不是模型本地空间
  • 算出的线段显得锯齿比较明显,如何做平滑

问题一的解决思路就是在每个顶点属性缓冲区中增加一个属性——距离,另外,这个距离的值需要做屏幕空间变换(模型变换 * 摄像机变换 * 摄像机透视变换 + 齐次化 + 屏幕空间变换)。因为没有几何着色器,所以这个过程会显得比较费CPU,另外,因为模型顶点是公用的,如果需要实现这个功能,只能讲顶点变成重复,每个三角形的顶点变成不一样。

问题二的解决方案在参考文档中有详细说明,可以设置平滑函数I(x)

平滑2平滑3

实现代码

参考文献