-1

我刚开始写一个 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,但是如何以及在哪里放置这个值?

附言。我正在使用opengl 2.0

4

1 回答 1

4

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

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

因此,如果您的“相机”变换时灯光似乎在移动,则说明您没有正确变换灯光的位置。要么预先计算转换后的灯光位置,要么在着色器中也转换它们。如果使用着色器,这更多的是选择的约定,更少的约束。

于 2011-05-26T22:06:18.297 回答