我希望能够根据对象(立方体)的比例大小动态重复纹理。
我已尝试遍历 VerticesCube3D 结构,但在尝试更改值时发生崩溃。我重复设置了纹理,但目前它会拉伸(stretch)纹理(我需要动态更改 TEX_COORD_MAX)
Vertex VerticesCube3D[] = {
// Front
{{1, -1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{1, 1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{-1, 1, 0}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{-1, -1, 0}, {1, 1, 1, 1}, {0, 0}},
// Back
{{1, 1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{-1, -1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{1, -1, -2}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{-1, 1, -2}, {1, 1, 1, 1}, {0, 0}},
// Left
{{-1, -1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{-1, 1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{-1, 1, -2}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{-1, -1, -2}, {1, 1, 1, 1}, {0, 0}},
// Right
{{1, -1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{1, 1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{1, 1, 0}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{1, -1, 0}, {1, 1, 1, 1}, {0, 0}},
// Top
{{1, 1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{1, 1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{-1, 1, -2}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{-1, 1, 0}, {1, 1, 1, 1}, {0, 0}},
// Bottom
{{1, -1, -2}, {1, 1, 1, 1}, {TEX_COORD_MAX, 0}},
{{1, -1, 0}, {1, 1, 1, 1}, {TEX_COORD_MAX, TEX_COORD_MAX}},
{{-1, -1, 0}, {1, 1, 1, 1}, {0, TEX_COORD_MAX}},
{{-1, -1, -2}, {1, 1, 1, 1}, {0, 0}}
};
最佳答案
您不想更改顶点数据中的纹理坐标(因为那样您必须将其重新上传到硬件)。相反,您想要转换 GPU 上的纹理坐标,可能是在顶点着色器中。
了解Projective Texture Mapping 。这是一种非常常见的技术,但令人惊讶的是我找不到太多关于它的好的教程。 Here's a university programming assignment对此进行了一些讨论。
其要点:定义一个纹理矩阵来转换纹理坐标 - 这是一个转换,就像模型、 View 和投影矩阵一样,因此在 iOS 上,您可以使用 GLKMatrix4 来创建它功能就像那些一样。然后使用统一变量将该矩阵提供给顶点着色器。在顶点着色器中,将输入纹理坐标(顶点属性)乘以纹理矩阵以对其进行变换,然后将其输出到变量以在片段着色器中使用。
如果您在顶点数据中定义纹理坐标,使得纹理恰好覆盖对象一次,则可以使用纹理矩阵来缩小纹理。如果按比例缩小,并且您的纹理会包裹 parameters are set重复一遍,您的纹理将平铺在对象的表面上。
关于ios - OpenGL 2.0 根据对象大小调整纹理大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181421/