使用OpenGL在Vertex Shader中实现LookAt函数

时间:2013-03-20 21:44:01

标签: opengl graphics 3d glsl

出于我无法控制的目的,我需要在顶点着色器中计算ModelView矩阵。我知道这是一个坏主意,但我现在没有选择。这是我的顶点着色器中的代码。基于https://stackoverflow.com/a/6802424

mat4 lookAt(vec3 eye, vec3 center, vec3 up)
{
    vec3 zaxis = normalize(center - eye);
    vec3 xaxis = normalize(cross(up, zaxis));
    vec3 yaxis = cross(zaxis, xaxis);

    mat4 matrix;
    //Column Major
    matrix[0][0] = xaxis.x;
    matrix[1][0] = yaxis.x;
    matrix[2][0] = zaxis.x;
    matrix[3][0] = 0;

    matrix[0][1] = xaxis.y;
    matrix[1][1] = yaxis.y;
    matrix[2][1] = zaxis.y;
    matrix[3][1] = 0;

    matrix[0][2] = xaxis.z;
    matrix[1][2] = yaxis.z;
    matrix[2][2] = zaxis.z;
    matrix[3][2] = 0;

    matrix[0][3] = -dot(xaxis, eye);
    matrix[1][3] = -dot(yaxis, eye);
    matrix[2][3] = -dot(zaxis, eye);
    matrix[3][3] = 1;

    return matrix;
}

void main( void )
{
    vec3 cam = vec3(0, 0, 3);
    mat4 test = lookAt(cam, vec3(0,0,0), vec3(0, 1, 0));
    gl_Position = gl_ProjectionMatrix * test * gl_Vertex;
    //gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}

但是,当我使用它代替我的ModelView Matrix时,它无法正常工作。但我不知道出了什么问题。有人能指出我正确的方向吗?

以下是一些图片,虽然不是很有帮助。

使用程序ModelViewMatrix

Using the programs ModelViewMatrix

使用Vertex Shader lookAt功能

Using the Vertex Shader lookAt function

0 个答案:

没有答案