C++ 如何插值UV坐标?

C++ 如何插值UV坐标?,c++,interpolation,texture-mapping,C++,Interpolation,Texture Mapping,我正在尝试将纹理应用于我的.md2模型。我使用了古劳德着色(底部/顶部平面三角形的标准算法)对其进行着色,我必须对纹理坐标U和V使用类似的代码。但我真的不知道如何插值它们。从我尝试过的情况来看,我的代码似乎只在边缘下插值,而不是在边缘之间插值。我错过了什么? 非常感谢。 这里的颜色由u表示红色,v表示绿色,255表示蓝色组成(仅适用于底部扁平三角形): void光栅化器::TfillBottomFlatTriangle(顶点顶点1、顶点2、顶点3、COLORREF c1、COLORREF c

我正在尝试将纹理应用于我的.md2模型。我使用了古劳德着色(底部/顶部平面三角形的标准算法)对其进行着色,我必须对纹理坐标U和V使用类似的代码。但我真的不知道如何插值它们。从我尝试过的情况来看,我的代码似乎只在边缘下插值,而不是在边缘之间插值。我错过了什么? 非常感谢。

这里的颜色由u表示红色,v表示绿色,255表示蓝色组成(仅适用于底部扁平三角形):

void光栅化器::TfillBottomFlatTriangle(顶点顶点1、顶点2、顶点3、COLORREF c1、COLORREF c2、COLORREF c3、HDC HDC)
{
浮点斜率1=(vertex2.GetX()-vertex1.GetX())/(vertex2.GetY()-vertex1.GetY());
浮点斜率2=(vertex3.GetX()-vertex1.GetX())/(vertex3.GetY()-vertex1.GetY());
//U和V
浮点斜率1u=(vertex2.GetU()-vertex1.GetU())/(vertex2.GetY()-vertex1.GetY());
浮点斜率2u=(vertex3.GetU()-vertex1.GetU())/(vertex3.GetY()-vertex1.GetY());
浮点斜率1v=(vertex2.GetV()-vertex1.GetV())/(vertex2.GetY()-vertex1.GetY());
浮点斜率2v=(vertex3.GetV()-vertex1.GetV())/(vertex3.GetY()-vertex1.GetY());
float x1=vertex1.GetX();
浮点x2=顶点1.GetX()+0.5f;
//U和V
float x1U=vertex1.GetU();
浮动x2U=x1U;
float x1V=vertex1.GetV();
浮动x2V=x1V;
如果(斜率2<斜率1)
{
浮点数slopeTmp=slope1;
slope1=slope2;
slope2=slopeTmp;
浮动斜率MPU=斜率1U;
slope1U=slope2U;
slope2U=slopeTmpU;
浮动斜率tMPV=斜率1V;
斜率1v=斜率2v;
slope2V=slopeTmpV;
}
对于(float scanlineY=vertex1.GetY();scanlineY问题在于:

    //U and V
    float x1U = vertex1.GetU();
    float x2U = vertex1.GetU() + 0.5f;

    float x1V = vertex1.GetV();
    float x2V = vertex1.GetV() + 0.5f;
0.5
对于uv坐标来说太多了,所以这告诉我这是错误的

我认为正确的方法应该是:

    //U and V
    float x1U = vertex1.GetU();
    float x2U = x1U;

    float x1V = vertex1.GetV();
    float x2V = x1V;
快速健全测试:对于初始的
y
我们有
x1U=Vertex1.u
x2U=Vertex1.u
。对于最终的
y
我们有
x1U=Vertex2.u
x2U=Vertex3.u
我说得对吗

我想现在的情况是每个三角形都包含一半的纹理,我想我们可以在图像中看到它

编辑: 我在python中实现了相同的算法,得到了预期的结果:

import numpy as np

p = np.array([[0,0],
              [-5,10],
              [10,10]],dtype=np.float)

uv = np.array([[0.1,0.6],
               [0.2,0.5],
               [0.3,0.4]])

slope = (p[[1,2],0] - p[0,0])/(p[[1,2],1] - p[0,1])

slope_uv = (uv[[1,2],:] - uv[0,:])/(p[[1,2],1] - p[0,1]).reshape(-1,1)

x1 = p[0,0]
x2 = p[0,0] + 0.5

uv1 = uv[0,:]
uv2 = np.copy(uv1)

result = []

for scanY in range(int(p[0,1]),int(p[1,1])):
    for x in range(int(np.ceil(x1)),int(x2)):
        t = (x-x1)/(x2-x1)
        u = (1-t) * uv1 + t * uv2
        result.append((x,scanY,u[0],u[1]))
    x1 += slope[0]
    x2 += slope[1]
    uv1 += slope_uv[0,:]
    uv2 += slope_uv[1,:]

#%%
R = np.array(result,dtype=float)
from matplotlib import pyplot as plt

plt.figure()
plt.subplot(2,1,1)
plt.scatter(R[:,0],R[:,1],c = R[:,2])
plt.title('u')
plt.colorbar()
plt.subplot(2,1,2)
plt.scatter(R[:,0],R[:,1],c = R[:,3])
plt.title('v')
plt.colorbar()
结果如下:

我猜您的问题是顶点的
uv
值不正确

此外,我可以在您的代码中看到以下行:

                COLORREF colour = _model.GetTexture().GetTextureValue((int)u, (int)v);

这没有什么意义,因为
u,v
通常介于0和1之间。我认为在调用GetTextureValue或乘以它或其他东西之前,可能需要先除以纹理的大小。

对于任何类型的渲染问题,发布其外观的图像通常非常有帮助,而不仅仅是文本de说明。既然你说的是渲染.md2模型,我假设这些顶点是3D场景的投影顶点?我假设你现在不关心透视正确插值?输入顶点是否按特定顺序排序?@MichaelKenzel l用一张图片更新了我的帖子。首先,我只想应用纹理我会看看是否有时间考虑透视校正。顶点是按升序排列的。尝试将
uv
输出为颜色,而不是采样。生成的图像将让您了解生成的内容。关于三角形插值和重心坐标的讨论可能很有用:是的,我理解在。重点是查看生成为颜色的uv。这是一种使用了几十年的诊断技术。我更改了x2U和x2V的值,但结果相同…@MonicaHotea作为调试度量,请将计算出的uv作为颜色输出。例如,红色=u和蓝色=v。然后将结果图像添加到您的问题中在上。我添加了红色=u、绿色=v和蓝色=255的照片。@MonicaHotea请查看“编辑:”之后的内容。因此,您认为该算法是正确的,非常感谢您的努力。我按照教程获取uv值,所以,老实说,我不知道是否正确。
                COLORREF colour = _model.GetTexture().GetTextureValue((int)u, (int)v);