我正在尝试在顶点着色器中执行以下操作:
...
attribute vec2 tCoordIn;
uniform vec2 tCoordScale;
uniform vec2 tCoordOffset;
varying vec2 tCoordOut;
void main() {
...
tCoordOut = (tCoordIn * tCoordScale) + tCoordOffset;
...
}
tCoordScale
如果我对and使用合理的值,那就没有运气了tCoordOffset
。
如果我没有做错任何事情,或者它是否违反 GLSL 规范,这会起作用吗?
它仅在我使用一些非常奇怪的比例数字时才起作用,并向 x 和 y 偏移量添加一些意想不到的数字。0
GPU是否曾经填充纹理图像,以便1
不再引用您放入的图像的开头和结尾?
我的纹理“图集”是 2048x2048,目标是 75x75 像素(它用于四边形)并且在纹理上偏移(0.0,0.75)(我已经在输出图像上验证了这一点)。
因此我推测tCoordScale
应该是 75 / 2048 = (0.0366, 0.0366) 大约。(假设我的输入纹理坐标是 (0.0, 0.0) (1.0, 0.0) (0.0, 1.0) (1.0, 1.0) )并且tCoordOffset
应该只是 (0.0, 0.75)。
然而,它仅tCoordScale
在 (0.000045, 0.000045) 左右(每个方向比我预期的 75/2048 缩放所需的小 814 倍)和tCoordOffset
大约 (0.018, 0.768) 时(即当我添加大约0.018
为 thex
和y
offset 值的值)。
我已经通过将值作为制服发送并在着色器本身中对相同的值进行硬编码来验证这一点。(我正在通过GLUtils.texImage2D
Android 发送 2048x2048 图像)。
这里发生了什么?为什么它只接受这些修改后的值?如何确保我始终能够在我的纹理图集中准确地缩放和转换纹理坐标,而不管它在哪个设备上?
任何见解都会受到赞赏,或者任何有类似工作的人的任何经验。