第一个3D程序!

 运行效果

CPP

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <soil2/SOIL2.h>

#define PI 3.14159f

#define numVAOs 1
#define numVBOs 128

#define SPEED 0.1f
#define ANGLE 0.01f

using namespace std;

GLuint rendering_program;
GLuint vao[numVAOs];
GLuint vbo[numVBOs];
GLuint vbo_count = 0;
GLuint mvloc, ploc, nloc;
GLuint clr_loc;
GLuint global_amb_loc, dirlight_amb_loc, dirlight_dif_loc, dirlight_dir_loc;

int HEIGHT = 724, WIDTH = 1024;
float aspect = (float)WIDTH / (float)HEIGHT;

glm::vec4 GlobalAmbient = { 0.6f, 0.6f, 0.6f, 1.0f };	//全局环境光
glm::vec4 DirLightAmbient = { 0.2f, 0.2f, 0.2f, 1.0f };	//定向光:环境特征
glm::vec4 DirLightDiffuse = { 0.5f, 0.5f, 0.5f, 1.0f };
glm::vec3 DirLightDirection = { -1.0f, -1.732f, 0.0f };

glm::mat4 tmat;											//平移
glm::mat4 rmat;											//旋转
glm::mat4 vmat;											//t_mat * r_mat
glm::mat4 pmat;											//透视
glm::mat4 mvmat;
glm::mat4 invmat;										//mv矩阵的逆

struct Camera {
	float x, y, z;
	float theta, fine;
}camera;

struct Tetrahedron {
	GLuint vbo_index[2] = { 0 };
	glm::vec3 position = { 0.0f, 0.0f, 0.0f };
	float vertex_positions[36] = {
		0.0f, -0.408f, 1.155f, -1.0f, -0.408f, -0.577f, 1.0f, -0.408f, -0.577f,
		0.0f, -0.408f, 1.155f, 0.0f, 1.225f, 0.0f, -1.0f, -0.408f, -0.577f,
		0.0f, -0.408f, 1.155f, 1.0f, -0.408f, -0.577f, 0.0f, 1.225f, 0.0f,
		-1.0f, -0.408f, -0.577f, 0.0f, 1.225f, 0.0f, 1.0f, -0.408f, -0.577f
	};
	float vertex_normal[36] = {
		0.0f, 1.225f, 0.0f, 0.0f, 1.225f, 0.0f, 0.0f, 1.225f, 0.0f,
		1.0f, -0.408f, -0.577f, 1.0f, -0.408f, -0.577f, 1.0f, -0.408f, -0.577f,
		-1.0f, -0.408f, -0.577f, -1.0f, -0.408f, -0.577f, -1.0f, -0.408f, -0.577f,
		0.0f, -0.408f, 1.155f, 0.0f, -0.408f, 1.155f, 0.0f, -0.408f, 1.155f
	};
	void init(float x, float y, float z) {
		vbo_index[0] = vbo_count++;
		vbo_index[1] = vbo_count++;
		position = { x, y, z };
		glBindBuffer(GL_ARRAY_BUFFER, vbo[vbo_index[0]]);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions), vertex_positions, GL_STATIC_DRAW);
		glBindBuffer(GL_ARRAY_BUFFER, vbo[vbo_index[1]]);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_normal), vertex_normal, GL_STATIC_DRAW);
	}
}tetrahedron;
struct Plane {
	GLuint vbo_index[2] = { 0 };
	glm::vec3 position = { 0.0f, 0.0f, 0.0f };
	float vertex_positions[18] = {
		0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
		1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f
	};
	float vertex_normal[18] = {
		0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
		0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f
	};
	void init(float x, float y, float z) {
		vbo_index[0] = vbo_count++;
		vbo_index[1] = vbo_count++;
		position = { x, y, z };
		glBindBuffer(GL_ARRAY_BUFFER, vbo[vbo_index[0]]);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions), vertex_positions, GL_STATIC_DRAW);
		glBindBuffer(GL_ARRAY_BUFFER, vbo[vbo_index[1]]);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_normal), vertex_normal, GL_STATIC_DRAW);
	}
}plane;

