美文网首页my-QT专栏
QT+OPenGL十九镜面反射效率调整

QT+OPenGL十九镜面反射效率调整

作者: c之气三段 | 来源:发表于2021-05-30 10:32 被阅读0次
    image.png

    这是之前的phong着色的镜面反射模型。
    但是这存在效率问题就是运算反射光线的开销比较大。虽然思想很正确但是浪费了显卡的效率。
    1977年James F. Blinn引入了Blinn-Phong着色优化了这个部分。


    image.png

    使用半程向量H来替代反向光线向量R,这样做虽然会导致效果出现一些不同(精确度降低了一些)但是可以通过参数的调整达到和phong着色相似的效果,且能适应各种情况。

    算法

    只需通过:
    光的方向向量和视线向量相加,然后将结果归一化(normalize),就能活得结果。


    image.png

    相信到这里着色器代码一看就懂了

    vec3 lightDir = normalize(lightPos - FragPos);
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 halfwayDir = normalize(lightDir + viewDir);
    float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);
    vec3 specular = lightColor * spec;
    

    shininess参数要比以前phong着色大几倍来达到之前的效果哦。

    shader前后对比:

     //计算镜面反射强度
       vec3 viewDir = normalize(cameraPos - worldPos);
       //vec3 reflectDir = reflect(-lightDir, normal);这是原phong
       vec3 halfwayDir =normalize(viewDir+lightDir);//这是Blinn phong
       //float specularStringth = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);原phong
       float specularStringth = pow(max(dot(normal, halfwayDir), 0.0), material.shininess);//blinn phong
    

    目录

    VSC++2019+QT+OpenGL
    QT+OpenGL一之绘制立方体(三角形图元)
    QT+OpenGL二之纹理贴图
    QT+OpenGL三之矩阵简解
    QT+OpenGL四之相机的移动和旋转
    QT+OpenGL五之绘制不同的模型(vao,vbo机制)
    QT+OpenGL六之天空盒
    QT+OpenGL七之使用EBO
    QT+OPenGL八之模型准备
    QT+OPenGL九之模型解码
    QT+OPenGL十之光照模型
    QT+OPenGL十一之漫反射和镜面反射贴图
    QT+OPenGL十二之定向光
    QT+OPenGL十三之真正的点光源和聚光灯
    QT+OPenGL十四之多光源混合的问题
    QT+OPenGL十五之深度缓冲区
    QT+OPenGL十六之模板缓冲区
    QT+OPenGL十七帧缓冲区(离屏渲染)
    QT+OPenGL十八抗锯齿
    QT+OPenGL十九镜面反射效率调整
    QT+OPenGL二十Gamma校正

    相关文章

      网友评论

        本文标题:QT+OPenGL十九镜面反射效率调整

        本文链接:https://www.haomeiwen.com/subject/ppupsltx.html