我今天在制作一个OpenGL应用程序,它将对网格进行镶嵌并应用镜头畸变。目标是能够为各种不同的镜头展现广角拍摄。到目前为止,我的着色器已经正确地应用了畸变,但我一直在处理我想要的方式来控制镶嵌的问题。目前,我的镶嵌控制着色器只是将单个三角形分成一组更小的三角形,然后在镶嵌评估着色器中应用镜头畸变。
我使用这种方法的问题在于,当场景中有非常大的三角形时,它们往往需要更多的扭曲。这意味着它们需要被更多地镶嵌以确保好的效果。不幸的是,我不能在顶点着色器或镶嵌控制着色器中计算三角形的大小(在屏幕空间中),但我需要在镶嵌控制着色器中定义镶嵌量。
那么,我的问题是,在OpenGL可编程管道中有没有办法获得整个基元,并计算一些指标,然后使用该信息来控制镶嵌?
以下是一些示例图像以便更好地理解此问题...
图1(上图):每个红色或绿色正方形最初都是2个三角形,此示例看起来很好,因为三角形很小。
图2(上图):每个红色或绿色区域最初都是2个三角形,此示例看起来很糟糕,因为三角形很大。
图3(上图):另一个具有小三角形但网格要大得多的示例。请注意边缘上的曲线程度。仍然在镶嵌级别为4时看起来很好。
图4(上图):另一个具有大三角形的示例,仅显示中心4列,因为如果存在更多列,则图像就不可理解了。这说明非常大的三角形无法很好地进行镶嵌。如果我将镶嵌设置得非常高,则会出现不错的效果。但是这样会在更小的三角形上执行大量的镶嵌。
我使用这种方法的问题在于,当场景中有非常大的三角形时,它们往往需要更多的扭曲。这意味着它们需要被更多地镶嵌以确保好的效果。不幸的是,我不能在顶点着色器或镶嵌控制着色器中计算三角形的大小(在屏幕空间中),但我需要在镶嵌控制着色器中定义镶嵌量。
那么,我的问题是,在OpenGL可编程管道中有没有办法获得整个基元,并计算一些指标,然后使用该信息来控制镶嵌?
以下是一些示例图像以便更好地理解此问题...
图1(上图):每个红色或绿色正方形最初都是2个三角形,此示例看起来很好,因为三角形很小。
图2(上图):每个红色或绿色区域最初都是2个三角形,此示例看起来很糟糕,因为三角形很大。
图3(上图):另一个具有小三角形但网格要大得多的示例。请注意边缘上的曲线程度。仍然在镶嵌级别为4时看起来很好。
图4(上图):另一个具有大三角形的示例,仅显示中心4列,因为如果存在更多列,则图像就不可理解了。这说明非常大的三角形无法很好地进行镶嵌。如果我将镶嵌设置得非常高,则会出现不错的效果。但是这样会在更小的三角形上执行大量的镶嵌。
z
坐标?通常情况下,距离更远的补丁需要更少的细分,而更接近的补丁需要更多的细分。这通常是为了提高性能(避免在远程补丁上出现亚像素三角形),但它也有益于图像质量。 - Andon M. Coleman