Android OpenGL 教程——窗口初始化绘制矩形

news2024/12/25 1:18:10

上节介绍了 Native 工程初始化,但是我们的窗口什么都没有,这节我们将 NativeActivity 创建的 window 绑定到 OpenGL 创建的 display 的 surface 上,并且绘制背景颜色和三角形,通过三角形绘制出一个矩形

显示系统创建

void Render::initRenderer(android_app *pApp) {
    LOGI("initRenderer !")
    // 选择您的渲染属性
    constexpr EGLint attribs[] = {
            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
            EGL_BLUE_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_RED_SIZE, 8,
            EGL_DEPTH_SIZE, 24,
            EGL_NONE
    };

    // Android 上的默认显示可能就是您想要的
    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    eglInitialize(display, nullptr, nullptr);

    // 找出有多少个配置
    EGLint numConfigs;
    eglChooseConfig(display, attribs, nullptr, 0, &numConfigs);
    // 获取配置列表
    std::unique_ptr<EGLConfig[]> supportedConfigs(new EGLConfig[numConfigs]);
    eglChooseConfig(display, attribs, supportedConfigs.get(), numConfigs, &numConfigs);

    // 找到我们喜欢的配置。
    // 如果我们不关心配置中的其他任何内容,可能会只获取第一个。
    // 否则就加入你自己的启发式
    config_ = *std::find_if(
            supportedConfigs.get(),
            supportedConfigs.get() + numConfigs,
            [&display](const EGLConfig &config) {
                EGLint red, green, blue, depth;
                if (eglGetConfigAttrib(display, config, EGL_RED_SIZE, &red)
                    && eglGetConfigAttrib(display, config, EGL_GREEN_SIZE,
                                          &green)
                    && eglGetConfigAttrib(display, config, EGL_BLUE_SIZE,
                                          &blue)
                    && eglGetConfigAttrib(display, config, EGL_DEPTH_SIZE,
                                          &depth)) {
                    LOGI("Found config with: %d , %d , %d , %d", red,
                         green, blue, depth);
                    return red == 8 && green == 8 && blue == 8 &&
                           depth == 24;
                }
                return false;
            }
    );
    LOGI("Found %d Configs", numConfigs)

    // 创建 GLES 3 上下文
    EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
    EGLContext context = eglCreateContext(display, config_, nullptr, contextAttribs);
    display_ = display;
    context_ = context;
    // 检查系统上的 openGL
    auto opengl_info = {GL_VENDOR, GL_RENDERER, GL_VERSION, GL_EXTENSIONS};
    for (auto name: opengl_info) {
        auto info = glGetString(name);
        LOGI("OpenGL Info: %s", info);
    }
    initSurface(pApp);
    LOGI("init completed!")

}
void Render::initSurface(android_app *pApp) {
    // 创建合适的 window surface
    surface_ = eglCreateWindowSurface(display_, config_, pApp->window, nullptr);
    //获取一些窗口指标
    if (eglMakeCurrent(display_, surface_, surface_, context_) == EGL_FALSE) {
        LOGW("Unable to eglMakeCurrent")
        return;
    }
    eglQuerySurface(display_, surface_, EGL_WIDTH, &width_);
    eglQuerySurface(display_, surface_, EGL_HEIGHT, &height_);
    LOGI("QuerySurface : width = %d , height = %d", width_, height_)
}

绘制

绘制背景色

void BackgroundLayer::draw(Render *render) {
    glClearColor(state.x / (float) render->width_,
                 state.angle,
                 state.y / (float) render->height_,
                 1);
    glClear(GL_COLOR_BUFFER_BIT);
}

绘制三角形

初始化

class TriangleLayer : public Layer {
    void handleInput(AInputEvent *event);

    void draw(Render *render);

private:
    unsigned int VBO = 0, VAO = 0 , VEO = 0;
    bool isInit = false;
    float* color = new float [0.0f,0.0f,0.0f,1.f];
    float dis = 0.005f;

    void init() {
        if (isInit) {
            return;
        }
        isInit = true;
        // 初始化代码(只运行一次 (除非你的物体频繁改变))
        float vertices[] = {
                0.5f, 0.5f, 0.0f,   // 右上角
                0.5f, -0.5f, 0.0f,  // 右下角
                -0.5f, -0.5f, 0.0f, // 左下角
                -0.5f, 0.5f, 0.0f   // 左上角
        };
        unsigned int indices[] = {
                1, 2, 3  // 第二个三角形
        };
        //创建 VAO,VBO,VEO
        glGenBuffers(1, &VBO);
        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VEO);
        // 绑定VAO
        glBindVertexArray(VAO);
        // 绑定缓冲,填充数据,把顶点数组复制到缓冲中供OpenGL使用
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        // 绑定索引,填充索引数据
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VEO);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices),indices,GL_STATIC_DRAW);
        // 设置顶点属性指针
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *) 0);
        glEnableVertexAttribArray(0);
        // 解绑
        glBindBuffer(GL_ARRAY_BUFFER,0);
        glBindVertexArray(0);
    }

