OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第1张图片


去哪里寻找,油腻的师姐。

广告总是在脑子里绕来绕去。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

虽然说师姐是油腻的,但是原画们也不会把全身都弄成油腻的效果。皮肤是油腻的,可能是涂多了护肤品精油,但是头发和衣服也油腻的话,那就可能这个人是修汽车的。

所以对同一个物体,有些地方需要 Specular Ligting 镜面高光,有些地方却只要 Diffuse Lighting 漫反射光。

在上一篇

OpenGL ES 学习教程(八) 精密控制光照元素的 Material 材质系统

里面我们定义了一个 Struct Material (GLProgram_Cube.h Line:102) ,用来替代顶点色。

struct Material  //替换顶点色  
{  
    vec3 ambient;  
    vec3 diffuse;  
    vec3 specular;  
    float shininess;  
};  
uniform Material m_material;
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

那么在这一篇里面,我用 一个纹理 替代 diffuse 颜色值,来模拟更真实的 木箱子 的效果。

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第2张图片

因为 ambient 颜色值 绝大多数情况下都是和 diffuse 颜色值相同,所以这里 ambient 就不再单独用一个纹理。


注意:

GLES 2.0 的 GLSL版本是 1.0 版本,该版本不支持 sample2D 放在 struct 中。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

在 Vertex Shader 中添加 UV  ( GLProgram_Cube.h Line 87 )

attribute vec2 m_uv;
varying vec2 m_outUV;


在 Fragment Shader 中添加 sample2D  ( GLProgram_Cube.h Line 118 )

uniform sampler2D m_diffusetexture;

在代码中传入 UV ,然后绑定 Texture ( MyApp.h Line 114 )

//传入UV;
glVertexAttribPointer(m_programCube.m_uv, 2, GL_FLOAT, false, sizeof(glm::vec2), uv);

//传入纹理
glUniform1i(m_programCube.m_diffusetexture, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_diffusetexture2D->m_textureId);

运行程序效果

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第3张图片


添加到箱子上的光发亮了!这里只使用了一个 diffuse 贴图。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

但是注意到,箱子本体是木质的,只是外面有一层铁皮。 铁皮是会发光的,但是木头是不会发光的。

所以需要对 木箱 分两部分处理,一部分是 diffuse 贴图,没有 镜面高光效果,一部分是 specular 贴图,有镜面高光效果。


首先来去掉 镜面高光效果,只需要 设置 材质中的 specular 为 0 ( MyApp.h Line 105 )

glUniform3f(m_programCube.m_matSpecular, 0.0f, 0.0f, 0.0f);
运行程序效果

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第4张图片

再添加一个 specular 贴图。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第5张图片


在 Fragment Shader 中添加 ( GLProgram_Cube.h Line 119 )

uniform sampler2D m_speculartexture;

传入纹理 ( MyApp.h Line 118 )

//传入纹理
glUniform1i(m_programCube.m_diffusetexture, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_diffusetexture2D->m_textureId);

glUniform1i(m_programCube.m_speculartexture, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_speculartexture2D->m_textureId);

程序运行结果 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

OpenGL ES 学习教程(九) 油腻的效果 Lighting Maps 高光贴图_第6张图片


示例工程下载:

http://pan.baidu.com/s/1kUtB7z5


你可能感兴趣的:(OpenGL,ES,学习教程)