王学岗音视频开发(二)—————OpenGLES开发实践
创始人
2024-02-13 05:13:08
0

矩阵以及矩阵运算

在这里插入图片描述
上图就是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;@Overrideprotected 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);@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {initOpenGL();}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {resizeGL(width,height);}@Overridepublic void onDrawFrame(GL10 gl) {paintGL();}
}

com_example_testndkempty_MyRender.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* 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 
#include #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.0glClearColor(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 #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

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...