我正在尝试使用 OpenGL ES 2.0 在我的 ipod touch 上进行我的第一步。我想知道如何解决这个坐标问题..
为了更好地解释,我试图绘制一个四边形并使用顶点着色器旋转/平移它(也是因为从我读过的内容来看,这似乎是唯一的方法)。
由于我正在使用 ipod,因此我设置了一个1.5 : 1
比率和一个视口
glViewport(0, 0, backingWidth, backingHeight);
那么0,0
裁剪的中心和边界应该在-1.0, -1.0
,-1.0, 1.0
等处(对吗?)
由于纵横比,要绘制一个正方形,我必须对 x 和 y 坐标使用不同的值:
static const GLfloat lineV[] = {
-0.5f, 0.33f, 0.5f, 0.33f,
0.5f, 0.33f, 0.5f,-0.33f,
0.5f,-0.33f, -0.5f,-0.33f,
-0.5f,-0.33f, -0.5f, 0.33f,
-0.5f, 0.33f, 0.5f,-0.33f,
0.5f, 0.33f, -0.5f,-0.33f,
};
这是一个带有两条对角线的正方形(我知道使用索引会更有效,但这不是重点)..
然后我尝试编写一个顶点着色器来在移动对象时旋转它:
void main()
{
m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
-sin(rotation), cos(rotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
m2 = mat4(1.0);
m2[1][3] = sin(rotation)*0.8;
gl_Position = position*(m*m2);
}
它可以工作,但由于坐标不同,四边形在旋转时会变形。我应该如何防止这种情况?我想是否可以将视锥体更改为具有不同的界限(不是两个轴上的 -1.0 到 1.0,以便在 y 轴上放大可以解决问题)。
另外有没有更好的方法来使用矩阵?我的意思是,我习惯于使用glRotatef
而不必指定整个矩阵。是否存在方便函数/构造函数来完成这项任务?