上图就是m x a 的矩阵
1x3+0x2+2x1 :为左侧第一行乘以右侧第一列。
1x1+0x1+2x0 :为左侧第一行乘以右侧第二列。
-1x3+3x2+1x1:为左侧第二行乘以右侧第一列。
-1x1+3x1+1x0:为左侧第二行乘以右侧第二列。
A*表示伴随矩阵
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
这是一个头文件
//
// 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
使用的时候导入这个头文件就行了。
上一篇:mysql-4-锁机制
下一篇:1011:甲流疫情死亡率