游戏引擎开发 – 1

从今天开始,想连载一段时间游戏引擎开发的相关内容,这里想先说下,由于服务器配置真的比较低,所以由于带宽和性能问题,造成的博客打不开的情况,敬请谅解,等有盈利了,再来改善服务器的配置情况。

  • 游戏引擎开篇
  • 一个游戏引擎包括了很多个部分,这里我们首先从渲染以及跨平台考虑,所以选择了OpenGLES 2.0,3.0版本虽然在性能上、以及纹理处理上有非常多的优化,但是目前很多设备都不兼容,所以考虑兼容性的情况,选择OpenGLES 2.0。我这次希望完成的这个引擎主要想可以依托它可以较快速的实现SLG类型的游戏,当然可能开发的过程是艰辛而漫长的阶段,但是还是希望可以最终完成一个自研的跨平台的游戏引擎。

  • iOS opengles使用
  • // .h
    #ifndef MainViewController_h
    #define MainViewController_h
    #import 
    #import 
    
    
    
    @interface MainViewController : GLKViewController {
        
    }
    @property (nonatomic , strong) GLKBaseEffect* mEffect;
    @property (nonatomic, retain) EAGLContext *mContext;
    @end
    
    #endif /* MainViewController_h */
    
    // .m
    #import "MainViewController.h"
    
    @implementation MainViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        //
        
    }
    
    - (void)loadView {
        self.view = [[ GLKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.view.backgroundColor = [UIColor blackColor];
        self.mContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        GLKView *glkView = (GLKView *)self.view;
        glkView.context = self.mContext;
        glkView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
        [EAGLContext setCurrentContext:self.mContext];
        // 顶点数据,前三个是顶点坐标,后面两个是纹理坐标
        GLfloat squareVertexData[] =
        {
            0.5, -0.5, 0.0f,    1.0f, 0.0f, // 右下
            0.5, 0.5, -0.0f,    1.0f, 1.0f, // 右上
            -0.5, 0.5, 0.0f,    0.0f, 1.0f, // 左上
            
            0.5, -0.5, 0.0f,    1.0f, 0.0f, // 右下
            -0.5, 0.5, 0.0f,    0.0f, 1.0f, // 左上
            -0.5, -0.5, 0.0f,   0.0f, 0.0f, // 左下
        };
        
        GLuint buffer;
        glGenBuffers(1, &buffer);
        glBindBuffer(GL_ARRAY_BUFFER, buffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData, GL_STATIC_DRAW);
        glEnableVertexAttribArray(GLKVertexAttribPosition); // 顶点数据缓存
        glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 0);
        glEnableVertexAttribArray(GLKVertexAttribTexCoord0); // 纹理
        glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 3);
        
        NSString* filePath = [[NSBundle mainBundle] pathForResource:@"yuan" ofType:@"png"];
        NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:@(1), GLKTextureLoaderOriginBottomLeft, nil]; // GLKTextureLoaderOriginBottomLeft 纹理坐标系是相反的
        GLKTextureInfo* textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];
        
        //着色器
        self.mEffect = [[GLKBaseEffect alloc] init];
        self.mEffect.texture2d0.enabled = GL_TRUE;
        self.mEffect.texture2d0.name = textureInfo.name;
    }
    
    
    /**
     *  渲染场景代码
     */
    - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        //启动着色器
        [self.mEffect prepareToDraw];
        glDrawArrays(GL_TRIANGLES, 0, 6);
        
        // 执行逻辑
        
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end