如何重复选择纹理图集?
例如,我的精灵(选择)在纹理坐标内:
GLfloat textureCoords[]= { .1f, .1f, .3f, .1f, .1f, .3f, .3f, .3f };
然后我想重复该精灵N次到由以下定义的三角形条带(或四边形):
GLfloat vertices[]= { -100.f, -100.f, 100.f, -100.f, -100.f, 100.f, 100.f, 100.f };
我知道它GL_REPEAT
与textureCoords有关,并且通过了范围[0,1]
.然而,这不起作用:(试图重复N = 10)
GLfloat textureCoords[]= { 10.1f, 10.1f, 10.3f, 10.1f, 10.1f, 10.3f, 10.3f, 10.3f };
我们看到我们的全纹理图集重复...
我怎么能以正确的方式做到这一点?
它不能按照问题中描述的方式完成.OpenGL的纹理坐标模式仅适用于整个纹理.
通常,要重复纹理,您需要绘制一个比纹理暗示的"更大"的多边形.例如,如果你想要在一个更大的区域上重复多次(比如六次)的方形纹理,你会绘制一个宽度是它的六倍宽的矩形.然后你将纹理坐标设置为(0,0) - (6,1),纹理模式设置为"重复".在多边形内插时,超过1的纹理坐标将由于重复启用而在纹理中"环绕",导致纹理在矩形上被映射六次.
没有纹理包装模式支持问题中描述的操作类型,即它们都映射到完整的[0,1]范围,而不是某些任意子集.当你使用纹理的一部分进行纹理处理时,没有办法以一种方式指定更大的纹理坐标,这使得OpenGL仅在子矩形内重复它.
您基本上有两个选择:创建一个只有现有纹理所需的精灵的新纹理,或者编写一个GLSL顶点程序来适当地映射纹理坐标.
我不确定你能做到这一点.我认为OpenGL的纹理坐标模式仅适用于整个纹理.使用图集时,您使用的是"子纹理",因此纹理坐标永远不会接近0和1,这是发生包装和夹紧的正常限制.
可能有扩展来处理这个,我没有检查.
编辑:通常,要重复纹理,您需要绘制一个比纹理暗示的"更大"的多边形.例如,如果你想要在一个更大的区域上重复多次(比如六次)的方形纹理,你会绘制一个宽度是它的六倍宽的矩形.然后你将纹理坐标设置为(0,0) - (6,1),纹理模式设置为"重复".在多边形内插时,超过1的纹理坐标将由于重复启用而在纹理中"环绕",导致纹理在矩形上被映射六次.
没有图像,这有点粗糙.
无论如何,当你使用纹理的一部分进行纹理处理时,没有办法以一种方式指定更大的纹理坐标,这使得OpenGL仅在子矩形内重复它.
没有任何纹理包装模式支持您正在寻找的操作类型,即它们都映射到完整的[0,1]范围,而不是某些任意子集.您基本上有两个选择:创建一个只有现有纹理所需的精灵的新纹理,或者编写一个GLSL像素程序来适当地映射纹理坐标.