GLSL Phong Light,相机问题

时间:2011-05-26 21:43:15

标签: opengl camera glsl light

我刚开始写一个phong着色器

vert:
varying vec3 normal, eyeVec;
#define MAX_LIGHTS 8
#define NUM_LIGHTS 3
varying vec3 lightDir[MAX_LIGHTS];

void main() {
    gl_Position = ftransform();
    normal = gl_NormalMatrix * gl_Normal;
    vec4 vVertex = gl_ModelViewMatrix * gl_Vertex;
    eyeVec = -vVertex.xyz;
    int i;

    for (i=0; i<NUM_LIGHTS; ++i){
        lightDir[i] = vec3(gl_LightSource[i].position.xyz - vVertex.xyz);
    }
}

我知道我需要使用uniform来获取相机位置,但是如何以及放置此值的位置?

PS。我正在使用opengl 2.0

1 个答案:

答案 0 :(得分:4)

您无需传递相机位置,因为OpenGL中没有相机。

在眼睛/世界空间中执行照明计算,即在与模型视图矩阵相乘之后,其还执行“相机定位”。所以实际上你已经有了正确的东西。使用ftransform()效率有点低,因为你正在做的事情的一半(gl_ModelviewMatrix * gl_Vertex,你可以通过添加gl_Position = gl_ProjectionMatrix * eyeVec将其变成ftransform)

因此,如果你的“相机”转换时你的灯光似乎移动了,你就不会正确地改变灯光的位置。既可以预先计算变换后的光位置,也可以在着色器中对它们进行变换。这更多的是选择约定,如果使用着色器,则布局较少。