王学岗音视频开发(二)—————OpenGLES开发实践

news2025/8/13 2:47:49

矩阵以及矩阵运算

在这里插入图片描述
上图就是m x a 的矩阵
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1x3+0x2+2x1 :为左侧第一行乘以右侧第一列。
1x1+0x1+2x0 :为左侧第一行乘以右侧第二列。
-1x3+3x2+1x1:为左侧第二行乘以右侧第一列。
-1x1+3x1+1x0:为左侧第二行乘以右侧第二列。

矩阵的行列式

在这里插入图片描述

伴随矩阵

在这里插入图片描述
在这里插入图片描述
A*表示伴随矩阵

OpenGL 教程----屏幕变成红色

Vulkan(google推出的代替OpenGL,可以了解下)
CMakeLists的配置

cmake_minimum_required(VERSION 3.10)

MESSAGE(STATUS "${FFMPENG_DIR}/include")
MESSAGE(STATUS "${FFMPENG_DIR}/lib")

add_library(Test221123 SHARED src/main/cpp/MyRender.cpp)

find_library(log-lib log)
#增加 -lGLESv1_CM -lGLESv2库的支持
target_link_libraries(Test221123 -lGLESv1_CM -lGLESv2 ${log-lib})

MainActivity

package com.example.testndkempty;

import androidx.appcompat.app.AppCompatActivity;

import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {
    private GLSurfaceView glSurfaceView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(new MyRender());
        setContentView(glSurfaceView);
    }
}
package com.example.testndkempty;

import android.opengl.GLSurfaceView;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class MyRender implements GLSurfaceView.Renderer {
    static {
        System.loadLibrary("Test221123");
    }
    private native void initOpenGL();
    private native void paintGL();
    private native void resizeGL(int width,int height);
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
       initOpenGL();
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
            resizeGL(width,height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        paintGL();
    }
}

com_example_testndkempty_MyRender.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testndkempty_MyRender */

#ifndef _Included_com_example_testndkempty_MyRender
#define _Included_com_example_testndkempty_MyRender
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_testndkempty_MyRender
 * Method:    initOpenGL
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_initOpenGL
  (JNIEnv *, jobject);

