圆环光照实例

首先,定义一个全局光:

 

float globalAmbient[4]={0.7f,0.7f,0.7f,1.0f};

再定义光照:

float initiaLightLoc[3]={5.0f,5.0f,0.0f};
float globalAmbient[4]={0.7f,0.7f,0.7f,1.0f};
float lightAmbient[4]={0.0f,0.0f,0.0f,1.0f};
float lightDiffuse[4]={1.0f,1.0f,1.0f,1.0f};
float lightSpecular[4]={1.0f,1.0f,1.0f,1.0f};

再定义材质:

float matA[4]={0.24725f,0.1995f,0.0745f,1.0f};
float matD[4]={0.75164f,0.60648f,0.f,1.0f};
float matS[4]={0.62828f,0.5558f,0.36607f,1.0f};
float matShi=51.2f;

修改顶点着色器:

#version 430

layout (location = 0) in vec3 vPosition;
layout (location = 1) in vec3 vNormal;
out vec4 varyingColor;

uniform vec4 globalAmbient;

struct PositionalLight
{
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    vec3 position;
};

struct Material
{
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    float shininess;
};

uniform PositionalLight light;
uniform Material material;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
uniform mat4 norm_matrix;

void main(void)
{
    vec4 P=mv_matrix*vec4(vPosition,1.0);
    vec3 N=normalize((norm_matrix*vec4(vNormal,1.0)).xyz);
    vec3 L=normalize(light.position-P.xyz);
    vec3 V=normalize(-P.xyz);
    vec3 R=reflect(-L,N);
    vec3 ambient=((globalAmbient*material.ambient)+(light.ambient*material.ambient)).xyz;
    vec3 diffuse=light.diffuse.xyz*material.diffuse.xyz*max(dot(N,L),0.0);
    vec3 specular=material.specular.xyz*light.specular.xyz*pow(max(dot(R,V),0.0f),material.shininess);
    varyingColor=vec4((ambient+diffuse+specular),1.0);
    gl_Position = proj_matrix * mv_matrix * vec4(vPosition,1.0);

}

片段着色器

#version 430

in vec4 varyingColor;
out vec4 fragColor;

void main(void)
{
	fragColor=varyingColor;
}

光照初始化(刷新):

void initiateLight(glm::mat4 vMatrix)
{
    lightPosV=glm::vec3(vMatrix*glm::vec4(currentLightPos,1.0));
    lightPos=glm::vec3(lightPosV.x,lightPosV.y,lightPosV.z);

    globalAmbLoc=glGetUniformLocation(renderingProgram,"globalAmbient");
    ambLoc=glGetUniformLocation(renderingProgram,"light.ambient");
    diffLoc=glGetUniformLocation(renderingProgram,"light.diffuse");
    specLoc=glGetUniformLocation(renderingProgram,"light.specular");
    posLoc=glGetUniformLocation(renderingProgram,"light.position");

    mAmbLoc=glGetUniformLocation(renderingProgram,"material.ambient");
    mDiffLoc=glGetUniformLocation(renderingProgram,"material.diffuse");
    mSpecLoc=glGetUniformLocation(renderingProgram,"material.specular");
    mShiLoc=glGetUniformLocation(renderingProgram,"material.shininess");

    glUniform4fv(globalAmbLoc,1,&globalAmbient[0]);
    glUniform4fv(ambLoc,1,&lightAmbient[0]);
    glUniform4fv(diffLoc,1,&lightDiffuse[0]);
    glUniform4fv(specLoc,1,&lightSpecular[0]);
    glUniform3fv(posLoc,1,&lightPos[0]);

    glUniform4fv(mAmbLoc,1,&matA[0]);
    glUniform4fv(mDiffLoc,1,&matD[0]);
    glUniform4fv(mSpecLoc,1,&matS[0]);
    glUniform1fv(mShiLoc,1,&matShi);

}

绘图主程序中添加:

initiateLight(scene.vMat);

最后是光照效果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值