我创建了一个基本的正交着色器,可以显示纹理中的精灵。它很棒。
我为它添加了一个“缩放”因子,以允许精灵缩放变大或变小。假设纹理以其原点锚定在“左下方”,它所做的是朝着该原点收缩,或者从它向右上方展开。我真正想要的是缩小或扩展“到位”以保持中心。
因此,实现这一目标的一种方法是弄清楚我将收缩或扩展多少像素并进行补偿。我不太确定我是怎么做的,而且我知道这不是最好的方法。我愚弄了翻译和音阶的顺序,认为我可以先缩放然后放置,但我只是得到了各种糟糕的结果。我无法解决问题的方法。
这是我的着色器:
// Set up orthographic projection (960 x 640)
mat4 projectionMatrix = mat4( 2.0/960.0, 0.0, 0.0, -1.0,
0.0, 2.0/640.0, 0.0, -1.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
void main()
{
// Set position
gl_Position = a_position;
// Translate by the uniforms for offsetting
gl_Position.x += translateX;
gl_Position.y += translateY;
// Apply our (pre-computed) zoom factor to the X and Y of our matrix
projectionMatrix[0][0] *= zoomFactorX;
projectionMatrix[1][1] *= zoomFactorY;
// Translate
gl_Position *= projectionMatrix;
// Pass right along to the frag shader
v_texCoord = a_texCoord;
}
答案 0 :(得分:1)
mat4 projectionMatrix =
GLSL中的矩阵是按列构造的。对于mat4
,前4个值是第一列,接下来的4个值是第二列,依此类推。
你改变了你的矩阵。
此外,那些-1是什么?
对于你的其余问题,缩放不是投影矩阵应该处理的东西。不是你所说的那种缩放。在将它们与投影矩阵相乘之前,应将比例应用于位置。就像3D物体一样。
你没有发布你的精灵的顶点数据,所以没有办法确定。但应该工作的方式是精灵的顶点位置应该以精灵的中心为中心(无论你在哪里定义它)。
因此,如果你有一个16x24的精灵,并且你希望精灵的中心向右偏移8个像素,向上偏移8个像素,那么你的精灵矩形应该是(-8,-8)到(8,16)(从左下角坐标系。)
然后,如果你缩放它,它将围绕精灵坐标系的中心缩放。