public:
    TriangleLayer() {
    }
    ~TriangleLayer(){
        glDeleteBuffers(1,&VAO);
        glDeleteBuffers(1,&VBO);
        glDeleteBuffers(1,&VEO);
    }

};

绘制

void TriangleLayer::draw(Render *render) {
    // 绘制物体
    init();
    render->shader_->use();

    // 更新uniform颜色
    color[0] = color[0] + dis;
    color[1] = color[1] + dis;
    if (color[1] >= 1.0f) {
        color[0] = 1.0f;
        color[1] = 1.0f;
        dis = -0.005f;
    } else if (color[1] <= 0.0f) {
        color[0] = 0.0f;
        color[1] = 0.0f;
        dis = 0.005f;
    }
//    int vertexColorLocation = render->shader_->getUniformLocation("ourColor");
//    glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
//    glUniform4f(vertexColorLocation, color[0], color[1], color[2], color[3]);
//    glUniform4fv(vertexColorLocation,0,color);
//    glUniform4fv(vertexColorLocation,1,color);
    render->shader_->setFloat("ourColor",0,color);
    render->shader_->setFloat("ourColor",1,color);

    glBindVertexArray(VAO);
//    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);
    glBindVertexArray(0);
}

绘制矩形

 只需要将三角形的索引改为6个即可

class TriangleLayer : public Layer {

    void init() {
        ......
        unsigned int indices[] = {
                // 注意索引从0开始!
                // 此例的索引(0,1,2,3)就是顶点数组vertices的下标,
                // 这样可以由下标代表顶点组合成矩形
                0, 1, 3, // 第一个三角形
                1, 2, 3  // 第二个三角形
        };
        ......
    }

};

绘制

void TriangleLayer::draw(Render *render) {
    ......
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
    ......
}

源码:OpenGLDemo#triangle

你好,三角形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

app专项性能测试测试指标和测试方法

工作中没有做过app这块的性能测试&#xff0c;但是你有面试问到过&#xff0c;现在做个总结如下 1、首次加载&#xff08;冷启动&#xff09; A.使用logcat监控activitymanager B.adb shell am start -w C.人工秒表计数 2、非第一启动&#xff08;热启动&#xff09; 应…

【开发心得】百度终于向百度发起挑战

没错&#xff0c;题目的确读起来别扭&#xff0c;但事实如此。 第一个百度&#xff0c;说的是百度的“文心千帆”。&#xff08;以下简称“千帆”&#xff09; 第二个百度&#xff0c;说的是百度的“搜索引擎”。&#xff08;以下简称“搜索”&#xff09; 这么讲就容易理解…

深入了解数据库的索引分类以及回表查询原理

索引的分类 在InnoDB存储引擎中的又可以分为以下两种 聚集索引的选取规则 如果有主键&#xff0c;主键索引就是聚集索引。 如果不存在主键&#xff0c;将会使用第一个唯一&#xff08;UNIQUE&#xff09;索引作为聚集索引 如果表没有主键&#xff0c;或者没有合适的唯一索引…

机场室内定位导航系统解决方案:提升旅客体验和机场运营效率

旅游业已开始回暖&#xff0c;作为旅客流动的核心节点&#xff0c;正逢暑假亲子出行&#xff0c;日益增长的客流量会对机场的运营和管理带来相当的冲击和挑战。 为提升旅客的出行体验和机场的优化运营管理效率&#xff0c;华安联大推荐采用机场室内定位导航系统解决方案。 基于…

【力扣刷题 | 第二十二天】

目录 前言&#xff1a; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天我们爆刷动态规划章节的题目&#xff0c;相关的算法理论介绍我也有写过文章&#xff1a;【夜…

TCL(Tool Command Language)学习(一)-----基本指令

一、置换语句 变量置换$ TCL解释器会将认为$后面为变量名&#xff0c;将变量置换乘它的值&#xff0c; []命令置换、[]内是一个独立的TCL语句 \反斜杠置换 换行符。空格、[、$等被TCL解释器当作特殊符号对待的字符&#xff0c;加上反斜杠后变成普通字符 “”CL对双引号中…

Rocket-Spring Cloud Stream