/*
 * Class:     com_example_testndkempty_MyRender
 * Method:    paintGL
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_paintGL
  (JNIEnv *, jobject);

/*
 * Class:     com_example_testndkempty_MyRender
 * Method:    resizeGL
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_resizeGL
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

MyRender.cpp文件

//
// Created by 王学岗 on 2022/11/24.
//
#include "com_example_testndkempty_MyRender.h"
#include <GLES/gl.h>
#include <GLES2/gl2.h>


#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_initOpenGL
        (JNIEnv *env, jobject obj) {
        //glClear函数来自OPENGL,其中它是通过glClear使用红,绿,蓝以及AFA值来清除颜色缓冲区的,
        //并且都被归一化在(0,1)之间的值,其实就是清空当前的所有颜色。
    //初始化的时候给一个颜色,R为1,GB为0,Alpha为1.0
    glClearColor(1.0,0.0,0.0,1.0);
    //清空深度缓存
   // glClearDepthf指定glClear用于清除深度缓冲区的深度值。 glClearDepthf指定的值被限制在0 1范围内
    glClearDepthf(1.0);
    //用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,
    //会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。
//在做绘画3D时,这个功能最好启动,视觉效果比较真实。
    //启动深度测试
    glEnable(GL_DEPTH_TEST);
    //指定“目标像素与当前像素在z方向上值大小比较”(即深度的比较)的函数,
    //符合该函数关系的目标像素才进行绘制(渲染),否则对目标像素不予绘制,可以取下值:
    //在什么情况下使用深度测试
    glDepthFunc(GL_LEQUAL);//GL_LEQUAL,如果目标像素<=当前像素z值,则绘制目标像素
}

JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_paintGL
        (JNIEnv *env, jobject obj) {
    //清空颜色缓冲区,和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //重置
    glLoadIdentity();

}


JNIEXPORT void JNICALL Java_com_example_testndkempty_MyRender_resizeGL
        (JNIEnv *env, jobject obj, jint width, jint height) {
        //glViewport在默认情况下,视口被设置为占据打开窗口的整个像素矩形,窗口大小和设置视口大小相同,
        //所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,
        //最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。
    glViewport(0,0,width,height);
    //投影矩阵[点击查看详细意义](https://blog.csdn.net/caoshangpa/article/details/80266028)
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    [点击查看详细意义](https://blog.csdn.net/wsq198760/article/details/84080253)
    glOrthof(-1,1,-1,1,0.1,1000.0);
}

#ifdef __cplusplus
}
#endif


LOG打印日志的实现

这是一个头文件

//
// Created by 王学岗 on 2022/11/24.
//

#ifndef TESTNDKEMPTY_MYNDKLOG_H
#define TESTNDKEMPTY_MYNDKLOG_H


#ifdef __cplusplus
extern "C" {
#endif

#include <android/log.h>

#define LOG "王学岗"
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__)
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__)
#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__)
#define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__)

#ifdef __cplusplus
}
#endif

#endif

使用的时候导入这个头文件就行了。

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

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

相关文章

Grails SpringBoot国际化不生效

问题描述&#xff1a; grails项目使用了国际化&#xff0c;按照官方文档的说法&#xff1a; 会根据用户浏览器访问时使用的Accept-Language头自动选择合适的语言。 但无论浏览器了配置什么语言甚至配置了Tomcat启动参数 -Duser.languagexxx -Duser.regionxxx页面显示依旧是英…

[附源码]java毕业设计一点到家小区微帮服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

QPushButton按钮用法

QPushButton 简介 QPushButton是一个很常用的一个按钮控件&#xff0c;主要用于创建一个可按压的按键。它显示了一 个文本和一个图标。另外&#xff0c;你也可以在创建时&#xff0c;指定一个快捷键。 基本用法 1. 创建 QPushButton主要有两种创建方法&#xff0c;一种是直…

SQLite实现的学生管理系统

SQLite数据库 案例资源所在地址&#xff1a; https://download.csdn.net/download/weixin_41957626/87150608?spm1001.2014.3001.5503 1.简介 1.1引入 1.前面学习的文件存储和SharedPreference存储的方式只能存储一些小型的数据但是对于复杂关系以及复杂数据结构的数据仅仅靠…

交互与前端16 Tabulator 表格实践4

说明 继续给表格来加一些小功能。 内容 1 分页 在表格初始化的地方加两行配置,表格就实现了分页 pagination:true, //enable.paginationSize:20, // this option can take any positive integer value2 超链接 这个需求的来源是,一些微服务需要注释,所以我写了很多文档…

科研教育「双目视觉技术」首选!维视MV-VS220双目立体视觉系统开发平台

NO.1产品背景 在最近大热的自动驾驶赛道&#xff0c;大疆采用新的技术路线——双目立体视觉。具体来说&#xff0c;它就是模拟人的视觉系统&#xff0c;通过两个临近摄像头所拍摄到的画面的视差&#xff0c;来还原出三维立体结构。不需要对海量数据进行标注和训练&#xff0c;可…

Echarts 散点象限图(二)动态绘制

之前发布过一篇文章Echarts散点象限图,基于死数据来绘制的,但实际开放场景中,需要请求数据,而且可能会动态更改数据,这时候需要如何处理,有什么要注意的地方,这篇文章详细说明一下。 主要需要处理的地方就是四个象限的markArea,需要根据中心的位置来画,你可以想象成…

36 - 经典问题解析三(赋值 string)

---- 整理自狄泰软件唐佐林老师课程 1. 关于赋值的疑问 什么时候需要重载赋值操作符&#xff1f;编译器是否提供默认的赋值操作&#xff1f; 编译器为每个类 默认重载了赋值操作符默认的赋值操作符 仅完成 浅拷贝当需要进行 深拷贝 时 必须重载赋值操作符赋值操作符与拷贝构造…

Elasticsearch系列【1】概述

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录Elastic公司Elastic StackElasticsearch结构化/非结构化数据全文搜索ES 发展史ES 特点ES 应用场景ES 应用案例Beats 系列LogstashKibanaElastic公司 Elastic是一家以搜索引擎闻名世界的软件公司…

pythoin爬虫2之利用cookie进行登录

python爬虫2之利用cookie进行登录利用requests模拟post方法cookies的获取session综合实例拓展&#xff1a;实现时间间隔&#xff08;第一次抓取后间隔...秒进行下一次抓取&#xff09;利用requests模拟post方法 requests.post(url,data,hearders) url即要解析的网址data即是向服…

【学习笔记18】JavaScript对象的基本认识

一、什么是对象 &#xff08;一&#xff09;概念 &#x1f603; 就是一个数据的集合(复杂数据)&#x1f601; 对象属于复杂数据类型(引用数据类型) &#xff08;二&#xff09;知识点的补充 JS 的数据类型 1. 基本数据 2. 复杂数据&#xff08;引用数据类型&#xff09; 引用数…

图像处理技术:数字图像分割 ------ 图像分割、边界分割(边缘检测)、区域分割

一、图像分割概述 • 定义 是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分 成若干个互不相交的区域&#xff0c;使得这些特征在同一区域内表现出一致 性或相似性&#xff0c;而在不同区域间表现出明显的不同 分割出来的区域应该同时满足&#xff1a; (1&#xff09…

opencv之修改尺寸、灰度转换(python)

1、修改图片大小 #修改图片大小 resize_img cv.resize(img,dsize(200,100)) 完整代码 import cv2 as cv img cv.imread("C:\\Users\\Administrator\\Desktop\\huge.jpg") #修改图片大小 resize_img cv.resize(img,dsize(200,100)) #显示修改后图片 cv.imshow(修改…

【单目标优化求解】贪婪非分级灰狼算法求解单目标优化问题(G-NHGWO)【含Matlab源码 2005期】

⛄一、贪婪随机自适应搜索算法简介 1 贪婪随机自适应搜索算法 GRASP算法分两个阶段&#xff0c;构造阶段和局部搜索阶段[3]。在构造阶段&#xff0c;初始化可行解S和候选集C&#xff0c;并对候选集的每一个元素进行评估&#xff0c;判断是否可加入限制候选列表&#xff08;Res…

西电通信技术基础实验

实验一 基带传输常用编码 实验内容 数字编码技术&#xff1a;AMI码、曼彻斯特编码、HDB3码 实验目的 掌握几种基带传输常用码型的编码规则&#xff0c;如AMI码、HDB3码、曼彻斯特码。然后利用MATLAB设计并实现它们的编码。 实验环境 MATLAB程序设计、MATLAB Simulink仿真…

IMX6ULL + SPI LCD(驱动IC ILI9341)显示简单的QT界面

1. 硬件&#xff1a; 使用正点原子的IMX6ULL Linux开发板 开发板底板原理图版本&#xff1a;V2.1 核心板原理图版本&#xff1a;V1.6 LCD &#xff1a;MSP2402 (IC ILI9341) 2. 查找可用引脚 开发板上引出的引脚是在JP6上&#xff0c;只看JP6会发现没有可用的SPI引脚&…

【前端内容学习】vue的引用,下载,语法

&#xff08;1&#xff09;vue的使用方式 原版本应该是三种使用方式&#xff0c;但是现在vue官网好像已经找不到关于本地下载的内容了 1&#xff0c;直接在官网上引用网络CDN文件&#xff0c;注意这种引用方式&#xff0c;要把这一段写在所有使用vue的部分前面 <script s…

蓝鲸研运体系在腾讯内的应用实践

蓝鲸是腾讯IEG十多年研运探索的经验与成果&#xff0c;积累了很多人的智慧与付出。由于腾讯IEG的业务特殊性&#xff0c;蓝鲸体系天生地展现出对异构业务的友好&#xff0c;避免了需要重复造轮子才能完成对多业务的支持。本次分享主要介绍蓝鲸研运体系在腾讯内的发展、应用及未…

【Linux】Linux常用命令

目录一.帮助命令1.man获取帮助信息2.help获取shell内置命令的帮助信息3.怎么判断命令的类型4.使用man查看内置命令5.常用快捷键二.文件目录类命令1.pwd 显示当前工作目录的绝对路径2.cd 切换路径3.ls 列出目录的内容4.mkdir 创建一个新的目录(文件夹)5.rmdir 删除目录(文件夹)6…

linux64/ubuntu20.04安装NVIDIA驱动详细过程

每次安装Nvidia驱动的时候都要查询&#xff0c;各种各样的教程可能也不大适合自己&#xff0c;故记录一下安装过程&#xff1b; 本人所使用的系统为ubuntu20.04&#xff0c;64bit&#xff1b; 1、查看是否存在nvidia的显卡信息 命令&#xff1a;lspci | grep NVIDIA 2、根据显…