string ReadShaderSource(const char* file_path) {
	string content;
	string line = "";
	ifstream file_stream(file_path, ios::in);
	while (!file_stream.eof()) {
		getline(file_stream, line);
		content.append(line + "\n");
	}
	file_stream.close();
	return content;
}
void PrintShaderLog(GLuint shader) {
	int len = 0;
	int ch_writtn = 0;
	char* log;
	glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
	if (len > 0) {
		log = (char*)malloc(len);
		glGetShaderInfoLog(shader, len, &ch_writtn, log);
		cout << "Shader Info Log:" << log << endl;
		free(log);
	}
}
void PrintProgramLog(GLuint program) {
	int len = 0;
	int ch_writtn = 0;
	char* log;
	glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
	if (len > 0) {
		log = (char*)malloc(len);
		glGetProgramInfoLog(program, len, &ch_writtn, log);
		cout << "Program Info Log:" << log << endl;
		free(log);
	}
}
bool CheckOpenGLError() {
	bool found_error = false;
	int glerr = glGetError();
	while (glerr != GL_NO_ERROR) {
		cout << "GL ERROR:" << glerr << endl;
		found_error = true;
		glerr = glGetError();
	}
	return found_error;
}
GLuint CreateShaderProgram() {
	GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
	GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
	GLint vert_compiled;
	GLint frag_compiled;
	GLint linked;
	string vert_shader_string = ReadShaderSource("vert_shader.glsl");
	string frag_shader_string = ReadShaderSource("frag_shader.glsl");
	const char* vert_shader_source = vert_shader_string.c_str();
	const char* frag_shader_source = frag_shader_string.c_str();
	glShaderSource(vshader, 1, &vert_shader_source, NULL);
	glShaderSource(fshader, 1, &frag_shader_source, NULL);
	glCompileShader(vshader);
	CheckOpenGLError();
	glGetShaderiv(vshader, GL_COMPILE_STATUS, &vert_compiled);
	if (vert_compiled != 1) {
		cout << "vertex compilation failed" << endl;
		PrintShaderLog(vshader);
	}
	glCompileShader(fshader);
	CheckOpenGLError();
	glGetShaderiv(fshader, GL_COMPILE_STATUS, &frag_compiled);
	if (frag_compiled != 1) {
		cout << "fragment compilation failed" << endl;
		PrintShaderLog(fshader);
	}
	GLuint program = glCreateProgram();
	glAttachShader(program, vshader);
	glAttachShader(program, fshader);
	glLinkProgram(program);
	CheckOpenGLError();
	glGetProgramiv(program, GL_LINK_STATUS, &linked);
	if (linked != 1) {
		cout << "linking failed" << endl;
		PrintProgramLog(program);
	}
	return program;
}
GLuint LoadTexture(const char* ImagePath) {
	GLuint textureID;
	textureID = SOIL_load_OGL_texture(ImagePath, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
	if (textureID == 0) cout << "could not find texture file:" << ImagePath << endl;
	return textureID;
}
void init(GLFWwindow* window) {
	vmat = glm::mat4(1.0f);
	rmat = glm::mat4(1.0f);
	pmat = glm::perspective(1.3f, aspect, 0.1f, 1000.0f);
	rendering_program = CreateShaderProgram();
	glGenVertexArrays(numVAOs, vao);
	glBindVertexArray(vao[0]);
	glGenBuffers(numVBOs, vbo);
	tetrahedron.init(4.0f, 4.0f, 4.0f);
	plane.init(0.0f, 0.0f, 0.0f);
}
void MoveCamera(GLFWwindow* window) {
	bool translate = false;
	bool rotato = false;
	if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
		camera.x -= (float)sin(camera.theta) * SPEED;
		camera.z -= (float)cos(camera.theta) * SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
		camera.x += (float)sin(camera.theta) * SPEED;
		camera.z += (float)cos(camera.theta) * SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
		camera.x -= (float)cos(camera.theta) * SPEED;
		camera.z += (float)sin(camera.theta) * SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
		camera.x += (float)cos(camera.theta) * SPEED;
		camera.z -= (float)sin(camera.theta) * SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
		camera.y += SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS) {
		camera.y -= SPEED;
		translate = true;
	}
	if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) {
		if (camera.fine < PI / 2.0) {
			camera.fine += ANGLE;
			rotato = true;
		}
	}
	if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) {
		if (camera.fine > -PI / 2.0) {
			camera.fine -= ANGLE;
			rotato = true;
		}
	}
	if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) {
		camera.theta += ANGLE;
		rotato = true;
	}
	if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) {
		camera.theta -= ANGLE;
		rotato = true;
	}
	if (translate) tmat = glm::translate(glm::mat4(1.0f), glm::vec3(-camera.x, -camera.y, -camera.z));
	if (rotato) rmat = {
		{ cos(camera.theta)  , sin(camera.fine) * sin(camera.theta), cos(camera.fine) * sin(camera.theta), 0.0f },
		{ 0.0f				 , cos(camera.fine)					 , -sin(camera.fine)				   , 0.0f },
		{ -sin(camera.theta) , sin(camera.fine) * cos(camera.theta), cos(camera.fine) * cos(camera.theta), 0.0f },
		{ 0.0f				 , 0.0f								 , 0.0f								   , 1.0f }
	};
	if (translate || rotato) vmat = rmat * tmat;
}
void WindowReshapeCallback(GLFWwindow* window, int new_width, int new_height) {
	WIDTH = new_width;
	HEIGHT = new_height;
	aspect = (float)WIDTH / (float)HEIGHT;
	pmat = glm::perspective(1.3f, aspect, 0.1f, 1000.0f);
	glViewport(0, 0, WIDTH, HEIGHT);
}
void InstallLight() {
	global_amb_loc = glGetUniformLocation(rendering_program, "GlobalAmbient");
	dirlight_amb_loc = glGetUniformLocation(rendering_program, "DirLightAmbient");
	dirlight_dif_loc = glGetUniformLocation(rendering_program, "DirLightDiffuse");
	dirlight_dir_loc = glGetUniformLocation(rendering_program, "DirLightDirection");
	glProgramUniform4fv(rendering_program, global_amb_loc, 1, glm::value_ptr(GlobalAmbient));
	glProgramUniform4fv(rendering_program, dirlight_amb_loc, 1, glm::value_ptr(DirLightAmbient));
	glProgramUniform4fv(rendering_program, dirlight_dif_loc, 1, glm::value_ptr(DirLightDiffuse));
	glProgramUniform3fv(rendering_program, dirlight_dir_loc, 1, glm::value_ptr(DirLightDirection));
}
void display(GLFWwindow* window, double curretTime) {
	glClear(GL_DEPTH_BUFFER_BIT);
	glClear(GL_COLOR_BUFFER_BIT);
	glUseProgram(rendering_program);
	InstallLight();
	mvloc = glGetUniformLocation(rendering_program, "mvmat");
	ploc = glGetUniformLocation(rendering_program, "pmat");
	nloc = glGetUniformLocation(rendering_program, "nmat");
	clr_loc = glGetUniformLocation(rendering_program, "texture_color");
	glDisable(GL_CULL_FACE);
	for (int x = -32; x < 32; x++)
		for (int z = -32; z < 32; z++) {
			glm::vec4 texture_color(0.0f, 0.0f, 1.0f, 1.0f);
			glm::mat4 mmat_p = glm::translate(glm::mat4(1.0f), glm::vec3((float)x, 0.0f, (float)z));
			if ((x + z) & 1) texture_color = { 0.0f, 1.0f, 0.0f, 1.0f };
			mvmat = vmat * mmat_p;
			invmat = glm::transpose(glm::inverse(mvmat));
			glUniformMatrix4fv(mvloc, 1, GL_FALSE, glm::value_ptr(mvmat));
			glUniformMatrix4fv(ploc, 1, GL_FALSE, glm::value_ptr(pmat));
			glUniformMatrix4fv(nloc, 1, GL_FALSE, glm::value_ptr(invmat));
			glUniform4fv(clr_loc, 1, glm::value_ptr(texture_color));
			glBindBuffer(GL_ARRAY_BUFFER, vbo[plane.vbo_index[0]]);
			glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
			glEnableVertexAttribArray(0);
			glBindBuffer(GL_ARRAY_BUFFER, vbo[plane.vbo_index[1]]);
			glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
			glEnableVertexAttribArray(1);
			glEnable(GL_DEPTH_TEST);
			glDepthFunc(GL_LEQUAL);
			glDrawArrays(GL_TRIANGLES, 0, 6);
		}
	glEnable(GL_CULL_FACE);
	glm::mat4 mmat_t = glm::translate(glm::mat4(1.0f), tetrahedron.position);
	mvmat = vmat * mmat_t;
	invmat = glm::transpose(glm::inverse(mvmat));
	glUniformMatrix4fv(mvloc, 1, GL_FALSE, glm::value_ptr(mvmat));
	glUniformMatrix4fv(ploc, 1, GL_FALSE, glm::value_ptr(pmat));
	glUniformMatrix4fv(nloc, 1, GL_FALSE, glm::value_ptr(invmat));
	glUniform4fv(clr_loc, 1, glm::value_ptr(glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)));
	glBindBuffer(GL_ARRAY_BUFFER, vbo[tetrahedron.vbo_index[0]]);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(0);
	glBindBuffer(GL_ARRAY_BUFFER, vbo[tetrahedron.vbo_index[1]]);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(1);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glDrawArrays(GL_TRIANGLES, 0, 12);
}
int main() {
	if (!glfwInit()) { exit(EXIT_FAILURE); }
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "HelloWorld", NULL, NULL);
	glfwMakeContextCurrent(window);
	if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
	glfwSwapInterval(1);
	glfwSetWindowSizeCallback(window, WindowReshapeCallback);

	init(window);

	while (!glfwWindowShouldClose(window)) {
		MoveCamera(window);
		display(window, glfwGetTime());
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	exit(EXIT_SUCCESS);
}

