我正在尝试在顶点着色器中执行以下操作:
...
attribute vec2 tCoordIn;
uniform vec2 tCoordScale;
uniform vec2 tCoordOffset;
varying vec2 tCoordOut;
void main() {
...
tCoordOut = (tCoordIn * tCoordScale) + tCoordOffset;
...
}
如果我对tCoordScale
和tCoordOffset
使用合理的值,那就没有运气了。
如果我没有其他错误,或者它违反了GLSL规范吗?
它仅适用于我使用一些非常古怪的比例数字,并为x和y偏移添加一些意外的数字。 GPU是否会填充纹理图像,以便0
和1
不再引用您放入的图像的开头和结尾?
我的纹理“atlas”是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倍)和{{1}时}约为(0.018,0.768)(即当我向tCoordOffset
和0.018
偏移值的值添加约x
时。)
我已经通过以制服方式发送值并在着色器本身中对相同值进行硬编码来验证这一点。 (我在Android上通过y
发送了2048x2048图片。
这里发生了什么?为什么它只接受这些修改后的值?如何确保我始终能够在纹理图集中正确缩放和平移纹理坐标,无论它在哪个设备上?
任何见解都会受到赞赏,或任何有此类工作的人的经验。