我刚开始写一个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
答案 0 :(得分:4)
您无需传递相机位置,因为OpenGL中没有相机。
在眼睛/世界空间中执行照明计算,即在与模型视图矩阵相乘之后,其还执行“相机定位”。所以实际上你已经有了正确的东西。使用ftransform()
效率有点低,因为你正在做的事情的一半(gl_ModelviewMatrix * gl_Vertex
,你可以通过添加gl_Position = gl_ProjectionMatrix * eyeVec
将其变成ftransform)
因此,如果你的“相机”转换时你的灯光似乎移动了,你就不会正确地改变灯光的位置。既可以预先计算变换后的光位置,也可以在着色器中对它们进行变换。这更多的是选择约定,如果使用着色器,则布局较少。