我有一个3x9重复部分的纹理。我不想存储纹理所具有的经过细分的1920x1080图像,我宁愿用代码生成它,以便可以将其正确地应用于其他分辨率。关于如何执行此操作的任何想法?原始纹理在这里:http://img684.imageshack.us/img684/6282/matte1.png
我知道纹理是非2的幂的,因此我必须在着色器中进行重复,我可以这样做:
uniform sampler2D tex;
varying vec2 texCoord;
void main() {
gl_FragColor = texture2D(tex, mod(texCoord, vec2(3.0, 9.0)) * vec2(0.75, 0.5625));
}
这就是我绘制四边形的方式:
glBegin(GL_QUADS)
glColor4f(1.0, 1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.topLeft().x(), self.widgetPhysicalRect.topLeft().y())
glVertex2f(-1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.topRight().x(), self.widgetPhysicalRect.topRight().y())
glVertex2f(1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.bottomRight().x(), self.widgetPhysicalRect.bottomRight().y())
glVertex2f(1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.bottomLeft().x(), self.widgetPhysicalRect.bottomLeft().y())
glVertex2f(-1.0, -1.0)
glEnd()
任何想法将不胜感激。
谢谢!
最佳答案
几乎就像您要使用固定管道一样。在设置采样器均匀性之前,将绑定的纹理的环绕模式设置为重复,并且0-1范围以外的纹理坐标将重复该纹理。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
在您的情况下,纹理坐标将为s = 0-640和t = 0-120。片段着色器不需要任何特殊的东西,只需普通的
texture2D(tex, texCoord)
就可以。关于python - 如何在OpenGL的GLSL中重复3x9纹理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3169099/