顶点着色器

#version 430

layout (location=0) in vec3 position;
layout (location=1) in vec3 normal;

out vec3 varying_normal;
out vec3 varying_direction;

uniform mat4 mvmat;
uniform mat4 pmat;
uniform mat4 nmat;
uniform vec4 texture_color;
h
uniform vec4 GlobalAmbient;
uniform vec4 DirLightAmbient;
uniform vec4 DirLightDiffuse;
uniform vec3 DirLightDirection;

void main(void) {
	varying_normal = (nmat * vec4(normal, 1.0)).xyz;
	varying_direction = (nmat * vec4(DirLightDirection, 1.0)).xyz;
	gl_Position = pmat * mvmat * vec4(position, 1.0);
}

片段着色器

#version 430

in vec3 varying_normal;
in vec3 varying_direction;

out vec4 color;

uniform mat4 mvmat;
uniform mat4 pmat;
uniform mat4 nmat;
uniform vec4 texture_color;

uniform vec4 GlobalAmbient;
uniform vec4 DirLightAmbient;
uniform vec4 DirLightDiffuse;
uniform vec3 DirLightDirection;

void main(void) {
	vec3 L = normalize(varying_direction);
	vec3 N = normalize(varying_normal);
	float cos_theta = dot(L, N);
	vec3 ambient = GlobalAmbient.xyz * texture_color.xyz + DirLightAmbient.xyz * texture_color.xyz;
	vec3 diffuse = texture_color.xyz * DirLightDiffuse.xyz * max(cos_theta, 0.0);
	color = vec4(ambient + diffuse, 1.0);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题

过程描述&#xff1a; 由于我修改文件时&#xff08;一定得修改了文件&#xff0c;不做任何修改不会产生这个问题&#xff09;的非法关闭&#xff0c;比如直接关闭虚拟机&#xff0c;或者直接断开远程工具的远程连接&#xff0c;产生了以下遗留交换文件的问题&#xff1a; 点击…

t113_can增加驱动

1 基于太极派的SDK添加 //设备树添加can0: can2504000 {compatible "allwinner,sun20i-d1-can";reg <0x0 0x02504000 0x0 0x400>;interrupts <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;clocks <&ccu CLK_BUS_CAN0>;resets <&ccu RST_BUS_…

力扣【669. 修剪二叉搜索树】Java题解

一开始在想为什么题目说存在唯一答案。然后发现是二叉搜索树就合理了。如下图&#xff1a;如果0节点小于low&#xff0c;那其左子树也都小于low&#xff0c;故可以排除&#xff1b;对于4&#xff0c;其右子树也是可以排除。 代码如下&#xff1a; class Solution {public Tre…

WSL安装CUDA

WSL安装CUDA 参考文档&#xff1a; ​ 总安装文档&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#wsl-installation 1. 下载cuda ​ 进入下载界面&#xff1a;https://developer.nvidia.com/cuda-downloads?target_osLinux&target_archx86_…

浅谈Linux的发展

目录 1.Linux背景 1.1 发展史 UNIX发展的历史 1.2开源 1.3官网 1.4.企业应用现状 1.5.发行版本 1.6 os概念&#xff0c;定位 1.Linux背景 1.1 发展史 学习Linux系统编程&#xff0c;你可能要问Linux从哪里来&#xff1f;它是怎么发展的&#xff1f;在这里简要介绍Linux的发展史…

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…

操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之缓冲区的管理

前言 当一个程序需要读取硬盘上的一个逻辑块时&#xff0c;就会向缓冲区管理程序提出申请。而请求读写的程序进程则进入睡眠等待状态。缓冲区管理程序首先在缓冲区中寻找以前是否已经读取过这块数据。如果缓冲区中已经有了&#xff0c;就直接将对应的缓冲区块头指针返回给程序并…

服务器上安装Nginx详细步骤

第一步&#xff1a;上传nginx压缩包到指定目录。 第二步&#xff1a;解压nginx压缩包。 第三步&#xff1a;配置编译nginx 配置编译方法&#xff1a; ./configure 配置编译后结果信息&#xff1a; 第四步&#xff1a;编译nginx 在nginx源文件目录中直接运行make命令 第五步&…

【算法】经典博弈论问题——威佐夫博弈 python

目录 威佐夫博弈(Wythoff Game)【模板】 威佐夫博弈(Wythoff Game) 有两堆石子&#xff0c;数量任意&#xff0c;可以不同&#xff0c;游戏开始由两个人轮流取石子 游戏规定&#xff0c;每次有两种不同的取法 1)在任意的一堆中取走任意多的石子 2)可以在两堆中同时取走相同数量…

linux挂载新硬盘,查看新硬盘,格式化分区,创建挂载点,挂载逻辑卷,整盘方式挂载,LVM方式挂载,查看linux 磁盘卷组的剩余空间,ext4与xfs区别

摘要 挂载新硬盘&#xff0c;本文作者整理了几乎所有相关的知识点 作者采用的是本文第二种挂载方式&#xff08;LVM&#xff09;&#xff0c;只用了下面6条命令搞定 # 说明&#xff1a; # /dev/mapper/appvg-mylv1 逻辑卷完整名称 # # /dev/mapper目录是Linux系统中用…

Golang并发机制及CSP并发模型

Golang 并发机制及 CSP 并发模型 Golang 是一门为并发而生的语言&#xff0c;其并发机制基于 CSP&#xff08;Communicating Sequential Processes&#xff0c;通信顺序过程&#xff09; 模型。CSP 是一种描述并发系统中交互模式的正式语言&#xff0c;强调通过通信来共享内存…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…

基于蓝牙6.0的RSSI和UWB融合定位方法,可行性分析

融合RSSI&#xff08;接收信号强度指示&#xff09;和UWB&#xff08;超宽带&#xff09;两种技术进行蓝牙6.0定位是完全可行的&#xff0c;并且可以带来更高的定位精度和稳定性。本文给出分析和MATLAB仿真结果 文章目录 技术优势RSSIUWB融合的优势 实现方案数据融合算法硬件要…

Openfga 授权模型搭建

1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置&#xff1f; 根据官网来看 https://github.com/openfga/openfga/blob/main/.config-schema.json 这里讲述详细的每一个配置每一个类型 这些配…

零刻SER7接口及配置跑分

今天入手了一台迷你机-零刻SER7 &#xff0c;不得不说这机身是真的小啊&#xff0c;相比于传统台式机&#xff0c;它几乎不占空间&#xff0c;可以轻松放置在桌面、电视柜甚至背包中&#xff0c;非常适合需要频繁移动或空间有限的用户。尽管体积小巧&#xff0c;但零刻SER7在性…

ResNeSt: Split-Attention Networks 参考论文

参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译&#xff1a;[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…

能够对设备的历史数据进行学习与分析,通过与设备当前状态的比对,识别潜在故障并做出预判的名厨亮灶开源了。

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…

大数据学习之Kafka消息队列、Spark分布式计算框架一

Kafka消息队列 章节一.kafka入门 4.kafka入门_消息队列两种模式 5.kafka入门_架构相关名词 Kafka 入门 _ 架构相关名词 事件 记录了世界或您的业务中 “ 发生了某事 ” 的事实。在文档中 也称为记录或消息。当您向 Kafka 读取或写入数据时&#xff0c;您以事件的 形式执行…

爱书爱考平台说明

最近我开发了一个综合性的考试平台&#xff0c;内容包括但不限于职业资格证考试、成人教育、国家公务员考试等内容。目前1.0版本已经开发完成&#xff0c;其他的功能陆续完善中。 微信小程序搜索"爱书爱考" 微信小程序图标如下图: 目前维护了java相关的面试题的考题…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…