corse你可以。光位置僅僅是傳遞給對象的着色器這樣的變量:
uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;
uniform sampler2D baseMap;
varying vec2 Texcoord;
varying vec3 ViewDirection;
varying vec3 LightDirection; <------ here is your light position
varying vec3 Normal;
void main(void)
{
vec3 fvLightDirection = normalize(LightDirection);
vec3 fvNormal = normalize(Normal);
float fNDotL = dot(fvNormal, fvLightDirection);
vec3 fvReflection = normalize(((2.0 * fvNormal) * fNDotL) - fvLightDirection);
vec3 fvViewDirection = normalize(ViewDirection);
float fRDotV = max(0.0, dot(fvReflection, fvViewDirection));
vec4 fvBaseColor = texture2D(baseMap, Texcoord);
vec4 fvTotalAmbient = fvAmbient * fvBaseColor;
vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor;
vec4 fvTotalSpecular = fvSpecular * (pow(fRDotV, fSpecularPower));
gl_FragColor = (fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular);
}
及其與紋理着色器和一個無限遠POIN的光。
如果您需要在對象之間移動光源,就像改變變量值一樣簡單。
他可能使用固定功能燈,因爲他在說'LIGHT0'。以這種方式使用的匈牙利符號實際上只是爲了混淆程序。你的着色器也缺少'#版本'行。 – Cubic
是的,你可能是對的。但FFP有點過時了,很久沒有忘記,所以我不那麼舒服。但如果他是一名學生,那麼它可能是一個案例。 – JAre
它並沒有被遺忘。大多數網絡上的OpenGL介紹以及幾乎所有(印刷版)書籍都是針對即時模式的FFP OpenGL編寫的。這當然不再有用,但它比OpenGL的體面介紹(以及一般的現代圖形編程,儘管DX方面的情況稍好一些)要容易得多。 – Cubic