1

[解決済み - 一番下の回答を参照]

iOS (iPhone) で OpenGL ES 2.0を使用して遠近法で立方体を描画しようとしていますが、長方形として表示されます。

Web を検索して集めたものから、ビューポート/投影マトリックスに関連しているように見えますが、実際の原因を特定することはできません。

ビューポートを正方形 (幅 == 高さ) に設定すると、完全にうまく描画されます (立方体) が、正しく設定すると (幅 = screen_width、高さ = screen_height)、立方体は長方形として描画されます。

ビューポートに応じて投影マトリックスを設定すると、立方体は立方体のままになりますか?!

私のコード(さらに情報が必要な場合はお知らせください):

レンダリング方法:

// viewportSize is SCREEN_WIDTH and SCREEN_HEIGHT
// viewportLowerLeft is 0.0 and 0.0
ivec2 size = this->viewportSize;
ivec2 lowerLeft = this->viewportLowerLeft;
glViewport(lowerLeft.x, lowerLeft.y, size.x, size.y); // if I put size.x, size.x it draws well


mat4 projectionMatrix = mat4::FOVFrustum(45.0, 0.1, 100.0, size.x / size.y);

glUniformMatrix4fv(uniforms.Projection, 1, 0, projectionMatrix.Pointer());

行列演算:

static Matrix4<T> Frustum(T left, T right, T bottom, T top, T near, T far)
{
    T a = 2 * near / (right - left);
    T b = 2 * near / (top - bottom);
    T c = (right + left) / (right - left);
    T d = (top + bottom) / (top - bottom);
    T e = - (far + near) / (far - near);
    T f = -2 * far * near / (far - near);
    Matrix4 m;
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0;
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0;
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1;
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1;
    return m;
}
static Matrix4<T> FOVFrustum(T fieldOfView, T near, T far, T aspectRatio)
{
    T size = near * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
    return Frustum(-size, size, -size / aspectRatio, size / aspectRatio, near, far);
}
4

2 に答える 2

0

これをまだ理解していない場合は、次のように変更します。

return Frustum(-size, size, -size / aspectRatio, size / aspectRatio, near, far);

return Frustum(-size / aspectRatio, size / aspectRatio, -size, size,, near, far);

正しく描画されるはずです。(または単に比率を size.x/size.y から size.y/size.x に変更します)

于 2012-09-28T00:21:37.527 に答える
0

問題が見つかりました。size.x と size.y は int なので、除算は int を返します。

1.0 * size.x / size.y

問題を解決します。 顔やし

于 2012-10-11T14:05:37.683 に答える