欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

OpenGL ES天空盒子效果

程序员文章站 2022-06-25 08:14:11
一、理解 利用GLKBaseEffect,自定义顶点着色器和片元着色器,结合天空盒子,展示效果 二、技术代码 CCSkyBoxEffect:天空盒子效果类; CCSkyboxShader.vsh:顶点着色器; CCSkyboxShader.fsh:片元着色器; //立方体场景贴图纹理处理及顶点数据处 ......

一、理解

利用glkbaseeffect,自定义顶点着色器和片元着色器,结合天空盒子,展示效果

二、技术代码

ccskyboxeffect:天空盒子效果类;

ccskyboxshader.vsh:顶点着色器;

ccskyboxshader.fsh:片元着色器;

 

//立方体场景贴图纹理处理及顶点数据处理

- (id)init
{
    self = [super init];
    if (self) {
        _texturecubemap = [[glkeffectpropertytexture alloc] init];
        //是否使用原始纹理
        _texturecubemap.enabled = yes;
        //采样纹理的opengl名称
        _texturecubemap.name = 0;
        //设置纹理类型:立方体贴图
        _texturecubemap.target = glktexturetargetcubemap;
        /*纹理用于计算其输出片段颜色的模式
         glktextureenvmodereplace, 输出颜色由从纹理获取的颜色.忽略输入的颜色
         glktextureenvmodemodulate, 输出颜色是通过将纹理颜色与输入颜色来计算所得
         glktextureenvmodedecal,输出颜色是通过使用纹理的alpha组件来混合纹理颜色和输入颜色来计算的。
         */
        _texturecubemap.envmode = glktextureenvmodereplace;
        
        _transform = [[glkeffectpropertytransform alloc] init];
        self.center = glkvector3make(0, 0, 0);
        self.xsize = 1.0;
        self.ysize = 1.0;
        self.zsize = 1.0;
        
        //立方体的8个顶点
        const float vertices[ccskyboxnumcoords] = {
            -0.5, -0.5,  0.5,
            0.5, -0.5,  0.5,
            -0.5,  0.5,  0.5,
            0.5,  0.5,  0.5,
            -0.5, -0.5, -0.5,
            0.5, -0.5, -0.5,
            -0.5,  0.5, -0.5,
            0.5,  0.5, -0.5
        };
        //创建缓存对象,并返回标志符
        glgenbuffers(1, &vertexbufferid);
        //绑定缓存对象到指定缓存区:顶点
        glbindbuffer(gl_array_buffer, vertexbufferid);
        //将数据拷贝到缓存对象中
        glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);
        
        //绘制立方体的三角形带索引
        const glubyte indices[ccskyboxnumvertexindices] = {
            1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1, 2
        };
        //开辟索引缓存并复制索引数据到缓存区
        glgenbuffers(1, &indexbufferid);
        glbindbuffer(gl_element_array_buffer, indexbufferid);
        glbufferdata(gl_element_array_buffer, sizeof(indices), indices, gl_static_draw);
    }
    return self;
}

 

//坐标实时调整

- (void)setmatrixs
{
    const glfloat aspectratio = (glfloat)(self.view.bounds.size.width)/(glfloat)(self.view.bounds.size.height);
    
    self.baseeffect.transform.projectionmatrix = glkmatrix4makeperspective(glkmathdegreestoradians(85.0), aspectratio, 0.1, 20.0);
    
    //获取世界坐标系到矩阵中
    self.baseeffect.transform.modelviewmatrix = glkmatrix4makelookat(self.eyeposition.x, self.eyeposition.y, self.eyeposition.z, self.lookatposition.x, self.lookatposition.y, self.lookatposition.z, self.upvector.x, self.upvector.y, self.upvector.z);
    
    //增加飞机旋转角度
    self.angle += 0.01;
    //调整脑袋位置
    self.eyeposition = glkvector3make(-5.0*sinf(self.angle), -5.0, -5.0*cosf(self.angle));
    //调整物体位置
    self.lookatposition = glkvector3make(0.0, 1.5+-5.0*sinf(0.3*self.angle), 0.0);
}

 

三、效果图

OpenGL ES天空盒子效果

 

 

github