我已经问过一个关于纹理映射的问题,这两个是相关的(这个问题)。
我正在使用 Quartz Composer,它似乎对纹理有点特殊......
我有一个复杂的多边形,我在特定的坐标系中进行三角剖分(x 上的 -1 -> 1 | -0.75 -> y 上的 0.75)。我在这个坐标系中获得了一个三角形顶点数组(左侧图片上的三角形 1 到 6)。
然后我分别渲染每个多边形(这是我的程序所必需的),方法是在它的顶点上应用一个缩放函数,从这个坐标系到 OpenGL 一个(0. -> 1.)。在这里,即使对于 0->1 范围,这有点愚蠢:
return (((1. - 0.) * (**myVertexXorY** - minTriangleBound)) / (maxTriangleBound - minTriangleBound)) + 0.;
但我希望在这些三角形上对一张图像进行纹理处理(如上图所示)。因此,我首先获取整个多边形边界(右图中的 1),然后是三角形边界(右图中的 2)。我将 1 缩放到以像素为单位的图片坐标(右侧图片上的 3),然后我得到以像素为单位的三角形边界(2)。
它为我提供了使用 Quartz 在 OpenGL 中锁定纹理的界限:
NSRect myBounds = NSMakeRect(originXinPixels, originYinPixels, widthForTheTriangle, heightForTheTriangle);
我锁定了我的纹理
[myImage lockTextureRepresentationWithColorSpace:space forBounds:myBounds];
然后,使用 OpenGL:
for (int32 i = 0; i < vertexCount; ++i)
{
verts[i] = myTriangle.vertices[i];
texcoord[0] = [self myScaleFunctionFor:XinQuartzCoordinateSystem From:0 To:1]
texcoord[1] = [self myScaleFunctionFor:YinQuartzCoordinateSystem From:0 To:1]
glTexCoord2fv(texcoord);
}
我得到了你所看到的:有时图像的某些部分是合适的,有时不是(嗯,事实上,对于这个特定的多边形,它根本不合适......)。