cocos2dx opengl入门系列四-显示图片

2023-10-30

运行环境:

mac 10.12.2

xcode Version 8.2.1

cocos2dx-x-3.13.1

代码:

新建cocos2dx项目,具体操作官网有教程。新建好后,

新建Test.cpp,代码如下:

//
//  Test.cpp
//  Texture
//
//  Created by zhufu on 2017/3/28.
//
//

#include "Test.h"

Test* Test::create()
{
    Test* test = new(std::nothrow) Test();
    if(test && test->init())
    {
        test->autorelease();
        return test;
    }
    else
    {
        delete test;
        test = nullptr;
        return nullptr;
    }
}

bool Test::init()
{
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    initCommand();
    loadShader();
    loadTexture();
    loadRectangle();
    
    return true;
}

void Test::flipVertical(int width, int height, unsigned char* arr)
{
    int index = 0, f_index, cycle=height/2;
    char buf;
    for (int i = 0; i < cycle; i++)
    {
        for (int j = 0; j < width*Test::Format_RGBA; j++)
        {
            //当前像素
            index = i*width*Test::Format_RGBA + j;
            //需要交换的像素
            f_index = (height - 1 - i)*width*Test::Format_RGBA + j;
            //缓存当前像素
            buf = arr[index];
            //交换像素
            arr[index] = arr[f_index];
            //交换回像素
            arr[f_index] = buf;
        }
    }
}


void Test::loadShader()
{
    _glProgram = new GLProgram();
    _glProgram->initWithFilenames("shader/myVertexShader.vsh", "shader/myFragmentShader.fsh");
    _glProgram->link();
}

void Test::loadTexture()
{
    Image *image = new Image;
    std::string imagePath = FileUtils::getInstance()->fullPathForFilename("HelloWorld.png");
    image->initWithImageFile(imagePath);
    unsigned char *imageData = image->getData();
    int width = image->getWidth();
    int height = image->getHeight();
    flipVertical(width, height, imageData);
    
    CCLOG("width %d", width);
    
    //别忘了释放image内存
    //    CC_SAFE_DELETE(image);
    
    glGenTextures(1, &TEXTUREID);
    glBindTexture(GL_TEXTURE_2D, TEXTUREID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D,
                 0,
                 GL_RGBA,
                 width,
                 height,
                 0,
                 GL_RGBA,
                 GL_UNSIGNED_BYTE,
                 imageData);
    glBindTexture(GL_TEXTURE_2D, 0);
}

void Test::loadRectangle()
{
    glGenVertexArrays(1, &_vao);
    glBindVertexArray(_vao);
    
    //make and bind VBO;
    GLuint vbo = 0;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    
    //put the rectangle vertices(XYZ) and texture coordinates (UV) into the vbo
    GLfloat textureData[] = {
        //  X     Y     Z       U     V
        -1.0f, 1.0f, 0.0f,   0.0f, 1.0f,
        1.0f, 1.0f, 0.0f,   1.0f, 1.0f,
        -1.0f,-1.0f, 0.0f,   0.0f, 0.0f,
        1.0f,-1.0f , 0.0f,   1.0f, 0.0f,
    };
    glBufferData(GL_ARRAY_BUFFER, sizeof(textureData), textureData, GL_STATIC_DRAW);
    
    //connect the xyz to the "vert" arrribute of the vertex shader
    glEnableVertexAttribArray(_glProgram->getAttribLocation("vert"));
    glVertexAttribPointer(_glProgram->getAttribLocation("vert"), 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), nullptr);
    
    glEnableVertexAttribArray(_glProgram->getAttribLocation("vertTexCoord"));
    glVertexAttribPointer(_glProgram->getAttribLocation("vertTexCoord"), 2, GL_FLOAT, GL_TRUE, 5 * sizeof(GLfloat), (const GLvoid*)(3*sizeof(GLfloat)));
}

void Test::initCommand()
{
    _command.init(getLocalZOrder());
    _command.func = CC_CALLBACK_0(Test::onDraw, this);
}

