2014-04-30 31 views
2

如果绘制使用冒名顶替者基于光线追踪的方法的球体,例如这里抗锯齿GLSL冒名顶替

http://www.arcsynthesis.org/gltut/Illumination/Tutorial%2013.html

您通常绘制四边形,然后使用“丢弃”跳过具有一个像素中描述距四边形中心的距离大于球体半径。

打开消除锯齿时,GLSL将消除您绘制的图元的边界 - 在本例中为四边形 - 而不是绘制和丢弃像素之间的边界。

我附上了两个屏幕截图,显示了球体和边界的爆炸。除了位于四边形上的最顶部的像素外,很明显球形边界还没有被消除锯齿。

Impostor based sphere Sphere border zoom-in

有什么诀窍,我可以使用,使冒名顶替球具有很好的防锯齿边缘?

最佳方面,

的Mads

回答

1

而不是仅仅丢弃像素,设置你的球有内,外半径。 内半径内的所有内容都是完全不透明的,外半径之外的所有内容都将被丢弃,并且介于两者之间的任何内容都将在0和1个Alpha值之间进行线性插值。

float alpha = (position - inner)/(outer - inner); 
+0

你也想混合这个来做任何事情。坦率地说,你可能只是在着色器本身中实现它......'output = mix(,alpha)'。 –

+0

谢谢。问题是,通常我有几个领域 - 所以我需要与当前的碎片颜色混合。所以与黑色混合只会在我只有一个球体的时候起作用。相反,我尝试了混合,但在这种情况下,我需要将所有球体相对于它们的视野空间Z坐标拉回前面。嗯... – repoman

1

Kneejerk反应会对你自己进行多重采样:渲染到一个纹理,例如,是实际输出的四倍,然后确保您生成mip贴图并将该纹理渲染回屏幕。

或者直接在您的着色器中做这件事,让OpenGL继续担心几何边缘:每个像素采样四条光线并对其进行平均。

+0

谢谢。我会试一试 – repoman