opengles立方体贴图
来源:互联网 发布:存货管理的数据分析 编辑:程序博客网 时间:2024/05/17 06:29
1,带高光效果的立方体贴图
2,不带高光效果的立方体贴图
shader实现:
const char* vs ={"attribute highp vec3 inVertex;"//高精度"attribute mediump vec3 inNormal;"//中等精度"uniform highp mat4 MVPMatrix;""uniform mediump mat4 ModelWorld;""uniform mediump vec3 EyePosModel;""varying mediump vec3 ReflectDir;""varying vec3 TextXYZ;""void main()""{""gl_Position=MVPMatrix*vec4(inVertex,1.0);"//入射光方向"mediump vec3 eyeDir=normalize(inVertex-EyePosModel);""TextXYZ=inNormal;"/*reflect(I,N)函数解析:根据入射光方向向量I,和顶点法向量N,计算反射光方向向量,其中I和N必须归一化,需要注意的是,这个I是指向顶点的,函数只对三元向量有效。*///计算反射光向量 尝试去掉 "ReflectDir=mat3(ModelWorld)*reflect(eyeDir,inNormal);"//不带高光效果//"ReflectDir=reflect(eyeDir,inNormal);""}"};const char* ps ={"precision lowp float;""uniform samplerCube sCubeMap;""varying vec3 TextXYZ;""varying mediump vec3 ReflectDir;""void main()""{"//使用顶点的法线作为UV坐标,使用场景:用于天空盒//"gl_FragColor=textureCube(sCubeMap,TextXYZ);"//使用法线和相机到顶点的向量,推导出入射光向量作为UV坐标,使用场景:用于物体反射周围环境颜色"gl_FragColor=textureCube(sCubeMap,ReflectDir);""}"};渲染函数
virtual void onRender(Program_Reflections& 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;matrix4 MVP = camera._matProj*camera._matView*matModel;matrix4 mv = camera._matView*matModel;matrix4 mvI = mv._inverse();float4 vEyePosModel;//为了保证模型在旋转的过程中有高光的效果,需要观察点坐标乘以模型变换的逆矩阵vEyePosModel = mvI*float4(0,0,0,1);//vEyePosModel = float4(0, 0, 0, 1);//不带高光效果_device.setUniformMatrix4fv(shader.MVPMatrix,1,false,MVP.data());_device.setUniformMatrix4fv(shader.ModelWorld,1,false,matModel.data());_device.setUniform3fv(shader.EyePosModel,1,&vEyePosModel.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.drawElements(GL_TRIANGLES,_arFaces.size()*3,GL_UNSIGNED_SHORT,&_arFaces.front()); }
创建立方体纹理
/** * 创建一个立体文理 */ CELL::TextureCubeId CELLOpenGL::createCubeTextureFromFile( const char* files[] ) { TextureCubeId texId; glGenTextures(1, &texId._texture); glBindTexture(GL_TEXTURE_CUBE_MAP, texId._texture); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER,GL_LINEAR); unsigned arTarget[6] = { GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, }; for (size_t i = 0 ;i < 6 ; ++ i) { unsigned length = 0; char* buffer = readFile(files[i],length); if (buffer == 0 || length == 0) { return texId; } CELLImageReader reader((char*)buffer,(int)length); if(!reader.parse()) { delete [] buffer; return texId; } ImageHeader*header = (ImageHeader*)reader.getCursor(); texId._width = (unsigned)header->getWidth(); texId._height = (unsigned)header->getHeight(); GLenum intFormat = getInternalFormat(reader.getFormat()); GLenum srcType = getSrcType(reader.getFormat()); GLint srcFmt = getSrcFormat(reader.getFormat()); GLint level = 0; while(!reader.eof()) { header = (ImageHeader*)reader.getCursor(); reader.skip(sizeof(ImageHeader)); char* pixel = reader.getCursor(); glTexImage2D( arTarget[i], level, intFormat, header->getWidth(), header->getHeight(), 0, srcFmt, srcType, pixel ); ++level; reader.skip(header->getLength()); } delete []buffer; } return texId; }
图片读取类
class CELLImageReader { public: class FileHeader { public: char _magic[16]; char _format[32]; }; public: CELLImageReader(char* data,int length) :_data(data) ,_length(length) ,_curPtr(0) { } bool parse() { memcpy(&_header,_data,sizeof(_header)); if (strcmp(_header._magic,"CELL.Image") != 0) { return false; } else { _curPtr += sizeof(_header); return true; } } char* getFormat() { return _header._format; } void clear() { _curPtr = 0; } char* getCursor() { return _data + _curPtr; } void skip(int length) { _curPtr += length; } bool eof() { assert(_curPtr <= _length); return _curPtr >= _length; } protected: FileHeader _header; char* _data; int _curPtr; int _length; };
立方体贴图原理:http://blog.csdn.net/huangzhipeng/article/details/7957233
阅读全文
0 0
- opengles立方体贴图
- 立方体贴图
- opengles绘制立方体
- OpenGLES—法线贴图
- opengles法线贴图
- OpenGL立方体贴图
- 立方体纹理贴图代码
- 简单立方体纹理贴图
- 立方体贴图(Cubemap)
- opengles法线贴图加反射
- OpenGL 核心技术之立方体贴图
- (149)环境立方体贴图
- OpenGLES两种方式画立方体
- OpenGLES demo - 12. 材质贴图 Texture Mapping
- OpenGL纹理贴图 旋转的立方体
- WinCE OpenGL绘制立方体和纹理贴图
- 3D立方体纹理贴图源代码
- Vision引擎中特殊效果 - 立方体贴图介绍
- UE4-利用UMG动画制作场景切换Loading进度条
- JQ 获取祖、父、兄、子节点方法
- iOS 开发系统自带摇一摇
- php 发送qq邮件
- Ubuntu系统下汉字显示为方框解决方法
- opengles立方体贴图
- easyui设置文本框可读
- EJB定时器
- Android源码基础解析之异步任务AsyncTask
- myeclipse10中文破解版10.7.1 官方正式版【32/64位】
- sql中的where 1<>1 和where 1=1的区别
- cookie
- 事故分析2
- Kotlin学习记录(三)—— 子线程获取数据,实现简单ListView