01OpenGL基本学习

文章目录

  • 第一节
    • 1、概念
        • 立即模式vs核心模式
    • 2、问题
  • 第二节
    • 1、三维坐标系![三维坐标系](https://i-blog.csdnimg.cn/direct/0703ba6b68914b08b1d14b936ccd862d.png)
    • 2、什么是模型?
    • 3、什么是颜色?
    • 4、材质
  • 第三节渲染管线
  • 第四节GLAD配置流程
    • 1、为什么需要GLAD?
    • 2、导入函数
  • 第五节创建窗体
  • 第六节事件回调
  • 第七节GLAD函数加载
    • 2、OpenGL状态机
  • 第七节封装
  • 第八节封装Application以及回调函数
  • 第9节CPU与GPU
  • 第十节标准化设备坐标(NDC)
    • 1、为什么要NDC
  • 第十一节VBO
    • 1、什么是VBO
  • 第十一节VAO
    • 1、准备VBO
  • 第十二节Shader
    • 1、GLSL语言
    • 2、shader的编译
  • 第十三节绘制一个三角形
  • 第十四节绘制流程
  • 第十四节总结绘制流程
  • 第十五节EBO
  • 第十六节彩色三角形分析
  • 第十七节Shader封装
  • 第十九节:变量与向量
  • 第二十节Uniform和Attribute的区别
  • 第二十一节纹理
  • 第二十一节Mipmap
  • 第二十二节:数学部分
    • 1、叉乘公式
    • 2、三维向量
    • 3、缩放
    • 4、视图正交投影
    • 视口变换
  • 第二十三节:绘制球体

第一节

1、概念

图形API:跨平台,跨编程语言的图形程序接口,用于调用GPU上的指令功能。

立即模式vs核心模式
  • 立即模式:3.0版本之前不会暴露太多细节
  • 核心渲染模式:3.0版本之后推出大量自由的功能

2、问题

1、图形API是什么?

  • 是一个由Khronos组织制定并且维护的规范
    2、ARB与Khronos是什么?
    -ARB组织缩写 Khronos是一个非盈利的联盟。
    3、游戏引擎与图形API
    -游戏引擎由图形API组成

第二节

1、三维坐标系三维坐标系

2、什么是模型?

网格(Mesh):存储了一个模型的几何形状数据

模型的概念
比如三角形:由三个顶点按顺序构成。(逆时针转)

3、什么是颜色?

RGB:红绿蓝(三个通道0-255)
光:意味着红绿蓝的光的强度
物体:意味着对红绿蓝的光的反射百分比
颜色理解

4、材质

描述了物体表面如何与光发生反应
比如:颜色 金属非金属 光滑粗糙等
Mesh+Material = 各种效果

第三节渲染管线

渲染
渲染过程:

渲染过程
梳理:
顶点数据
在这里插入图片描述

三维变换
三维变换
图元装配
图元装配

剪裁剔除
剪裁剔除

(前面是第一阶段)
光栅化
光栅化
片元着色
片元着色
混合与测试(第二阶段)
混合与测试

第四节GLAD配置流程

1、为什么需要GLAD?

1、为什么需要GLAD?

2、导入函数

在这里插入图片描述
配置网站:https://glad.dav1d.de/

第五节创建窗体

如图所示:
创建窗体的过程

#include<iostream>//注意:glad头文件必须在glfw之前引用
#include<glad/glad.h>
#include<GLFW/glfw3.h>
using namespace std;
/*
创建glfw窗体系统
*/const int height = 600;
const int width = 800;
int main()
{//1、初始化GLWF基本环节glfwInit();// 设置主版本号和次版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);// 设置OpenGL核心配置glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//2、创建窗体对象GLFWwindow*window = glfwCreateWindow(width,height, "LearnOpenGL",NULL,NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 设置窗体为当前上下文glfwMakeContextCurrent(window);//3、执行窗体循环while(!glfwWindowShouldClose(window)){//接收并且分发窗体消息//检查是否有需要处理的消息glfwPollEvents();}//4、退出GLFWglfwTerminate();return 0;
}

第六节事件回调

事件回调函数:

  • 事件回调函数:窗体激活响应鼠标等
    在这里插入图片描述

第七节GLAD函数加载

GLAD函数加载
在这里插入图片描述

2、OpenGL状态机

Opengl状态机
在这里插入图片描述
在这里插入图片描述

第七节封装

错误检查的封装

checkError.h
#pragma once
#ifdef Debug
#define GL_CALL(x) x;checkError();
#endif
void checkError();checkError.cpp
#include "checkError.h"
#include<iostream>
#include<assert.h>
#include<glad/glad.h>
#include<GLFW/glfw3.h>
void checkError()
{GLenum errorCode = glGetError();switch(errorCode){case GL_NO_ERROR:break;case GL_INVALID_ENUM:std::cout<<"GL_INVALID_ENUM"<<std::endl;break;case GL_INVALID_VALUE:std::cout<<"GL_INVALID_VALUE"<<std::endl;break;case GL_INVALID_OPERATION:std::cout<<"GL_INVALID_OPERATION"<<std::endl;break;case GL_INVALID_FRAMEBUFFER_OPERATION:std::cout<<"GL_INVALID_FRAMEBUFFER_OPERATION"<<std::endl;break;case GL_OUT_OF_MEMORY:std::cout<<"GL_OUT_OF_MEMORY"<<std::endl;break;default:std::cout<<"未知错误"<<std::endl;}assert(errorCode == GL_NO_ERROR);
}

第八节封装Application以及回调函数

封装思路
在这里插入图片描述
封装后的Application代码:
Application.h

#pragma once
#include<glad/glad.h>
#include "GLFW/glfw3.h"
#include<iostream>
#define app Application::getInstance()class GLFWwindow;
using ResizeCallback = void(*)(int width,int height);
using KeyBoardCallback = void(*)(int key,int action,int mods);
using MouseButtonCallback = void(*)(int button,int action,int mods);class Application
{public:~Application();//访问实例static Application* getInstance(); bool init(const int width,const int height);bool update();bool destroy();uint32_t getWidth() const;uint32_t getHeight() const;//存放变量private:uint32_t mWidth{0};uint32_t mHeight{0};GLFWwindow*mWindow{nullptr};static Application*m_instance;private://1、回到函数指针ResizeCallback mResizeCallback{nullptr}; KeyBoardCallback mKeyBoardCallback{nullptr};MouseButtonCallback mMouseButtonCallback{nullptr};public://2、设置回调函数void setResizeCallback(ResizeCallback callback){mResizeCallback = callback;}void setKeyBoardCallback(KeyBoardCallback callback){mKeyBoardCallback = callback;   }void setMouseButtonCallback(MouseButtonCallback callback){mMouseButtonCallback = callback;}private:static void frameBufferSizeCallback(GLFWwindow* window,int width,int height);static void keyBoardCallback(GLFWwindow* window,int key,int action,int scancode,int mods);static void mouseButtonCallback(GLFWwindow* window,int button,int action,int mods);private:Application();void operator=(const Application&){};Application(const Application&){};void operator=(const Application&&){};Application(const Application&&){};};Application.cpp
#include "Application.h"
#include "GLFW/glfw3.h"Application*Application::m_instance = nullptr;
// 非线程安全的封装
Application* Application::getInstance()
{if(m_instance == nullptr){m_instance = new Application();}return m_instance;
}uint32_t Application::getWidth() const
{return mWidth;
}
uint32_t Application::getHeight() const
{return mHeight;
}bool Application::init(const int width = 800,const int height= 600)
{mWidth = width;mHeight = height;//1、初始化GLWF基本环节glfwInit();// 设置主版本号和次版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);// 设置OpenGL核心配置glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//2、创建窗体对象mWindow = glfwCreateWindow(mWidth,mHeight, "LearnOpenGL",NULL,NULL);if (mWindow == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return false;}// 设置窗体为当前上下文glfwMakeContextCurrent(mWindow);//使用glad加载所有当期啊版本的opengl函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return false;}glfwSetFramebufferSizeCallback(mWindow, frameBufferSizeCallback);glfwSetKeyCallback(mWindow, keyBoardCallback);glfwSetMouseButtonCallback(mWindow, mouseButtonCallback);//this就是当前全局唯一的Application对象glfwSetWindowUserPointer(mWindow, this);return true;
}
bool Application::update()
{if(glfwWindowShouldClose(mWindow)){return false;}//接收并且分发窗体消息//检查是否有需要处理的消息glfwPollEvents();//渲染操作glfwSwapBuffers(mWindow); //双缓冲return true;
}
bool Application::destroy()
{//4、退出GLFWglfwTerminate();
}
//4
void Application::frameBufferSizeCallback(GLFWwindow* window,int width,int height)
{std::cout<<"Resize: "<<width<<" "<<height<<std::endl;Application*self = (Application*)glfwGetWindowUserPointer(window);self->mResizeCallback(width,height);// if(Application::getInstance()->mResizeCallback != nullptr)// {//     Application::getInstance()->mResizeCallback(width,height);// }
}
void Application::keyBoardCallback(GLFWwindow* window,int key,int scancode,int action,int mods)
{std::cout<<"key: "<<key<<" "<<action<<std::endl;if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){glfwSetWindowShouldClose(window, true);}Application*self = (Application*)glfwGetWindowUserPointer(window);self->mKeyBoardCallback(key,action,mods);
}void Application::mouseButtonCallback(GLFWwindow* window,int button,int action,int mods)
{std::cout<<"mouse: "<<button<<" "<<action<<std::endl;Application*self = (Application*)glfwGetWindowUserPointer(window);self->mMouseButtonCallback(button,action,mods);
}Application::Application()
{}Application::~Application()
{}

第9节CPU与GPU

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十节标准化设备坐标(NDC)

1、为什么要NDC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十一节VBO

1、什么是VBO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十一节VAO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、准备VBO

在这里插入图片描述
2、构建VAO
在这里插入图片描述
在这里插入图片描述
代码:

GLuint vao;
void prepareShader()
{GLuint posvbo,colorvbo;float vertices[] = {0.0f, 0.5f, 0.0f,-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f};float colors[] = {1.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f,0.0f, 0.0f, 1.0f};//创建vaoGL_CALL(glGenVertexArrays(1, &vao));GL_CALL(glBindVertexArray(vao));//创建vboGL_CALL(glGenBuffers(1, &posvbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER,posvbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW));GL_CALL(glGenBuffers(1, &colorvbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER,colorvbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER,sizeof(colors),colors,GL_STATIC_DRAW));//设置顶点属性指针glBindBuffer(GL_ARRAY_BUFFER,posvbo);GL_CALL(glEnableVertexAttribArray(0));GL_CALL(glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0));glBindBuffer(GL_ARRAY_BUFFER,colorvbo);GL_CALL(glEnableVertexAttribArray(1));GL_CALL(glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0));//释放绑定glBindBuffer(GL_ARRAY_BUFFER,0);glBindVertexArray(0);}

在这里插入图片描述

第十二节Shader

什么是shader?
一种运行在GPU上的着色器程序(类c语言)
在这里插入图片描述

1、GLSL语言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、shader的编译

在这里插入图片描述

第十三节绘制一个三角形

#include<iostream>//注意:glad头文件必须在glfw之前引用
#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include<assert.h>
#include<wrapper/checkError.h>
#include<app/Application.h>
using namespace std;
/*单例类(全局唯一实例)成员变量 +成员函数2.1 成员函数-init(初始化)2.2 成员函数-update(每一帧执行)2.3 成员函数-destroy(结尾执行)响应回调函数(Resize)3.1 声明一个函数指针ResizeCallback3.2 声明一个ResizeCallback类型的成员变量3.3 声明一个SetResizeCallback的函数 ,设置窗体变化响应回调函数3.4 声明一个static的静态函数,用于响应glfw窗体变化3.5 将静态函数设置到glfw的监听Resize监听当中3.6*学会使用glfw的UserPointer响应键盘消息(OnKeyBoard)4.1VBO的创建销毁4.2练习绑定vbo,向vbo传输数据-glBindBuffer-glBufferData
*/
void OnResize(int width,int height)
{std::cout<<"OnResize"<<std::endl;
}
void OnMouse(int button, int action, int mod)
{std::cout<<"OnMouse"<<std::endl;
}
void OnKeyBoard(int key, int action, int mod)
{std::cout<<"OnKeyBoard"<<std::endl;
}const int height = 600;
const int width = 800;GLuint vao;
GLuint shaderProgram;
void prepareShader()
{GLuint posvbo,colorvbo;float vertices[] = {0.0f, 0.5f, 0.0f,-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f};float colors[] = {1.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f,0.0f, 0.0f, 1.0f};//创建vaoGL_CALL(glGenVertexArrays(1, &vao));GL_CALL(glBindVertexArray(vao));//创建vboGL_CALL(glGenBuffers(1, &posvbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER,posvbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW));GL_CALL(glGenBuffers(1, &colorvbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER,colorvbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER,sizeof(colors),colors,GL_STATIC_DRAW));//设置顶点属性指针glBindBuffer(GL_ARRAY_BUFFER,posvbo);GL_CALL(glEnableVertexAttribArray(0));GL_CALL(glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0));glBindBuffer(GL_ARRAY_BUFFER,colorvbo);GL_CALL(glEnableVertexAttribArray(1));GL_CALL(glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0));//释放绑定glBindBuffer(GL_ARRAY_BUFFER,0);glBindVertexArray(0);}void prepare()
{// 1、完成vs和fsconst char* vertexShaderSource = "#version 460 core\n""layout (location = 0) in vec3 aPos;\n""layout (location = 1) in vec3 aColor;\n"  // 接收颜色数据"out vec3 vertexColor;\n"  // 输出颜色数据给片段着色器"void main()\n""{\n""   gl_Position = vec4(aPos, 1.0);\n""   vertexColor = aColor;\n"  // 将颜色传递给片段着色器"}\n\0";const char* fragmentShaderSource ="#version 460 core\n""out vec4 FragColor;\n""in vec3 vertexColor;\n"  // 接收传入的颜色数据"void main()\n""{\n""   FragColor = vec4(vertexColor, 1.0f);\n"  // 使用传入的颜色数据"}\n\0";// 2、创建shader程序(fs,vs)GLuint vertex,fragment;vertex = glCreateShader(GL_VERTEX_SHADER);fragment = glCreateShader(GL_FRAGMENT_SHADER);//3、编译shader程序glShaderSource(vertex,1,&vertexShaderSource,NULL);glCompileShader(vertex);glShaderSource(fragment,1,&fragmentShaderSource,NULL);glCompileShader(fragment);//4、创建shader程序对象shaderProgram = glCreateProgram();//5、将shader程序对象链接到shader程序glAttachShader(shaderProgram,vertex);glAttachShader(shaderProgram,fragment);glLinkProgram(shaderProgram);//6、使用shader程序// glUseProgram(shaderProgram);//7、释放shader程序glDeleteShader(vertex);glDeleteShader(fragment);}int main()
{if(!app->init(width, height)){return -1;}app->setResizeCallback(OnResize);app->setKeyBoardCallback(OnKeyBoard);app->setMouseButtonCallback(OnMouse);GL_CALL(glViewport(0, 0, width, height));//准备着色器prepareShader();prepare();GL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));while(app->update()){GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//画三角形GL_CALL(glUseProgram(shaderProgram));GL_CALL(glad_glBindVertexArray(vao));GL_CALL(glDrawArrays(GL_TRIANGLES, 0, 3));}app->destroy();return 0;
}

在这里插入图片描述
实现效果:
在这里插入图片描述
在这里插入图片描述

第十四节绘制流程

在这里插入图片描述

第十四节总结绘制流程

在这里插入图片描述

第十五节EBO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十六节彩色三角形分析

光栅化
在这里插入图片描述

第十七节Shader封装

shader.h
#pragma once
#include "core.h"
#include<string>class Shader
{public:Shader(const char* vertexPath, const char* fragmentPath);~Shader();void begin();//开始使用当前shadervoid end(); //结束使用当前shaderprivate:void checkShaderErrors(GLuint target,std::string type);private:GLuint mprogramID{0}; //shader程序id
};shader.cpp
#include "shader.h"
#include "core.h"
#include <wrapper/checkError.h>
#include<iostream>
#include<fstream> //读取文件
#include <sstream>
#include <string>
Shader::Shader(const char* vertexPath, const char* fragmentPath)
{std::string vertexCode; //顶点着色器代码std::string fragmentCode; //片段着色器代码std::ifstream vShaderFile; //顶点着色器文件std::ifstream fShaderFile; //片段着色器文件vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);try{vShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);std::stringstream vShaderStream,fShaderStream;vShaderStream << vShaderFile.rdbuf();//读取文件内容fShaderStream << fShaderFile.rdbuf();vShaderFile.close();fShaderFile.close();vertexCode = vShaderStream.str();fragmentCode = fShaderStream.str();}catch(const std::ifstream::failure e){std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;}const char*vertexShaderCode = vertexCode.c_str();const char*fragmentShaderCode = fragmentCode.c_str();GLuint vertex,fragment;vertex = glCreateShader(GL_VERTEX_SHADER);fragment = glCreateShader(GL_FRAGMENT_SHADER);//输入代码glShaderSource(vertex,1,&vertexShaderCode,NULL);glShaderSource(fragment,1,&fragmentShaderCode,NULL);//编译着色器glCompileShader(vertex);checkShaderErrors(vertex, "VERTEX");glCompileShader(fragment);checkShaderErrors(fragment, "FRAGMENT");//创建着色器程序mprogramID = glCreateProgram();glAttachShader(mprogramID,vertex);glAttachShader(mprogramID,fragment);glLinkProgram(mprogramID);checkShaderErrors(mprogramID, "PROGRAM");//销毁glDeleteShader(vertex);glDeleteShader(fragment);
}
Shader::~Shader()
{}
void Shader::begin()//开始使用当前shader
{GL_CALL(glUseProgram(mprogramID)); //shader程序id
}
void Shader::end() //结束使用当前shader
{GL_CALL(glUseProgram(0));
}void Shader::checkShaderErrors(GLuint target,std::string type)
{int success = 0;char infoLog[1024];if(type == "VERTEX"|| type == "FRAGMENT"){glGetShaderiv(target,GL_COMPILE_STATUS,&success);if(!success){glGetShaderInfoLog(target,1024,NULL,infoLog);std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;}}else if(type == "PROGRAM"){glGetProgramiv(target,GL_LINK_STATUS,&success);if(!success){glGetProgramInfoLog(target,1024,NULL,infoLog);std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;}}else {std::cout << "ERROR::SHADER::TYPE_NOT_SUPPORTED" << std::endl;}
}

第十九节:变量与向量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二十节Uniform和Attribute的区别

在这里插入图片描述
在这里插入图片描述

第二十一节纹理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二十一节Mipmap

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二十二节:数学部分

1、叉乘公式

在这里插入图片描述
在这里插入图片描述

2、三维向量

在这里插入图片描述
在这里插入图片描述

3、缩放

在这里插入图片描述
翻转
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、视图正交投影

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

视口变换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二十三节:绘制球体

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

测试-请求特定资源使用Postman工具(3)

目录 前言 实操 开发者工具 前言 介绍过&#xff0c;就不再介绍了&#xff0c;只需要知道它是一个网络请求的工具就行了 实操 开发者工具 这里我们还需要借助开发者工具来帮助我们进行资源的请求&#xff0c;这里用 百度一下 进行测试 如下是 百度一下 的首页 右键打开…

Foliate:沉浸式阅读!!!

项目简介 Foliate 是一款开源的电子书阅读器&#xff0c;专为现代操作系统设计&#xff0c;提供了优雅且实用的阅读体验。它支持多种电子书格式&#xff0c;包括 EPUB、Mobipocket、Kindle、FB2、CBZ 和 PDF&#xff0c;让用户能够以分页或滚动模式阅读。Foliate 允许用户自定义…

打包18款AI营销神器,批量运营项目收藏必备!

淘金的不如卖铲子的&#xff0c;AI工具的应用越来越普及&#xff0c;这也让很多原本淘金的人都来卖铲子。如果自己能有很好的铲子&#xff0c;自己也会淘金&#xff0c;就可以既能卖铲子赚钱&#xff0c;也能掏金赚钱。 还有两天就是双十一了&#xff0c;各种AI工具&#xff0…

【MyBatis源码】SQL 语句构建器AbstractSQL

文章目录 介绍org.apache.ibatis.jdbc.SQLSQL类使用示例SelectProvider搭配动态SQLAbstractSQL类源码分析 介绍 当我们需要使用Statement对象执行SQL时&#xff0c;SQL语句会嵌入Java代码中。SQL语句比较复杂时&#xff0c;我们可能会在代码中对SQL语句进行拼接&#xff0c;查…

Vue2进阶

1.el安装 官网地址 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.cn/#/zh-CN 安装 npm install element-ui -S 引入组件&#xff08;在 main.js&#xf…

案例:三次锁定(下)

第二步: 在 Form1.cs 中完成以下代码 using Dome16_三次锁定.service; using Dome16_三次锁定.service.serviceimpl; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

前端学习笔记—Vue3特性

一、 Vue3与Vite构建工具简介 image.png image.png image.png image.png Vite构建工具&#xff08;其他的打包工具有webpack&#xff0c;grunt&#xff0c;gulp&#xff09; image.png image.png 构建 二、创建Vue3项目 vite在TypeScript结合使用上&#xff0c;直接开箱即用&am…

iOS 去掉URL里面的百分号符号

遇到这个一段字符串 “publicId2030095197043302&publicBizTypeCONTENT_USER&chInfoch_life__chsub_Ndiscovery.featured&logoUrlhttps%3A%2F%2Fmdn.alipayobjects.com%2Fopen_content%2Fafts%2Fimg%2FA*_SUKQodfigcAAAAAAAAAAAAAfVx1AQ%2Foriginal&publicName…

node.js安装配置(Windows)

1、下载 CNPM Binaries Mirror 2、安装 3、验证 win R 进入cmd 4、配置环境变量 4.1、创建两个文件夹 4.2、安装目录进入cmd(配置全局属性) 配置两个命令&#xff1a; npm config set prefix "D:\liyunqing\nodejs\node_global"npm config set cache "D:\l…

jdbc中预防SQL攻击

目录 展示SQL攻击 举一个出现sql 攻击的例子 SQL攻击的原因 分析原因 阻止SQL攻击 PreparedStatement的含义 使用PreparedStatement的原因 步骤如下 注意 总结 展示SQL攻击 举一个出现sql 攻击的例子 假设我们在做登录业务时&#xff0c;思路是这样的&#xff1a; 首…

30.1 时序数据库TSDB的典型特点

本节重点介绍 : db-ranking网站对db进行排名时序数据特点时序数据库特点时序数据库遇到的挑战开源时间序列数据库 db-ranking 一个神奇的网站 https://db-engines.com/en/ranking 时序数据ranking https://db-engines.com/en/ranking/timeseriesdbms 排名方法 https://db-en…

14:00面试,14:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

架构师之路-学渣到学霸历程-49

实现不同终端的跳转实验 今天分享一下&#xff1a; nginx的跳转&#xff1a;主要看你的访问是手机还是网页&#xff1b;于是就有这个跳转的功能&#xff1b; 1、基础的环境部署 安装好nginx&#xff08;这里最好的就是干净的环境&#xff09;创建两个server&#xff1b;用于…

RK3568笔记1:BootRom

BootRom是瑞芯微公司在生产的CPU时&#xff0c;存储在内部flash中的一段固件代码&#xff0c;用于初始化硬件和启动系统。 RK3568 处理器也具备 BootROM。这是存储在处理器内部的只读存储器 (ROM) 中的一段代码&#xff0c;通常是不可修改的&#xff0c;其主要功能是在设备加电…

DataWind将字符串数组拆出多行的方法

摘要&#xff1a; 可视化建模中先将字符串split为array再用explode(array)即可 可视化建模 进入“可视化建模”页面 1.1 新建任务 如果团队内没有可视化建模任务。请点击“新建任务”&#xff0c;输入名称并确定。 1.2 建立数据连接 在左边栏中选择“数据连接”&#xff0c…

2024年【电工(中级)】考试及电工(中级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;中级&#xff09;考试参考答案及电工&#xff08;中级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及电工&#xff08;中级&#xff09;操作证已考过的学员汇总&#xff0c;相对有效帮…

【韩老师零基础30天学会Java】02章

sublime Text中本身没有GBK编码&#xff0c;需要安装 要在sublime Text中设置编码为GBK&#xff0c;请按照以下步骤操作 打开Sublime Text编辑器,点击菜单栏中的“Preferences”(首选项)选项&#xff0c;找打Package Control选项。点击Package Control&#xff0c;随后搜索Inst…

Pytorch实现运动鞋识别

Pytorch实现运动鞋识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#xff1a;j…

老年人跌倒智能检测系统

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

Spring Boot原理全解析:如何让开发更轻松高效(二)-起步依赖、自动装配

通过这篇博客&#xff0c;读者将能够掌握 Spring Boot 中的配置优先级和 Bean 管理的核心原理&#xff0c;为开发更加高效、可维护的 Spring Boot 应用打下坚实的基础。 目录 前言 起步依赖 自动配置 概述 常见方案 概述 方案一 方案二 总结 前言 通过这篇博客&#xf…