使用不同坐标系的OpenGL纹理映射

时间:2012-09-06 08:44:14

标签: objective-c opengl box2d texture-mapping quartz-composer

enter image description here

我已经问了一个关于纹理映射的问题,这两个是相关的(this question)。

我正在使用Quartz Composer,它看起来与纹理有点特殊......

我有一个复杂的多边形,我在一个特定的坐标系中三角测量(在-1 |> 1上x | -0.75 - > 0.75 y)。我在这个坐标系中得到一个三角形顶点数组(左边的图片中的三角形1到6)。

然后我分别渲染每个多边形(这对我的程序来说是必要的),通过在其坐标系的顶点上应用缩放函数到OpenGL one(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);

                    }

我得到你能看到的东西:有时图像的某些部分是合适的,有时候没有(好吧,实际上这个特定的多边形,它根本不适合......)。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题,但是:

什么阻碍您直接提供与源图片拓扑匹配的纹理坐标?这比尝试找到一些以正确方式移动图片的每个三角形线性映射要容易得多。