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

发表于2017-11-22
评论0 1.7k浏览


像上图那样油腻的师姐,原画们应该不会把全身都弄成油腻的效果。可能只会做一部分,毕竟有的地方需要用其他的方式去表现,所以对同一个物体,有些地方需要 Specular Ligting 镜面高光,有些地方却只要 Diffuse Lighting 漫反射光。


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

struct Material  //替换顶点色    
{    
    vec3 ambient;    
    vec3 diffuse;    
    vec3 specular;    
    float shininess;    
};    
uniform Material m_material;  

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


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


注意:

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


在 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);  

运行程序效果


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


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

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


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

glUniform3f(m_programCube.m_matSpecular, 0.0f, 0.0f, 0.0f);  

运行程序效果


再添加一个 specular 贴图。



在 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://pan.baidu.com/s/1kUtB7z5 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引