逐像素、逐顶点光照差异对比

本文对比了逐像素和逐顶点光照两种技术的区别,重点介绍了这两种技术在光照计算过程中的不同实现方式,以及它们在非精细模型上表现出来的效果差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逐像素、逐顶点光照差异

逐像素、逐顶点光照差异性主要体现在对于非精细模型,在执行逐顶点光照时,由于点距较大,在进行颜色线性插值的过程中,无法精细平滑过渡,导致效果变差。

1、  逐像素(光照计算过程在片元着色器中完成)
顶点着色

varying vec4 diffuse,ambient;

varying vec3 normal,lightDir,viewDir;

void main()

{  

      normal = normalize(gl_NormalMatrix * gl_Normal);

     

      lightDir = normalize(vec3(gl_LightSource[0].position));

 

      //相机观察向量,顶点->人眼,用于计算镜面反射

      viewDir = normalize(gl_LightSource[0].halfVector.xyz);

 

      diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;

      ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;

      ambient += gl_LightModel.ambient * gl_FrontMaterial.ambient;//全局环境光

       

      gl_Position = ftransform();

    }

片元着色

varying vec4 diffuse,ambient;

varying vec3 normal,lightDir, viewDir;

void main()

{

      vec3 n,viewVec;

      float dfse,spec;

     

      vec4 color = ambient;

     

      n = normalize(normal);

   

      dfse = max(dot(n,lightDir),0.0); //漫反射

     

     if (dfse > 0.0)   //没有漫反射,镜面反射也不存在

{

         color += diffuse * dfse;

         viewVec = normalize(viewDir);

         spec = max(dot(n, viewVec),0.0); //镜面反射

 

         color += gl_FrontMaterial.specular *

               gl_LightSource[0].specular *

               pow(spec, gl_FrontMaterial.shininess);

      }

      gl_FragColor = color;

   }

2、  逐顶点光照(光照计算过程在顶点着色器中完成)

顶点着色

varying vec4 color;

void main()

{  

vec4 diffuse,ambient;

vec3 normal,lightDir, viewDir;

 

     normal = normalize(gl_NormalMatrix * gl_Normal);

     

     lightDir = normalize(vec3(gl_LightSource[0].position));

 

      //相机观察向量,顶点->人眼,用于计算镜面反射

      viewDir = normalize(gl_LightSource[0].halfVector.xyz);

 

      diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;

      ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;

      ambient += gl_LightModel.ambient * gl_FrontMaterial.ambient;//全局环境光

       

      float dfse,spec;    

      color = ambient;

      dfse = max(dot(normal,lightDir),0.0); //漫反射

     

     if (dfse > 0.0)   //没有漫反射,镜面反射也不存在

{

         color += diffuse * dfse;

         spec = max(dot(normal, viewDir),0.0); //镜面反射

 

         color += gl_FrontMaterial.specular *

               gl_LightSource[0].specular *

               pow(spec, gl_FrontMaterial.shininess);

      }

      gl_Position = ftransform();

   }

片元着色

varying vec4 color;

void main()

{     

      gl_FragColor = color;

   }

 

效果对比图(逐像素、逐顶点)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值