1

我正在尝试使用 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而不必指定整个矩阵。是否存在方便函数/构造函数来完成这项任务?

4

2 回答 2

0

我所看到的没有提供过剩或支持功能。基本上我通过在构建顶点时使用相等的坐标并使用顶点着色器以正确的纵横比在 y 轴上缩放来解决它。

于 2010-01-16T14:19:28.787 回答
0

第一个参数glViewport()不是中心,而是左下角的坐标。

您可能应该设置一个将您的方面考虑在内的投影,通常使用gluPerspective()(如果 GLU 在 ES 中可用)。

于 2010-01-15T14:31:13.960 回答