opengles法线贴图
来源:互联网 发布:新开淘宝每天流量100人 编辑:程序博客网 时间:2024/06/05 19:31
法线贴图:如果一个物体的表面粗糙不平,物体顶点的法线也就朝着各个不同的方向,所以物体看起来凹凸不平,要展现这样的物体
可以使用相当多的包含不同法线的顶点数据,这样做效率很低,一种高效的做法是:把法线坐标值内置于纹理图片中
法线贴图也是一张普通的纹理图片,和一般纹理图片的区别在于,法线贴图中的每个像素保存的是法线数据,一般通过高度图来生成
法线贴图,高度图是8位灰度图,颜色越深高度越低,颜色越浅高度越高。
参考:http://blog.csdn.net/zhangci226/article/details/5588226
效果图:
shader实现:
const char* vs ={"attribute vec3 inVertex;"//顶点坐标"attribute vec3 inNormal;"//法向量"attribute vec2 inTexCoord;"//纹理坐标"attribute vec3 inTangent;"// 切线坐标"uniform mat4 MVPMatrix;"//顶点总变换矩阵"uniform vec3 LightPosModel;"//光源位置"varying vec3 LightVec;""varying vec2 TexCoord;""void main()""{""gl_Position=MVPMatrix*vec4(inVertex,1);"//在模型空间中,计算灯光的方向"highp vec3 lightDirection=normalize(LightPosModel-vec3(inVertex));"//将灯的方向从模型空间,转化到切线(tangent)空间"highp vec3 bitangent=cross(inNormal,inTangent);"//法线和切线求叉积//构造TBN矩阵 http://blog.csdn.net/jxw167/article/details/58671953//http://blog.csdn.net/jxw167/article/details/58592875"highp mat3 tangentSpaceXform=mat3(inTangent,bitangent,inNormal);""LightVec=lightDirection*tangentSpaceXform;""TexCoord=inTexCoord;""}"};const char* ps ={"precision lowp float;""uniform sampler2D sBaseTex;""uniform sampler2D sNormalMap;""varying lowp vec3 LightVec;""varying mediump vec2 TexCoord;""void main()""{"//将像素值映射到[-1,1] TexCoord保存的是法线向量(x,y,z)"vec3 normal=texture2D(sNormalMap,TexCoord).rgb*2.0-1.0;""float lightIntensity=dot(LightVec,normal);"//求两向量的点积"vec3 texColor=texture2D(sBaseTex, TexCoord).rgb;""gl_FragColor=vec4(texColor*lightIntensity,1.0);""}"};渲染函数:
virtual void onRender(Program_BumpMap& shader,CELL3RDCamera& camera) { static float angle = 0; matrix4 matRot(1); matRot.rotateY(angle); matrix4 matTrans; matTrans.translate(0,5,0); matrix4 matScale(1); matScale.scale(0.3f,0.3f,0.3f); matrix4 matModel = matTrans * matRot * matScale; angle += 1.0f; float4 vMsLightPos = float4(50, 20, 40, 1);//光源位置 vMsLightPos = vMsLightPos * matModel; matrix4 MVP = camera._matProj * camera._matView * matModel ; _device.setUniformMatrix4fv(shader.MVPMatrix,1,false,MVP.data()); _device.setUniform3fv(shader.LightPosModel,1,&vMsLightPos.x); VertexBumpMap* vert = &_arVertexs.front(); _device.attributePointer(shader.inVertex, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), vert); _device.attributePointer(shader.inNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._normal); _device.attributePointer(shader.inTexCoord, 2, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._uv); _device.attributePointer(shader.inTangent, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._tangent); _device.drawElements(GL_TRIANGLES,_arFaces.size() * 3,GL_UNSIGNED_SHORT,&_arFaces.front()); }
阅读全文
0 0
- OpenGLES—法线贴图
- opengles法线贴图
- opengles法线贴图加反射
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- 法线贴图
- C++实现tab补全(Windows限定)
- 简化angular1依赖注入
- 剑指offer——重建二叉树
- 从零开始写设备树DTS
- fedora(linux)创建系统服务 程序开机自启 后台运行
- opengles法线贴图
- ORCAD导出文件【PDF原理图】
- CAS实现单点登录(SSO)过程浅析
- STL学习系列之二——序列容器(vector)
- ps -aux详细解释
- MySQL的if,case语句使用总结
- HDU1521
- MySql建表时出错ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that correspond
- AI的胜利,人类的荣耀