2013-11-24 70 views
0

我希望能够基于对象(多维数据集)的比例大小动态地重复纹理。OpenGL 2.0根据对象大小调整纹理大小

我尝试过VerticesCube3D结构,但尝试更改值时发生崩溃。我有我的纹理上重复设置,但目前它横跨纹理(我需要动态改变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}} 
    }; 
+0

您可以更改着色器代码中的纹理坐标值 – marekb

+0

什么样的值传递给着色器中的纹理,得到了任何示例 – Burf2000

回答

1

你不想改变你的顶点数据的纹理坐标(因为那时你必须重新上传到硬件)。相反,您想要在GPU上转换纹理坐标,可能是在顶点着色器中。

阅读关于Projective Texture Mapping。这是一种非常常见的技术,但令人惊讶的是我找不到有关它的好教程。 Here's a university programming assignment稍微讨论一下。

它的要点:你定义一个纹理矩阵来转换纹理坐标 - 这是一个像你的模型,视图和投影矩阵一样的转换,所以在iOS上你可以用GLKMatrix4函数来创建它。然后使用统一变量将该矩阵提供给顶点着色器。在顶点着色器中,将输入纹理坐标(顶点属性)与纹理矩阵相乘,以便在将其输出到用于片段着色器的变化之前进行变换。

如果您在顶点数据中定义纹理坐标,以便纹理完全覆盖对象一次,则可以使用纹理矩阵向下缩放纹理。如果缩小比例,并且纹理包裹parameters are set需要重复,则纹理将在对象的面上平铺。

相关问题