void Test::draw(Renderer *renderer, const Mat4 &transform, uint32_t platform)
{
    Director::getInstance()->getRenderer()->addCommand(&_command);
}

void Test::onDraw()
{
    //clear everything
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    
    //bind the program (the shaders)
    _glProgram->use();
    
    //bind the texture and set the "tex" uniform in the fragment shader
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, TEXTUREID);
    GLuint tex = glGetUniformLocation(_glProgram->getProgram(), "tex");
    glUniform1i(tex, 0);
    
    //bind the vao
    glBindVertexArray(_vao);
    
    //draw the vao
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}


新建Test.h,代码如下:

//
//  Test.h
//  Texture
//
//  Created by zhufu on 2017/3/28.
//
//

#ifndef Test_h
#define Test_h

#include <stdio.h>
USING_NS_CC;

class Test : public Node
{
public:
    
    enum Format {
        Format_Grayscale = 1, /**< one channel: grayscale */
        Format_GrayscaleAlpha = 2, /**< two channels: grayscale and alpha */
        Format_RGB = 3, /**< three channels: red, green, blue */
        Format_RGBA = 4 /**< four channels: red, green, blue, alpha */
    };
    
    static Test* create();
    virtual bool init() override;
    virtual void draw(Renderer* renderer, const Mat4 &transform, uint32_t platform) override;
    void onDraw();
    
    void loadShader();
    void loadTexture();
    void loadRectangle();
    void initCommand();
    void flipVertical(int width, int height, unsigned char* arr);
    
private:
    GLuint TEXTUREID;
    GLProgram* _glProgram;
    GLuint _vao;
    CustomCommand _command;
};

#endif /* Test_h */


如图:


修改HelloWorldScene.cpp,

include "Test.h"

再修改CreateScene方法:

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    auto test = Test::create();
    scene->addChild(test);
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}
如图:


在Resources方位夹下新建shader文件夹,再在shader新建myVertexShader.vsh和myFragmentShader.fsh文件。

如图:



myVertexShader.vsh

attribute vec3 vert;
attribute vec2 vertTexCoord;

varying vec2 textureOut;

void main() {
    // Pass the tex coord straight through to the fragment shader
    textureOut = vertTexCoord;
    
    gl_Position =  vec4(vert, 1);
}


myFragmentShader.fsh

uniform sampler2D tex;

varying vec2 textureOut;

void main() {
    gl_FragColor = texture2D(tex, textureOut);
}

还有,最后一人是修改cocos2dx的适配模式,就是修改AppDelegate.cpp文件,如图:


修改成:


接下来,可以开心地运行程序了。

