phong模型和blinnphong模型简述
简介
phong 和 blinnphong 都是比较常用的光照模型
参考链接
https://github.com/Richbabe/Phong-BlinnPhong_Unity 非常好讲的
https://blog.csdn.net/weixin_34321977/article/details/93246573 一般般
https://blog.csdn.net/qq_32974399/article/details/107096490 reflect算法的图解, 非常好
https://blog.csdn.net/yuebaidada/article/details/90749299 phong模型关于 \((R\dot V)^n\) 关于n的讲解非常好, 随着n增大, 离镜面反射的区域将迅速缩小
phong Image

blinn phong

code phong
#version 420
out vec4 FragColor;
in vec3 pos;
in vec3 color;
uniform int colormode = 1;
uniform int drawmode = 1;
void main() {
if(colormode == 0){
FragColor = vec4(color,1.0);
} else if (colormode == 1) {
if(drawmode == 0){
FragColor = vec4(0.25,0.25,0.25,1.0);
} else {
vec3 n = normalize(cross(dFdx(pos),dFdy(pos)));
vec3 lposition = vec3(0.0f,0.0f, 20f);
vec3 viewposition = vec3(0.0f,0.0f, 20f);
float f_ambient = 0.4f;
float f_spec = 0.7f;
// ambient
vec3 light = vec3(1f, 1f, 1f);
vec3 ambient = light * f_ambient;
// diffuse
vec3 lightDir = normalize(lposition - pos);
vec3 diff = ambient * max(0.0, dot(n, lightDir));
// specular
vec3 viewDir = normalize(viewposition - pos);
vec3 reflectDir = reflect(-lightDir, n);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 16.0f) * f_spec;
vec3 specular = ambient * spec;
vec3 result = ambient + diff + specular;
FragColor = vec4(result, 1.0);
}
} else {
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
}
code blinnphong
#version 420
out vec4 FragColor;
in vec3 pos;
in vec3 color;
uniform int colormode = 1;
uniform int drawmode = 1;
void main() {
if(colormode == 0){
FragColor = vec4(color,1.0);
} else if (colormode == 1) {
if(drawmode == 0){
FragColor = vec4(0.25,0.25,0.25,1.0);
} else {
vec3 n = normalize(cross(dFdx(pos),dFdy(pos)));
vec3 lposition = vec3(0.0f,0f, 20f);
vec3 viewposition = vec3(0.0f,0.0f, 20f);
float f_ambient = 0.4f;
float f_spec = 0.7f;
// ambient
vec3 light = vec3(1f, 1f, 1f);
vec3 ambient = light * f_ambient;
// diffuse
vec3 lightDir = normalize(lposition - pos);
vec3 diff = ambient * max(0.0, dot(n, lightDir));
// specular
vec3 viewDir = normalize(viewposition - pos);
//vec3 reflectDir = reflect(-lightDir, n);
vec3 half = normalize(lightDir+viewDir);
//vec3 half = normalize(lightDir),motmalize(viewDir);
float spec = pow(max(dot(n, half), 0.0), 256.0f) ;
vec3 specular = light * spec * f_spec;
vec3 result = ambient + diff + specular;
FragColor = vec4(result, 1.0);
}
} else {
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
}
简述原理 phong

float spec = pow(max(dot(viewDir, reflectDir), 0.0), 16.0f) * f_spec;
简单来说就是R和V的向量夹角越小. 反射效果越
简述原理 blinnphong

float spec = pow(max(dot(n, half), 0.0), 256.0f) ;
简单来说就是,V和H向量之间的夹角. H就是L+Eye向量的单位向量. 简单而言是为了减少计算.
phong模型和blinnphong模型简述的更多相关文章
- 复杂领域的Cynefin模型和Stacey模型
最近好奇“复杂系统”,收集了点资料,本文关于Cynefin模型和Stacey模型.图文转自互联网后稍做修改. Cynefin模型提供一个从因果关系复杂情度来分析当前情况而作决定的框架,提出有五个领域: ...
- 文本信息检索——布尔模型和TF-IDF模型
文本信息检索--布尔模型和TF-IDF模型 1. 布尔模型 如要检索"布尔检索"或"概率检索"但不包括"向量检索"方面的文档,其相应的查 ...
- 贫血模型和DDD模型
贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...
- 并发编程:Actors 模型和 CSP 模型
https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27
- 三分钟掌控Actor模型和CSP模型
回顾一下前文<三分钟掌握共享内存模型和 Actor模型> Actor vs CSP模型 传统多线程的的共享内存(ShareMemory)模型使用lock,condition等同步原语来强行 ...
- Inception模型和Residual模型卷积操作的keras实现
Inception模型和Residual残差模型是卷积神经网络中对卷积升级的两个操作. 一. Inception模型(by google) 这个模型的trick是将大卷积核变成小卷积核,将多个卷积核 ...
- Actor模型和CSP模型的区别
引用至:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的C ...
- NLP中word2vec的CBOW模型和Skip-Gram模型
参考:tensorflow_manual_cn.pdf Page83 例子(数据集): the quick brown fox jumped over the lazy dog. (1)CBO ...
- 比较一下Linux下的Epoll模型和select模型的区别
一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Sel ...
- 利用生产者消费者模型和MQ模型写一个自己的日志系统-并发设计里一定会用到的手段
一:前言 写这个程序主要是用来理解生产者消费者模型,以及通过这个Demo来理解Redis的单线程取原子任务是怎么实现的和巩固一下并发相关的知识:这个虽然是个Demo,但是只要稍加改下Appender部 ...
随机推荐
- MySQL的并发问题的解决方案
怎么解决脏读.不可重复读.幻读这些问题呢?其实有两种可选的解决方案 方案一.读操作利用MVCC(多版本并发控制),写操作进行加锁. 所谓的MVCC,就是生成一个ReadView,通过ReadView找 ...
- layui动态渲染select表单、初始化默认值、change事件监听等
layui动态渲染,初始化默认值 var html = ''; html += '<select name="" lay-search lay-verify="re ...
- 关于composer报错The openssl extension is required for SSL/TLS protection but is not available问题
今天使用composer的时候得到了这个错误: The openssl extension is required for SSL/TLS protection but is not availabl ...
- JDK、tomcat、MySQL安装部署
大数据开发实战 计算机基础普及 [计算机基础与网络.1](动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541( ...
- Manus爆火,我发现平替开源项目OpenManus带你玩转AI智能体开发,无需邀请码!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "在AI技术日新月异的今天,OpenManus像一把打开智能体开发大门的万能钥匙, ...
- PC端自动化测试实战教程-5-pywinauto 操作PC端应用程序窗口 - 下篇(详细教程)
1.简介 上一篇宏哥主要讲解和介绍了如何获取PC端应用程序窗口信息和如何连接窗口对其进行操作的常用的几种方法.今天宏哥接着讲解和分享一下窗口的基本操作:最大化.最小化.恢复正常.关闭窗口.获取窗口状态 ...
- 在 .NET 中使用 Sqids 快速的为数字 ID 披上神秘短串,轻松隐藏敏感数字!
前言 在当今数字化时代,数据的安全性和隐私性至关重要.随着网络应用的不断发展,数字 ID 作为数据标识和访问控制的关键元素,其保护显得尤为重要.然而,传统的数字 ID 往往直接暴露了一些敏感信息,如顺 ...
- CUDA原子操作
这节主要涉及到一个多线程情况下存在的数据竞争问题 -- 多个线程同时访问共享数据时,由于没有正确的同步机制,导致数据出现不一致的情况. C/C++ 多线程中,可以通过互斥锁(mutex).原子操作(a ...
- The Eclipse executable launcher was unable to locate its companion shared library
win10,笔者是安装eclipse2018.03的情况下,想安装java2019EE遇到的路径问题 1.解决方法 找到配置文件 打开,用记事本打开的话会糊成一行,建议用其他方式打开,例如笔者所用的N ...
- 服务器接口附件限制【1M】解决办法
一.业务场景: 在后端与手机小程序端接口传附件时,发现经过云服务器的接口交互,附件超过1M就会有如下提示: <html> <head><title> ...