矩阵以及矩阵运算
上图就是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
使用的时候导入这个头文件就行了。