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

原创粉丝点击