Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 03 - Materials
学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/03%20Materials/
VS、qt版本分别给了多个文件和一个项目,都在同一个包内:https://download.csdn.net/download/zzjzmdx/18398310
展示图:
Visual Studio 2019
代码如下:
Materials-01.cpp
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>#include "shader.h"
#include "camera.h"#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void mouse_callback(GLFWwindow* window, double xpos, double ypos);
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void processInput(GLFWwindow* window);Camera camera(glm::vec3(0.0f, 0.0f, 4.0f));
float lastX = SCR_WIDTH / 2.0f;
float lastY = SCR_HEIGHT / 2.0f;
bool firstMouse = true;float deltaTime = 0.0f;
float lastFrame = 0.0f;glm::vec3 lightPos(0.0f, 0.5f, 2.0f);float vertices[] = {-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
};int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);glfwSetCursorPosCallback(window, mouse_callback);glfwSetScrollCallback(window, scroll_callback);glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}glEnable(GL_DEPTH_TEST);Shader lightingShader("./2.3cube.vs", "./2.3cube.fs");Shader lightCubeShader("./2.3light.vs", "./2.3light.fs");unsigned int VBO, cubeVAO;glGenVertexArrays(1, &cubeVAO);glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glBindVertexArray(cubeVAO);// position attributeglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// normal attributeglVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);unsigned int lightCubeVAO;glGenVertexArrays(1, &lightCubeVAO);glBindVertexArray(lightCubeVAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);while (!glfwWindowShouldClose(window)){float currentFrame = glfwGetTime();deltaTime = currentFrame - lastFrame;lastFrame = currentFrame;processInput(window);glClearColor(0.1f, 0.1f, 0.1f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);lightingShader.use();lightingShader.setVec3("light.position", lightPos);lightingShader.setVec3("viewPos", camera.Position);glm::vec3 lightColor;lightColor.x = sin(glfwGetTime() * 2.0f);lightColor.y = sin(glfwGetTime() * 0.7f);lightColor.z = sin(glfwGetTime() * 1.3f);glm::vec3 diffuseColor = lightColor * glm::vec3(0.5f); glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f);lightingShader.setVec3("light.ambient", ambientColor);lightingShader.setVec3("light.diffuse", diffuseColor);lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);lightingShader.setVec3("material.ambient", 1.0f, 0.5f, 0.31f);lightingShader.setVec3("material.diffuse", 1.0f, 0.5f, 0.31f);lightingShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);lightingShader.setFloat("material.shininess", 32.0f);glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);glm::mat4 view = camera.GetViewMatrix();lightingShader.setMat4("projection", projection);lightingShader.setMat4("view", view);glm::mat4 model = glm::mat4(1.0f);lightingShader.setMat4("model", model);glBindVertexArray(cubeVAO);glDrawArrays(GL_TRIANGLES, 0, 36);lightCubeShader.use();lightCubeShader.setMat4("projection", projection);lightCubeShader.setMat4("view", view);model = glm::mat4(1.0f);model = glm::translate(model, lightPos);model = glm::scale(model, glm::vec3(0.1f));lightCubeShader.setMat4("model", model);glBindVertexArray(lightCubeVAO);glDrawArrays(GL_TRIANGLES, 0, 36);glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(1, &cubeVAO);glDeleteVertexArrays(1, &lightCubeVAO);glDeleteBuffers(1, &VBO);glfwTerminate();return 0;
}void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)camera.ProcessKeyboard(FORWARD, deltaTime);if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)camera.ProcessKeyboard(BACKWARD, deltaTime);if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)camera.ProcessKeyboard(LEFT, deltaTime);if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)camera.ProcessKeyboard(RIGHT, deltaTime);
}void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{if (firstMouse){lastX = xpos;lastY = ypos;firstMouse = false;}float xoffset = xpos - lastX;float yoffset = lastY - ypos;lastX = xpos;lastY = ypos;camera.ProcessMouseMovement(xoffset, yoffset);
}void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{camera.ProcessMouseScroll(yoffset);
}
qt 5.15.1
代:码如下
Materials-01.cpp
#include "Materials.h"float vertices[] = {-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
};QVector3D lightPos(0.0f, 0.5f, 2.0f);Materials::Materials(QWidget *parent): QOpenGLWidget(parent)
{
}Materials::~Materials()
{m_cubeVAO->destroy();m_vbo->destroy();m_lightVAO->destroy();
}void Materials::initializeGL()
{initializeOpenGLFunctions();glEnable(GL_DEPTH_TEST);//物体的QOpenGLShaderProgramm_cubeProgram = new QOpenGLShaderProgram();//vertex shader 顶点着色器m_cubeProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vcube.glsl");//fragment shader 片段着色器m_cubeProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fcube.glsl");m_cubeProgram->link();m_cubeProgram->bind();//激活Program对象//物体的VAOm_cubeVAO = new QOpenGLVertexArrayObject();m_cubeVAO->create();m_cubeVAO->bind();m_vbo = new QOpenGLBuffer(QOpenGLBuffer::Type::VertexBuffer);m_vbo->create();m_vbo->bind();m_vbo->allocate(vertices, sizeof(vertices));m_vbo->setUsagePattern(QOpenGLBuffer::StreamDraw);GLint cubePos = m_cubeProgram->attributeLocation("cubePos");if(cubePos==-1){return;}m_cubeProgram->setAttributeBuffer(cubePos, GL_FLOAT, 0, 3, 6*sizeof(GLfloat));m_cubeProgram->enableAttributeArray(cubePos);GLint cubeNormal = m_cubeProgram->attributeLocation("cubeNormal");if(cubeNormal==-1){return;}m_cubeProgram->setAttributeBuffer(cubeNormal, GL_FLOAT, 3*sizeof(GLfloat), 3, 6*sizeof(GLfloat));m_cubeProgram->enableAttributeArray(cubeNormal);//物体的QOpenGLShaderProgramm_lightProgram = new QOpenGLShaderProgram();//vertex shader 顶点着色器m_lightProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vlight.glsl");//fragment shader 片段着色器m_lightProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/flight.glsl");m_lightProgram->link();m_lightProgram->bind();//激活Program对象m_lightVAO = new QOpenGLVertexArrayObject();m_lightVAO->create();m_lightVAO->bind();m_vbo->bind();GLint lightPos = m_lightProgram->attributeLocation("lightPos");if(lightPos==-1){return;}m_lightProgram->setAttributeBuffer(lightPos, GL_FLOAT, 0, 3, 6*sizeof(GLfloat));m_lightProgram->enableAttributeArray(lightPos);m_vbo->release();m_time_c = QTime::currentTime();
}void Materials::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);QMatrix4x4 projection;projection.perspective(fov, (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.1f, 100.0f);QMatrix4x4 view;m_time = QTime::currentTime();m_deltaTime = m_time.msecsTo(m_lasttime)/1000.0f;m_lasttime = m_time;//一个位置、目标和上向量view.lookAt(cameraPos, cameraPos + cameraFront, cameraUp);QMatrix4x4 model;float timeValue = m_time_c.msecsTo(QTime::currentTime())/2000.0f;if(m_cubeProgram->isLinked()){m_cubeProgram->bind();m_cubeProgram->setUniformValue("light.position", lightPos);m_cubeProgram->setUniformValue("viewPos", cameraPos);QVector3D lightColor(1.0f, 2.0f, 3.0f);lightColor.setX(sin(timeValue * 2.0f));lightColor.setY(sin(timeValue * 0.7f));lightColor.setZ(sin(timeValue * 1.3f));QVector3D diffuseColor = lightColor * QVector3D(0.5f,0.5f,0.5f);QVector3D ambientColor = diffuseColor * QVector3D(0.2f,0.2f,0.2f);m_cubeProgram->setUniformValue("light.ambient", ambientColor);m_cubeProgram->setUniformValue("light.diffuse", diffuseColor);m_cubeProgram->setUniformValue("light.specular", 1.0f, 1.0f, 1.0f);m_cubeProgram->setUniformValue("material.ambient", 1.0f, 0.5f, 0.31f);m_cubeProgram->setUniformValue("material.diffuse", 1.0f, 0.5f, 0.31f);m_cubeProgram->setUniformValue("material.specular", 0.5f, 0.5f, 0.5f);m_cubeProgram->setUniformValue("material.shininess", 32.0f);m_cubeProgram->setUniformValue("cubemodel", model);m_cubeProgram->setUniformValue("cubeview", view);m_cubeProgram->setUniformValue("cubeprojection", projection);}m_cubeVAO->bind();glDrawArrays(GL_TRIANGLES, 0, 36);m_cubeVAO->release();m_cubeProgram->release();model.translate(lightPos);model.scale(QVector3D(0.2f, 0.2f, 0.2f));if(m_lightProgram->isLinked()){m_lightProgram->bind();m_lightProgram->setUniformValue("lightmodel", model);m_lightProgram->setUniformValue("lightview", view);m_lightProgram->setUniformValue("lightprojection", projection);}m_lightVAO->bind();glDrawArrays(GL_TRIANGLES, 0, 36);m_lightVAO->release();m_lightProgram->release();update();
}void Materials::mouseMoveEvent(QMouseEvent *event)
{int xpos = event->x();int ypos = event->y();if (firstMouse){lastX = xpos;lastY = ypos;firstMouse = false;}float xoffset = xpos - lastX;float yoffset = lastY - ypos;lastX = xpos;lastY = ypos;float sensitivity = 0.1f;xoffset *= sensitivity;yoffset *= sensitivity;yaw += xoffset;pitch += yoffset;if (pitch > 89.0f)pitch = 89.0f;if (pitch < -89.0f)pitch = -89.0f;QVector3D front = QVector3D(0.0f, 0.0f, 3.0f);front.setX(cos(qDegreesToRadians(yaw)) * cos(qDegreesToRadians(pitch)));front.setY(sin(qDegreesToRadians(pitch)));front.setZ(sin(qDegreesToRadians(yaw)) * cos(qDegreesToRadians(pitch)));cameraFront = front;
}void Materials::wheelEvent(QWheelEvent *event){float flagNumber = 1;if(event->angleDelta().y()>0){flagNumber = 1;}else{flagNumber = -1;}fov -= flagNumber;
// if (fov < 1.0f)
// fov = 1.0f;
// if (fov > 45.0f)
// fov = 45.0f;
}void Materials::keyPressEvent(QKeyEvent *event)
{float cameraSpeed = m_deltaTime;if(event->key() == Qt::Key_Escape){close();}if(event->key() == Qt::Key_W){cameraPos += cameraSpeed * cameraFront;}if(event->key() == Qt::Key_S){cameraPos -= cameraSpeed * cameraFront;}if(event->key() == Qt::Key_A){cameraPos -= QVector3D::crossProduct(cameraFront, cameraUp) * cameraSpeed;}if(event->key() == Qt::Key_D){cameraPos += (QVector3D::crossProduct(cameraFront, cameraUp)) * cameraSpeed;}
}void Materials::resizeGL(int w, int h)
{}
Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 03 - Materials相关推荐
- Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 02 - BasicLighting
学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/ VS.qt版本分别给 ...
- Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 01 - Colors
学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/ VS.qt版本分别给了多个文件和一个项目 ...
- Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 06 - MultipleLights
学习learnopengl文章对应地址: https://learnopengl-cn.github.io/02%20Lighting/06%20Multiple%20lights/ VS.qt版本分 ...
- 【Tools】Visual Studio 2019搭建Qt开发环境
00. 目录 文章目录 00. 目录 01. 概述 02. Visual Studio 2019安装 03. Qt6安装 04. qt-vsaddin插件下载 05. qt-vsaddin插件安装 0 ...
- 使用Visual Studio 2019开发Qt程序
安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...
- 在visual studio 2019中使用msvc2015
1.配置visual studio中的qt 下载相应版本的qt插件,这里用的是 qt-vsaddin-msvc2017-2.7.0.vsix 插件下载地址:https://download.qt.io ...
- 【网络通信 -- 直播】OBS -- 基于 Visual Studio 2019 + Qt 5.15.2 编译调试 OBS studio 源码
[网络通信 -- 直播]OBS -- 基于 Visual Studio 2019 + Qt 5.15.2 编译调试 OBS studio 源码 [1]OBS 代码获取 github : git clo ...
- [Qt小白磨刀石]使用Visual Studio 2019+Qt 5.14.2创建GUI程序指南之开发环境配置篇
1. Visual studio 2019 的安装 a) 点此地址进入 Visual Studio 官网,下载 Community 2019 版(实际下载的为安装器) b) 安装完后会启动 Visua ...
- visual studio 2019与c语言生成纯色与随机条纹bmp图片并转化为jpg格式
visual studio 2019与c语言生成纯色与随机条纹bmp图片并转化为jpg格式(可用于图片生成,插入与测试,主要难点在于压缩图片,图片间不同格式的相互转化) 生成纯色代码如下: #incl ...
最新文章
- 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
- 16. 最接近的三数之和
- LG状告索尼侵权招致荷兰停息出口PS3
- POJ 1182 食物链 (并查集解法)(详细注释)
- java json特殊字符处理_java json字符串传递给 js 时 特殊字符转义错误 研究
- CERC2017 Gambling Guide,最短路变形,期望dp
- js笔记(二)数组、对象、this
- [转载] Java三元运算符示例
- python 保存pdf文件_PyPDF2读取PDF文件内容保存到本地TXT实例
- Python笔记16-------类
- redis安装----非基于lnmp安装
- 第三届网络安全冬训营“朔雪飞扬”在哈尔滨开幕
- 推荐linux视频下载地址分享
- 大屏导航Linux系统下载,掌讯方案MTK3561大屏导航ROOT固件
- PPT进行图片的背景去除以及填充新背景,保存图片为PDF
- 餐巾计划(网络流24题之二(模板2))
- 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
- linux看不到光模块,万兆光模块无法识别问题
- 基于GPT模型的对话系统
- 如何用“底层逻辑“看透世界的底牌?| 刘润最新演讲-学习总结