您的位置:首页 > 编程语言

场景中多个点光源的着色器GLSL代码

2014-12-20 11:25 295 查看
//-------------------------------------------------------------------
// 顶点光照
// 顶点着色器的代码
const int maxLightCount = 32;
varying vec4 v_fragmentColor;
varying vec2 v_texcoord;
attribute vec4 vPosition;
attribute vec4 vNormal;
attribute vec2 vTexCoord;
uniform vec4 vCameraPos;
uniform mat4 MvpMatrix;
uniform bool bEnabled[maxLightCount];
uniform vec4 vLightPos[maxLightCount];
uniform vec4 vLightClolor[maxLightCount];
uniform vec4 vLightAttenuation[maxLightCount];
void main() {
gl_Position = MvpMatrix * vPosition;
vec4 vEye = vCameraPos - vPosition;
vec4 vColour = vec4(0.0);
for(int i=0; i<maxLightCount; i++){
if(bEnabled[i] == false){
continue;
}
vec4 lightDir = normalize(vLightPos[i]-vPosition);
vec4 halfVector=normalize(lightDir+vEye);
float att = 1.0;
if(vLightAttenuation[i].w > 0.0){
float d = length(vLightPos[i]-vPosition);
att = 1.0/(vLightAttenuation[i].x + vLightAttenuation[i].y*d + vLightAttenuation[i].z*d*d);
}
float nDotVP = max(0.0, dot(vNormal, lightDir));
float nDotHV = max(0.0, dot(vNormal, halfVector));
float pf = 0.0;
if(nDotVP > 0.0){
pf = pow(nDotHV, 10.0);
}
float fValue = (nDotVP+0.3+pf)*att;
vec4 vColorIn = vec4(fValue*vLightClolor[i].x, fValue*vLightClolor[i].y, fValue*vLightClolor[i].z, 1.0);
vColour += vColorIn;
}
v_fragmentColor = vColour;
v_texcoord = vTexCoord;
}
// 片元着色器的代码
precision mediump float;
varying vec4 v_fragmentColor;
varying vec2 v_texcoord;
uniform sampler2D Texture;
void main() {
gl_FragColor = texture2D(Texture, v_texcoord)*v_fragmentColor;
}
//-------------------------------------------------------------------
// 逐像素光照
// 顶点着色器
varying vec2 v_texcoord;
varying vec4 v_nomal;
varying vec4 v_position;
varying vec4 v_eye;
attribute vec4 vNormal;
attribute vec4 vPosition;
attribute vec2 vTexCoord;
uniform vec4 vCameraPos;
uniform mat4 MvpMatrix;
void main() {
gl_Position = MvpMatrix * vPosition;
v_position = vPosition;
v_nomal = vNormal;
v_eye = vCameraPos - vPosition;
v_texcoord = vTexCoord;
}
// 片元着色器
precision mediump float;
const int maxLightCount = 32;
varying vec2 v_texcoord;
varying vec4 v_nomal;
varying vec4 v_position;
varying vec4 v_eye;
uniform sampler2D Texture;
uniform float fTextureDraw;
uniform float fAddRender;
uniform bool bEnabled[maxLightCount];
uniform vec4 vLightPos[maxLightCount];
uniform vec4 vLightClolor[maxLightCount];
uniform vec4 vLightAttenuation[maxLightCount];
void main()
{
vec4 vColour = vec4(0.0);
for(int i=0; i<maxLightCount; i++){
if(bEnabled[i] == false){
continue;
}
vec4 lightDir = normalize(vLightPos[i]-v_position);
vec4 halfVector=normalize(lightDir+v_eye);
float att = 1.0;
if(vLightAttenuation[i].w > 0.0){
float d = length(vLightPos[i]-v_position);
att = 1.0/(vLightAttenuation[i].x + vLightAttenuation[i].y*d + vLightAttenuation[i].z*d*d);
}
float nDotVP = max(0.0, dot(v_nomal, lightDir));
float nDotHV = max(0.0, dot(v_nomal, halfVector));
float pf = 0.0;
if(nDotVP > 0.0){
pf = pow(nDotHV, 10.0);
}
float fValue = (nDotVP+0.3+pf)*att;
vec4 vColorIn = vec4(fValue*vLightClolor[i].x, fValue*vLightClolor[i].y, fValue*vLightClolor[i].z, 1.0);
vColour += vColorIn;
}
gl_FragColor = texture2D(Texture, v_texcoord)*vColour;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