内容简介:OpenGL(十一) 可编程管线 基础光照 的实现
在OpenGL中创建 基础光照 ,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中。另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死。至于经典的 ambient+diffuse+specular 光照原理,不是本文的重点,就在shader中一笔带过了。
原理
通过函数
glm::mat4normalMatrix = glm::inverseTranspose(s_shaderData.model);
可以获取当前模型的法线矩阵。用来将法线信息从模型坐标转换为世界坐标。这个矩阵是随着模型的Transform改变而改变的,因此需要在Render时动态计算。
实现
在 基础光照 中,数据传递没什么特殊的,将 Normal 信息作为attribute传递到shader,将 NormalMatrix 作为uniform传递到shader。
//normalmatrix glm::mat4normalMatrix = glm::inverseTranspose(s_shaderData.model) glUniformMatrix4fv(s_shaderData.NMLocation,1,GL_FALSE,glm::value_ptr(normalMatrix)) // normal glEnableVertexAttribArray(s_shaderData.normalLocation); glVertexAttribPointer(s_shaderData.normalLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void*)(sizeof(float)*5));
vs中首先将法线转置到世界坐标,然后将其传递给fs。
//vs
attributevec3pos;
attributevec2texcoord;
attributevec3normal;
uniformmat4 M;
uniformmat4 V;
uniformmat4 P;
uniformmat4NM;
varyingvec3V_Normal;
varyingvec3V_WorldPos;
void main()
{
V_Normal = mat3(NM)*normal;
V_WorldPos = M * vec4(pos,1.0);
gl_Position=P*V*M*vec4(pos,1.0);
}
在fs中使用经典的pong公式做个最简单的效果。
varyingvec3V_Normal;
varyingvec3V_WorldPos;
void main()
{
vec3lightPos = vec3(10.0,10.0,0.0);
vec3 L = lightPos;
L = normalize(L);
vec3 n = normalize(V_Normal);
//ambient
vec4AmbientLightColor = vec4(0.2,0.2,0.2,1.0);
vec4AmbientMaterial = vec4(0.2,0.2,0.2,1.0);
vec4ambientColor = AmbientLightColor * AmbientMaterial;
//diffuse
vec4DiffuseLightColor = vec4(1.0,1.0,1.0,1.0);
vec4DiffuseMaterial = vec4(0.8,0.8,0.8,1.0);
vec4diffuseColor = DiffuseLightColor * DiffuseMaterial * max(0.0,dot(L,n));
//specular
vec3reflectDir = normalize(reflect(-L,n));
vec3viewDir = normalize(vec3(0.0)-V_WorldPos.xyz);
vec4SpecularLightColor = vec4(1.0,1.0,1.0,1.0);
vec4SpecularMaterial = vec4(1.0,1.0,1.0,1.0);
vec4specularColor = SpecularLightColor*SpecularMaterial*pow(max(0.0,dot(viewDir,reflectDir)),128);
gl_FragColor= ambientColor+diffuseColor+specularColor;
}
另外需要注意的是,有光照的模型通常需要打开深度测试,也需要记得将深度缓存清空。
//Open test glEnable(GL_DEPTH_TEST); //when render glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
总结
通过上面的代码,搭建基本框架。可以实现 基础光照 模型。如果需要添加其他参数效果,则需要增加Uniform传递的参数了。
本文出自松阳论道 转载必须注明出处
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 苏州地下管线有了“智慧地图”
- 尝试在 Android 中实现 PBR 管线:环境光照明
- Cocos2dx v3.x渲染管线流程
- Cocos2dx v3.x渲染管线流程
- 基于WebGL架构的ThingJS可视化平台—城市地下管线3D可视化
- 新医药 7大技术管线推动高校新药研发项目产业化,百年壹号获1.5亿元首轮融资
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Smashing Book
Jacob Gube、Dmitry Fadeev、Chris Spooner、Darius A Monsef IV、Alessandro Cattaneo、Steven Snell、David Leggett、Andrew Maier、Kayla Knight、Yves Peters、René Schmidt、Smashing Magazine editorial team、Vitaly Friedman、Sven Lennartz / 2009 / $ 29.90 / € 23.90
The Smashing Book is a printed book about best practices in modern Web design. The book shares technical tips and best practices on coding, usability and optimization and explores how to create succes......一起来看看 《The Smashing Book》 这本书的介绍吧!
随机密码生成器
多种字符组合密码
HEX CMYK 转换工具
HEX CMYK 互转工具