Opengl es 什么是OpenGL中的插值?

Opengl es 什么是OpenGL中的插值?,opengl-es,Opengl Es,我刚刚开始学习OpenGL ES 2.0,在学习过程中,我遇到了一些对我来说没有意义的术语,即使有定义。像这样:插值 在《OpenGL ES 2.0编程指南》一书中,我看到了插值的定义: 用于根据指定给基元每个顶点的不同值为每个片段生成不同值的机制称为插值 虽然我了解什么是线性插值,但上面的定义对我来说没有意义 你能换一种说法,举例说明什么是插值吗?至于“换句话说”的一般定义,你可以在网上找到一些。。举个例子,我可以试着向你们解释一下: 当有有限数量的数据试图表示无限数量的数据时,可以使用插值,

我刚刚开始学习OpenGL ES 2.0,在学习过程中,我遇到了一些对我来说没有意义的术语,即使有定义。像这样:插值

在《OpenGL ES 2.0编程指南》一书中,我看到了插值的定义:

用于根据指定给基元每个顶点的不同值为每个片段生成不同值的机制称为插值

虽然我了解什么是
线性插值
,但上面的定义对我来说没有意义


你能换一种说法,举例说明什么是插值吗?

至于“换句话说”的一般定义,你可以在网上找到一些。。举个例子,我可以试着向你们解释一下:

当有有限数量的数据试图表示无限数量的数据时,可以使用插值,例如,有2个点表示一条直线:

对于插值,你总是需要一个表示的提示,在直线的情况下,你需要2个点(提示是“这是一条直线”),让我们假设它们是向量a和B。现在的解决方案是
T(s)=a+s*(B-a)
,任何实数“s”在两个方向上都得到无穷的直线。要获得a和B之间的一条直线,需要在区间[0,1]上定义“s”,以便
T(0)=a
,而
T(1)=B
,这是线性插值

对于更复杂的插值,您可以稍微查看一下openGL:

请注意,GL和您的GPU中使用的算法比我在这里要写的要复杂得多,优化得多,但通常具有相同的结果

对于形状,通常使用由3个向量(顶点)定义的三角形,并说它是三角形(在绘制方法中称为“三角形”)。将一些矩阵应用于这些向量后,您将在绘制缓冲区上获得它们的2d投影(可能发生在顶点着色器中)。现在,您需要使用一些颜色、纹理或颜色插值来填充缓冲区中的所有这些点。首先,所有绘制的点(它们在缓冲区上的实际位置)都是线性插值机制的结果(您在GL中无法控制它)。第二种颜色通常是线性插值:

通过设置颜色指针,尝试绘制具有不同颜色顶点的三角形。您将在整个曲面上获得一个非常平滑的颜色specter,它是根据位置插值进行颜色线性插值的结果(对于需要绘制的每个像素,您将在片段着色器中获得位置插值结果)。您可以手动实现此颜色插值结果,如下所示:

输入:

Vector a, b, c; //original triangle positions
Vector interpolationABC; //current fragment interpolation between a, b and c
Color colorA, colorB, colorC; //colors for vectors a, b and c
输出(此片段的颜色):

这种机制再次代表了一种线性插值(实际上是一种非常慢的插值,但它应该可以做到这一点,并且可读性很强)

至于一个非线性插值的例子,你需要一点想象力:假设我们正在画一个球体。为了保持简单,假设它的中心在(0,0,0),半径为1。球体是由N个三角形创建的,如果N不够大(大多数情况下),因为性能问题,它有点“前卫”,我们希望将其平滑一点。因此,我们必须打开一些灯光(这只是一个没有灯光的圆圈),并找出如何设置法线。一方面,您可以计算由3个点定义的曲面的法线,每个三角形将具有唯一的法线,但会产生“迪斯科球”效果,另一方面,您知道球体的任何点“P”的法线是
归一化(P-中心)
,或者在这种情况下是点本身。因此每个顶点法线都是顶点本身的位置(现在每个三角形有3条不同的法线),每个片段的法线都是这些法线的插值:

如果使用与颜色相同的插值机制,您将看到法线的长度不是“恒定的”,从而导致缺陷,迫使您使用不同的机制(非线性)。在这种特定情况下,您可以简单地规范化这些线性碎片结果并获得所需的结果,但在这种特定情况下,您也可以仅从碎片位置计算法线(您可以对任何数学上可表示的形状执行此操作)。但要知道,在实践中,你会得到一个奇怪的形状,它有平滑的部分和边缘,可能有不同大小的法线来表示一些令人敬畏的效果,这就是为什么有很好的机制在形状上插值不同的参数

同样,插值机制是一种只知道有限数量的数据就可以产生无限数量结果的机制(其中一种机制称为“线性插值”)。或者换言之,您发布了一个更具体的示例:

用于为来自的每个片段生成不同值的机制 指定给基本体每个顶点的不同值称为 插值


一般来说,插值是一种基本的数学运算,如果你真的需要解释的话,那么你应该先加深你的一般数学知识,然后再钻研像3d计算机图形学这样复杂的东西。很好的解释,你在过去得到了我的支持:)但有一个小小的修正:在a和B(包括a和B点)之间获得一条直线的间隔是
s∈ [0,1]
。因为对于0,它是:
A+0(B-A)=A
,第一个顶点;对于1,它是
A+1(B-A)=A+B-A=B
,相反的一个。@Hi Angel谢谢你的更正,我不知道我怎么会错过它。我现在修好了。
Color output = (
(a - interpolationABC).length() * colorA + 
(b - interpolationABC).length() * colorB + 
(c - interpolationABC).length() * colorC ) 
/ (
(a - interpolationABC).length() + 
(b - interpolationABC).length() + 
(c - interpolationABC).length() );