OpenGL ES 学习教程(9):油腻的效果Lighting Maps高光贴图
像上图那样油腻的师姐,原画们应该不会把全身都弄成油腻的效果。可能只会做一部分,毕竟有的地方需要用其他的方式去表现,所以对同一个物体,有些地方需要 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; 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