使用着色器的基本外观,但没有使用opengl的gluLookAt

时间:2012-11-13 01:08:37

标签: opengl shader

我有这个obj文件(也尝试过其他更多的3D模型):

            Triangle                  
            v 0 0 0                 
            v 0 0.5 0               
            v 1 0 0     
            f 1 2 3        

我使用以下顶点着色器:

    uniform mat4 projection;
    attribute vec4 pos;

    void main(void)
    {
        gl_Position = projection* pos;
    }

超级简单。如果我只使用uniform_Projection =单位矩阵运行它,我会看到一个三角形,向上0.5和1。似乎没错。

现在,我想做的是使用相机ala gluLookAt以及一些透视投影。这就是我感到困惑的地方。

在世界坐标中,三角形位于上方的顶点位置。所以,让我们选择一个眼睛和一个观察点。 eye =(0,0,3),lookAt =(0,0,0)。基本上我们希望眼睛处于起源。因此,我们必须将世界原点移动到眼睛位置(即使它是单位矩阵,也要这样做):

   | 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
   | 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
   | 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
   | 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

繁荣,三角形消失了......我所做的就是沿着原始相机的方向移动世界。 eye =(0,0,3)仍然消失了......超级困惑:S我已经关闭了任何形式的剔除等。有人可以向我解释这是如何工作的吗?

因为后来我的想法如下:

       v = normalize(lookat-eye)
       r = normalize(crossProduct(v, up));
       u = crossProduct(r, v);

       viewMatrix = |r1 r2 r3 -eye1|
                    |u1 u2 u3 -eye1|
                    |v1 v2 v3 -eye1|
                    |0  0  0   1   |

作为一个投影矩阵,我正在思考(来自我的讲座):

       projMatrix = |1 0 0    0|
                    |0 1 0    0|
                    |0 0 1    0|
                    |0 0 -1/d 1|

或者这个链接: gluPerspective was removed in OpenGL 3.1, any replacements? 不能说我现在完全理解他们中的任何一个。

对我而言,似乎我不了解坐标系如何运作的一些关键部分。

1 个答案:

答案 0 :(得分:1)

你对这个矩阵的问题:

| 1 0 0 0 |   | 1 0 0 0 |   | 1 0 0 0 |
| 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
| 0 0 1 -3|   | 0 0 1 0 |   | 0 0 1 -3| 
| 0 0 0 1 |   | 0 0 0 1 |   | 0 0 0 1 | 

你是否翻译了它,但你根本没有调整剪裁平面。默认身份投影矩阵在Z轴上从-1剪辑到1。你已经将你的眼睛转换为Z = 3,所以你的新剪裁平面从4到2,你的三角形在这个范围之外,所以它被剪裁了。

因此,如果你想要移动你的眼睛,你需要一个新的投影矩阵。既然你在谈论透视,我建议你自己从gluPerspective实现方程式,或者下载一个为你生成投影矩阵的库,比如OpenGL Mathematics