运行效果:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocos2dx opengl入门系列四-显示图片 的相关文章

  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐

  • Python多线程同时处理多个文件

    前言 在需要对大量文件进行相同的操作时 逐个遍历是非常耗费时间的 这时 我们可以借助于Python的多线程操作来大大提高处理效率 减少处理时间 问题背景 比如说 我们现在需要从一个文件夹下面读取出所有的视频 然后对每个视频进行逐帧处理 由于
  • Geogebra求一道极难的几何题

    第2小题 答案是45 Geogebra文件下载 链接 https caiyun 139 com m i 0E5CKWJDt7wMr 提取码 WSev
  • C++面向对象之对象的初始化和清理

    对象的初始化和清理 生活中我们买的电子产品都会有基本的出厂设置 在某一天我们不用的时候会删除一些自己信息数据保证安全 C 中的面向对象来源于生活 每个对象也都会有初始设置以及对象销毁前的清理数据的设置 构造函数和析构函数 对象的初始化和清理
  • ReenTranReadWriteLock 读写锁 笔记

    参考博客链接 1 https blog csdn net qq 19431333 article details 70568478 2 https blog csdn net yanyan19880509 article details 5
  • aix命令tar包命令应用

    打包并压缩gzip格式 利用ftp传输到远程服务器上 tar cvf ciod appuser gzip qc gt ciod appuser tar gzip ftp v n 192 1 1 48 lt
  • 【技巧】如何在 GitHub 上高效阅读源码?

    在 GitHub 上高效阅读源码的方法有以下几种 方法一 github项目页面 按键盘上的 句号 方法二 github项目页面地址栏github com 改为 github dev 方法三 github项目页面地址栏github com 改
  • 信息学奥赛一本通 1176:谁考了第k名

    题目链接 http ybt ssoier cn 8088 problem show php pid 1176 include
  • Operator ‘+‘ cannot be applied to ‘java.lang.String‘, ‘void‘的解决方法

    刚开始报下图错 是因为我在另一个类中定义有返回值void的方法 如图二 一个想要调用另一个的方法 且是字符串的类型的需要将void换成string 并将输出语句换成return 如图 记得最后一行的分号去掉
  • python循环写入excel中的不同sheet_python实现跨excel的工作表sheet之间的复制方法

    python 将test1的Sheet1通过 跨文件 复制到test2的Sheet2里面 包括谷歌没有能搜出这种问题答案 我们贴出代码 我们加载openpyxl这个包来解决 from openpyxl import load workboo
  • Java项目数据脱敏常用技术及Jasypt实战

    数据脱敏在Java项目中是一项非常重要的任务 它可以保护敏感数据 同时符合法规和隐私保护要求 在本篇博客中 我们将介绍数据脱敏的概念以及在Java项目中常用的开源框架和工具的实战应用 什么是数据脱敏 数据脱敏是指将敏感数据进行处理 使其在保
  • styled-components的配置和使用

    在react中 正常的给组件引入css文件 该css文件会直接作用于全局 使用styled components可以有效控制好css作用域 1 安装 yarn add styled components 2 配置并设置全局样式 新建一个js
  • Java实现CNN

    Java实现CNN 算法介绍 CNN的优势 卷积操作 池化操作 网络结构 训练过程 前向传播 反向传播 代码实现 数据模型类Dataset 矩阵尺寸类Size 核心操作类MathUtils Operator OperatorOnTwo接口下
  • 零基础学习Vue: 第21课 Vue 单向数据流父组件的属性值子组件如何更改:

    零基础学习Vue 第21课 Vue定义子组件template的常见3种写法 单向数据流原理 子组件不能直接修改父组件中传递的数据 如需间接改变父组件传递的数据 解决方法 可以在子组件data选项中存储父组件传递的数据之后修改子组件中的数据
  • 解决httpServletRequest.getParameter获取不到参数

    用httpServletRequest getParameter接收post请求参数 发送端content Type必须设置为application x www form urlencoded 否则会接收不到 RequestMapping
  • go语言各种hash哈希算法使用汇总(超详细代码)

    目录 前言 一 首先以md4为例 一 16进制字符串的md4 二 字符串的md4 三 16进制字符串 字符串封装 二 md4 md5 sha1 ripemd160 sha256 sha512 一 导包 二 单个使用 三 md4 md5 sh
  • 使用jsoup选择器来查找元素

    一 用途 使用jsoup解析网页 抓取手机型号和系统信息 二 获取方式 例子 获取终端制造商链接列表 return public List
  • 话题作文汇总

    一 前言 在备考的过程中 研读和学习了多篇英语话题作文 在此将其记录下来 以便加深印象 二 作文列表 Public Role Model s Rights Internet Kills Conversation Generation Gap
  • form表单的对象

    这个是关于表单 表单在HTML中是很重要的一个部分 关于表单的使用 里面的属性和方法不算很多 这里就介绍一下表单的信息 用法 document forms 是一个数组 包含了文档中所有的表单
  • Python学习之------retry(异常重试)

    在做数据抓取的时候 经常遇到由于网络问题导致的程序保存 先前只是记录了错误内容 并对错误内容进行后期处理 原先的流程 def crawl page url pass def log error url pass url try crawl
  • cocos2dx opengl入门系列四-显示图片

    运行环境 mac 10 12 2 xcode Version 8 2 1 cocos2dx x 3 13 1 代码 新建cocos2dx项目 具体操作官网有教程 新建好后 新建Test cpp 代码如下 Test cpp Texture C