cocos2d-x游戏引擎核心之四——绘图原理和绘图技巧

一、OpenGL基础

  游戏引擎是对底层绘图接口的包装,Cocos2d-x 也一样,它是对不同平台下 OpenGL 的包装。OpenGL 全称为 Open Graphics Library,是一个开放的、跨平台的高性能图形接口。OpenGL ES 则是 OpenGL 在移动设备上的衍生版本,具备与 OpenGL 一致的结构,包含了常用的图形功能。Cocos2d-x 就是一个基于 OpenGL 的游戏引擎,因此它的绘图部分完全由 OpenGL 实现。OpenGL 是一个基于 C 语言的三维图形 API,基本功能包含绘制几何图形、变换、着色、光照、贴图等。除了基本功能,OpenGL还提供了诸如曲面图元、光栅操作、景深、shader 编程等高级功能。

(1)状态机:

  OpenGL 是一个基于状态的绘图模型,我们把这种模型称为状态机。为了正确地绘制图形,我们需要把 OpenGL 设置到合适的状态,然后调用绘图指令。(绘图流程和状态机优势)。

(2)坐标系:OpenGL 是一个三维图形接口,在程序中使用右手三维坐标系。

(3)渲染流水线:

  当我们把绘制的图形传递给 OpenGL 后,OpenGL 还要进行许多操作才能完成 3D 空间到屏幕的投影。通常,渲染流水线过程
有如下几步:显示列表、求值器、顶点装配、像素操作、纹理装配、光栅化和片断操作等。OpenGL 从 2.0 版本开始引入了可编程着色器(shader)。

(4)绘图函数:

(5)矩阵与变换:OpenGL 对顶点进行的处理实际上可以归纳为接受顶点数据、进行投影、得到变换后的顶点数据这 3 个步骤。

在计算机中,坐标变换是通过矩阵乘法实现的。

注:详细参见《cocos2d-x高级开发教程》、《OpenGL编程指南》

二、Cocos2d-x绘图原理

void CCSprite::draw(void)
{
    //1. 初始准备
    CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");

    CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");

    CC_NODE_DRAW_SETUP();

    //2. 颜色混合函数
    ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );

    //3. 绑定纹理
    if (m_pobTexture != NULL)
    {
        ccGLBindTexture2D( m_pobTexture->getName() );
    }
    else
    {
        ccGLBindTexture2D(0);
    }

    //
    // Attributes
    //
    //4. 绘图
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );

#define kQuadSize sizeof(m_sQuad.bl)
    long offset = (long)&m_sQuad;

    // vertex
    //顶点坐标
    int diff = offsetof( ccV3F_C4B_T2F, vertices);
    glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));

    // texCoods
    //纹理坐标
    diff = offsetof( ccV3F_C4B_T2F, texCoords);
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));

    // color
    //顶点颜色
    diff = offsetof( ccV3F_C4B_T2F, colors);
    glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));

    //绘制图形
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    CHECK_GL_ERROR_DEBUG();

//5. 调试相关的处理
#if CC_SPRITE_DEBUG_DRAW == 1
    //调试模式 1:绘制边框
    // draw bounding box
    CCPoint vertices[4]={
        ccp(m_sQuad.tl.vertices.x,m_sQuad.tl.vertices.y),
        ccp(m_sQuad.bl.vertices.x,m_sQuad.bl.vertices.y),
        ccp(m_sQuad.br.vertices.x,m_sQuad.br.vertices.y),
        ccp(m_sQuad.tr.vertices.x,m_sQuad.tr.vertices.y),
    };
    ccDrawPoly(vertices, 4, true);
#elif CC_SPRITE_DEBUG_DRAW == 2
    // draw texture box
    //调试模式 2:绘制纹理边缘
    CCSize s = this->getTextureRect().size;
    CCPoint offsetPix = this->getOffsetPosition();
    CCPoint vertices[4] = {
        ccp(offsetPix.x,offsetPix.y), ccp(offsetPix.x+s.width,offsetPix.y),
        ccp(offsetPix.x+s.width,offsetPix.y+s.height), ccp(offsetPix.x,offsetPix.y+s.height)
    };
    ccDrawPoly(vertices, 4, true);
#endif // CC_SPRITE_DEBUG_DRAW

    CC_INCREMENT_GL_DRAWS(1);

    CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
}

OpenGL绘图技巧(遮罩层和小窗预览,可编程着色器)

