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

这篇具有很好参考价值的文章主要介绍了Android OpenGL 教程——窗口初始化&绘制矩形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上节介绍了 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);
}

Android OpenGL 教程——窗口初始化&绘制矩形,Android OpenGL,android,opengl,opengles

绘制矩形

 只需要将三角形的索引改为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);
    ......
}

Android OpenGL 教程——窗口初始化&绘制矩形,Android OpenGL,android,opengl,opengles

源码:OpenGLDemo#triangle

你好,三角形文章来源地址https://www.toymoban.com/news/detail-603577.html

到了这里,关于Android OpenGL 教程——窗口初始化&绘制矩形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 11属性系统初始化流程

    在init进程启动的第二阶段,调用PropertyInit 对属性系统进行初始化 PropertyInit函数在systemcoreinitproperty_service.cpp 中实现 注释1处在dev下创建__properties__文件夹。注释2处会收集读取各个分区下的property_contexts文件,将读取到的信息系列化之后,写到/dev/ properties /property_info文件中。

    2024年04月09日
    浏览(64)
  • android系列-init 初始化日志

    1.FirstStageMain 2.InitKernelLogging  3.KernelLogger  4.OpenKmsg 

    2024年02月02日
    浏览(80)
  • Android12 P2P 初始化

    目录  学习资料:Android Miracast 投屏 1. 开机log 2. WifiP2pService 启动

    2024年02月06日
    浏览(50)
  • android 添加ro属性字段并初始化

    硬件平台:QCS6125 软件平台:Android11 需求:硬件需通过硬件电路区分为多款型号,需要初始化到相应的系统属性字段展示。   这种型号属性适合做成ro类型,类似于原生系统的ro.product.model,由于android层面拿到这个具体的型号值是内核通过传递cmdline而获取的,内核层面拿到硬

    2024年01月16日
    浏览(84)
  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(50)
  • Android13音频子系统分析(二)---初始化

    目录 一、AudioPolicyService初始化 1.1 AudioPolicyService::onFirstRef()函数 1.2 AudioCommandThread线程 1.3 AudioPolicyManager初始化 1.3.1 解析audio_policy_configuration.xml配置文件 1.3.2 解析audio_policy_engine_configuration.xml配置文件 1.3.3 AudioPolicyManager::onNewAudioModulesAvailableInt()函数 1.3.4 AudioPolicyManager::updateDe

    2024年02月03日
    浏览(46)
  • android存储3--初始化.unlock事件的处理

    android版本:android-11.0.0_r21 http://aospxref.com/android-11.0.0_r21 概述:SystemServiceManager收到unlock事件后,遍历service链表,执行各个service的onUserUnlocking。对于存储service,执行的是StorageManagerService$Lifecycle中的 onUserUnlocking,在这个方法中,存储的 StorageSessionController、vold、storaged模块进行

    2024年02月10日
    浏览(52)
  • android存储4--初始化.emulated设备的挂载

    android版本:android-11.0.0_r21 http://aospxref.com/android-11.0.0_r21 android手机的挂载非常复杂。这篇文章针对emulated存储,介绍它的挂载过程。 android早期,手机内部flash容量比较小,为了能让手机存放更多的文件,需要通过外部存储(如SD卡)来扩展存储容量。随着技术的进步,大容量

    2024年02月15日
    浏览(111)
  • Android 11 Ethernet以太网架构分析(1)——初始化

    android中以太网常被用作共享网络,或者是定制化设备连接网线的需求。 本章将会详细分析该模块对以太网的逻辑实现,是大家对此有更深入认识。 初始化 Systemserver 在安卓系统中有一个关于以太网的服务,在systemserver中启动 frameworks/base/services/java/com/android/server/SystemServer.j

    2024年02月04日
    浏览(81)
  • Android 自定义view 中增加属性,初始化时读取

    因为自定义View 有正向和反向两个状态,所以需要在初始化时区分加载哪个layout 在Android中,要在自定义View中增加属性,你需要完成以下步骤: 在res/values/attrs.xml文件中定义属性。 在自定义View的构造函数中获取这些属性。 在布局文件中使用这些属性。 attrs.xml: 自定义VIEW 中

    2024年04月25日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包