2012-04-15 72 views
1

因此,我试图用GLSL中的另一个纹理替换纹理的一部分,这是第一步。 所以我有一个图像,2048x2048,左上角有3个纹理,每个512x512。出于测试目的,我试图反复绘制第一个。在另一个纹理上重复纹理的一部分

//get coord of smaller texture 
coord = vec2(int(gl_TexCoord[0].s)%512,int(gl_TexCoord[0].t)%512); 

//grab color from it and return it 
fragment = texture2D(textures, coord); 
gl_FragColor = fragment; 

它似乎只抓取相同的像素,我从纹理返回给我一种颜色。一切都变成灰色。任何人都知道什么是关闭?

回答

3

除非这是一个矩形纹理(这不是因为您使用的是texture2D),否则您的纹理坐标是标准化的。这意味着范围[0,1]映射到纹理的整个范围。 0.5总是意味着中途,无论是对于256尺寸的纹理还是8192的纹理。

因此,您需要停止传递非标准化的纹理坐标(texel值)。传递标准化的纹理坐标并调整它们。

+0

是的,我相信没有意识到gl_TexCoord [0]是0-1是我的主要问题。这是否意味着我可以对它进行非规范化,然后重新规范化它?我尝试了amtCoord = vec2(((int(gl_TexCoord [0] .s)* 2048)%512)/ 2048,((int(gl_TexCoord [0] .t)* 2048)%512)/ 2048)。但仍然没有工作。 – jfbguy 2012-04-15 22:47:59

+0

@jfbguy:那是因为你不断地将它们转换为*整数*。将小于2048的整数除以2048将始终得出* zero *。或者,你可以不对它们进行非规范化:'texture2D(纹理,gl_TexCoord [0] .st/2.0)'。 – 2012-04-15 23:02:58

+0

哎呦:)。我一直忘记在最后添加.f。我同意,保持一切正常化是很好的事情,但我想不出使用无整数模的方法,因为使用我的大质地,我需要保持0到0.25之间的一切,因此我调整了512使用2048的大小的纹理。通过将2048改为2048.0f,我确实得到了它的工作。 – jfbguy 2012-04-15 23:14:59