时间: 2024-10-21 05:13:48

cocos2d-x游戏引擎核心之四——绘图原理和绘图技巧的相关文章

cocos2d-x游戏引擎核心(3.x)----启动渲染流程

(1) 首先,这里以win32平台下为例子.win32下游戏的启动都是从win32目录下main文件开始的,即是游戏的入口函数,如下: #include "main.h" #include "AppDelegate.h" #include "cocos2d.h" USING_NS_CC; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

iOS cocos2d游戏引擎的了解之一

ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这些也是我推荐使用cocos2d进行ios游戏开发的原因,当然从字面上已经可以开出来,这是一款专注于"2d"游戏的开发引擎,您也可以自己编写3d渲染代码或者使用第三方的解决方案,在cocos2d里加载显示3d模型.此外对于3d,也可以选用cocos3d来进行游戏开发.好了,废话不多说,还是先

Flash AS游戏引擎原理

其实一提到游戏引擎,很多初学者,会显得有一种畏惧感,会觉得这是一个非常高深的东西.曾经页游行业很乱,就像现在的手游一样,各种非计算机专业出生的同学,经过一个短暂的培训就开始了程序员之旅. 这篇文章仅仅从简单的角度讲解一下游戏引擎在显示渲染上的原理,用位图渲染的方式来实现,供新手们学习交流,如有不足的,望指出. 最简单的图形引擎,主要三个部分:摄影机(Camera),场景画布(Canvas),画布中的显示对象(Displayobject). 为了便于大家理解,我直接把Camera都忽略掉,假设我们

Cocos2d-Java游戏引擎诞生记

摘要:跨平台Cocos2d-Java游戏引擎和配套的CocosEditor2.0游戏开发工具为众多开发者带来福音,使用Java语言也能开发Cocos2d跨平台游戏了. Cocos2d-Java的诞生背景~ 一直以来Java和C/C++两种语言的PK十分厉害,不管是在程序员的圈子还是语言的排行榜中,总会听到各种口水战和争议不断.C/C++直接操控内存以及其独特的高效性,是很多游戏引擎选择它的原因,但由于C/C++自身艰涩难学,让很多开发者望而生畏,而Java由于简单易学.灵活快速的特点广受程序员欢

Android游戏引擎AndEngine入门讲解

AndEngine是一款基于OpenGL ES技术的2D游戏引擎,可以运行在Android1.6及以上版本的系统中.拥有更多的游戏组件与扩展功能,在默认情况下已经可以支持中文. 虽然AndEngine作为游戏引擎在功能上较libGDX更为丰富和人性化,但相比libGDX的绘图渲染机能却逊色不少.libGDX有较为完善的OpenGLES环境适应性,而AndEngine在这方面的投入明显不足.所以你是否选择AndEngine,需要从实际出发,多做几次真机测试才好下决定,下面小编将逐步讲解AndEng

Android 游戏引擎汇总

1.AndEngine 简介:AndEngine 基于libGDX框架开发,使用OpenGL ES进行图形绘制.同时继承了BOX2D物理引擎,因此能实现一些较为复杂的物理效果.在Rokon停止更新以后,AndEngine 成为Android 最为流行的2D游戏引擎 优点:(1)高效:在大运算量好事情况下,使用C/C++本地代码进行开发.比如物理引擎或者音频处理. (2)AndEngine是开源项目,开发者可对源码进行修改,它的源码在github上托管. (3)拥有Particle System

Android 8款开源游戏引擎

1.Angle  (2D    Java) Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发.该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程. 最低运行环境要求不详. 项目地址:http://code.google.com/p/angle/ 2.Rokon  (2D    Java) rokon是一款Android 2D游戏引擎,基于OpenGL ES技术开

20 款免费的 JavaScript 游戏引擎

使用 HTML5,CSS3 和 Javascript 可以帮助面向对象开发者开发拥有各种特性的游戏,比如:3D 动画效果,Canvas,数学,颜色,声音,WebGL 等等.最明显的优势在于使用 HTML5 开发的游戏能在任何现代化流行的设备上运行. 某些游戏引擎仅仅是一个抽象的层次,就简单处理一些或者更多的繁杂游戏开发任务:其他只是注重 asset 加载,输入,物理效果,音频,sprite 地图和动画,而且相当多样化.还有一些引擎架构极其简单,只包括一个 2D 水平的编辑器和调试工具. 大部分的