一.Spring Cloud Stream简介 1.微服务中会经常使用消息中间件&#xff0c;通过消息中间件在服务与服务之间传递消息&#xff0c;例如RabbitMQ、Kafka和RocketMQ&#xff0c;无论使用哪一种消息中间件和服务之间都有一点耦合性&#xff0c;这个耦合性指的是原来使用RabbitMQ&am…

Python获取股票数据——以沪深300成分股为例

目录 1、Baostock2、Tushare pro版3、AKshare4、聚宽量化平台 需求是下载比如从2020-01-01到2022-12-31区间的沪深300成分股每支股票的日K线数据&#xff0c;没错这是个面板数据&#xff0c;原本以为直接通过Python接口可以直接下载到&#xff0c;因为之前找的上证综指啥的用R的…

软著代码整理工具(针对cpp代码),python实现

一. 内容简介 软著代码整理工具(针对cpp代码)&#xff0c;python实现 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 格式要求 代码语法要求 对软件著作权提交源代码是提供原始的代码…

AcWing241. 楼兰图腾(树状数组)

输入样例&#xff1a; 5 1 5 3 2 4输出样例&#xff1a; 3 4解析&#xff1a; 以某个点 i 为最低点的 V 的数量&#xff0c;为 i 左侧和右侧比 a[ i ] 大的数量 a&#xff0c;b 的乘积。 但是&#xff0c;直接求这两个数的复杂度为O(n)&#xff0c;则整个复杂度为O( n^2 )&am…

TortoiseGit安装

1、TortoiseGit简介 TortoiseGit是基于TortoiseSVN的Git版本的Windows Shell界面。它是开源的&#xff0c;可以完全免费使用。 TortoiseGit 支持你执行常规任务&#xff0c;例如commit、显示日志、区分两个版本、创建分支和标签、创建补丁等。 2、TortoiseGit下载 (1)Tortois…

MySQL高级篇第2章(MySQL的数据目录)

文章目录 1、MySQL8的主要目录结构1.1 数据库文件的存放路径1.2 相关命令目录1.3 配置文件目录 2、数据库和文件系统的关系2.1 查看默认数据库2.2 数据库在文件系统中的表示2.3 表在文件系统中的表示2.3.1 InnoDB存储引擎模式2.3.2 MyISAM存储引擎模式 2.4 小结 1、MySQL8的主要…

论文笔记--Skip-Thought Vectors

论文笔记--Skip-Thought Vectors 1. 文章简介2. 文章概括3 文章重点技术3.1 Skip Thought Vectors3.2 词表拓展 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;Skip-Thought Vectors作者&#xff1a;Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Rich…

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

问题引入 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图 【对应类图】 【分析】 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

JDK9 接口特性(heima)

JDK9 接口特性&#xff08;heima&#xff09; 将log方法私有化

04. Idea集成Docker

目录 1、前言 2、开启docker远程 2.1、配置远程访问模式 2.2、重启docker服务 2.3、验证 3、Idea配置Docker 3.1、配置证书登录 4、创建Dockerfile 4.1、编写Dockerfile 4.2、配置启动项 4.3、访问接口 1、前言 上一节中&#xff0c;我们介绍了Dockerfile的方式构建…

MURF20100CT-ASEMI快恢复对管20A 1000V

编辑&#xff1a;ll MURF20100CT-ASEMI快恢复对管20A 1000V 型号&#xff1a;MURF20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 恢复时间&#xff1a;50ns 正向电流&#xff1a;20A 反向耐压&#xff1a;1000V 芯片大小&#xff1a;102MIL*2 芯片个数&…

C语言每日一题:4.消失的数字+数字在升序数组中出现的次数+整数转换

消失的数字&#xff1a; 思路1&#xff1a;排序遍历 1.使用qsort排序数组判断当前数值1是否是数组下一个元素的数值。 2.如果是一直循环注意数组越界&#xff0c;如果不是那么当前的数组的数值1就是消失的数。 3.存在0——n的数字是第n个数没有了。循环过程中从头到尾也找不到这…

C++ 哈希的应用【位图】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1、问题一2、位图概念3、位图的模拟实现3.1、基本思路3.2、set3.3、reset3.4、…

从电商指标洞察到运营归因,只需几句话?AI 数智助理准备好了!

Lily 是名入职不久的电商运营助理&#xff0c;最近她想要根据 2022 年的客单价情况&#xff0c;分析品牌 A 在不同电商渠道的用户行为和表现&#xff0c;并提供一些有价值的洞察和建议给客户。然而在向技术人员提报表需求后&#xff0c;技术人员以需求排满为借口拒绝了。 Lily …