ios - OpenGL 2.0 根据对象大小调整纹理大小

标签 ios textures opengl-es-2.0 texture-mapping

我希望能够根据对象(立方体)的比例大小动态重复纹理。

我已尝试遍历 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/

相关文章:

ios - sdwebimage:有多少 setimageWithUrl 可以排队的限制?

c++ - 您应该如何在 OpenGL 4.5 中初始化立方体贴图数组?

ios - 一个opengles 2.0应用程序中的多个绘图层

android - 如何以编程方式在 Android 中使用 OpenGL ES 2.0 动态绘制虚线?

ios - 使用glVertexAttribPointer在带有着色器的OpenGL 2.0中绘制模型

android - Firemonkey:将 JPEG 加载到任何类型的图像控件中,然后保存到文件或流中,使其更小。这可以避免吗?

ios - 如何在 objective-c 中从谷歌驱动器下载jpg、png、pdf、doc.ppt、rtf等文件

ios - Xcode:如何限制相同大小的 View 彼此重叠

java - 使用 LWJGL 和 VBO 的简单纹理不起作用

opengl-es - 使用 Three.js 在 WebGL 中的环形几何体上进行非径向纹理映射