当前位置:  开发笔记 > 编程语言 > 正文

如何使用GL_REPEAT仅重复选择纹理图集?(OpenGL的)

如何解决《如何使用GL_REPEAT仅重复选择纹理图集?(OpenGL的)》经验,为你挑选了3个好方法。

如何重复选择纹理图集?

例如,我的精灵(选择)在纹理坐标内:

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
};

我们看到我们的全纹理图集重复...

我怎么能以正确的方式做到这一点?



1> Kriem..:

它不能按照问题中描述的方式完成.OpenGL的纹理坐标模式仅适用于整个纹理.

通常,要重复纹理,您需要绘制一个比纹理暗示的"更大"的多边形.例如,如果你想要在一个更大的区域上重复多次(比如六次)的方形纹理,你会绘制一个宽度是它的六倍宽的矩形.然后你将纹理坐标设置为(0,0) - (6,1),纹理模式设置为"重复".在多边形内插时,超过1的纹理坐标将由于重复启用而在纹理中"环绕",导致纹理在矩形上被映射六次.

没有纹理包装模式支持问题中描述的操作类型,即它们都映射到完整的[0,1]范围,而不是某些任意子集.当你使用纹理的一部分进行纹理处理时,没有办法以一种方式指定更大的纹理坐标,这使得OpenGL仅在子矩形内重复它.

您基本上有两个选择:创建一个只有现有纹理所需的精灵的新纹理,或者编写一个GLSL顶点程序来适当地映射纹理坐标.


>"或写一个GLSL顶点程序来适当地映射纹理坐标." 必须有*fragment*程序.

2> unwind..:

我不确定你能做到这一点.我认为OpenGL的纹理坐标模式仅适用于整个纹理.使用图集时,您使用的是"子纹理",因此纹理坐标永远不会接近0和1,这是发生包装和夹紧的正常限制.

可能有扩展来处理这个,我没有检查.

编辑:通常,要重复纹理,您需要绘制一个比纹理暗示的"更大"的多边形.例如,如果你想要在一个更大的区域上重复多次(比如六次)的方形纹理,你会绘制一个宽度是它的六倍宽的矩形.然后你将纹理坐标设置为(0,0) - (6,1),纹理模式设置为"重复".在多边形内插时,超过1的纹理坐标将由于重复启用而在纹理中"环绕",导致纹理在矩形上被映射六次.

没有图像,这有点粗糙.

无论如何,当你使用纹理的一部分进行纹理处理时,没有办法以一种方式指定更大的纹理坐标,这使得OpenGL仅在子矩形内重复它.



3> TrayMan..:

没有任何纹理包装模式支持您正在寻找的操作类型,即它们都映射到完整的[0,1]范围,而不是某些任意子集.您基本上有两个选择:创建一个只有现有纹理所需的精灵的新纹理,或者编写一个GLSL像素程序来适当地映射纹理坐标.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有