学习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相关推荐

  1. Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 02 - BasicLighting

    学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/ VS.qt版本分别给 ...

  2. Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 01 - Colors

    学习learnopengl文章对应地址:https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/ VS.qt版本分别给了多个文件和一个项目 ...

  3. Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 06 - MultipleLights

    学习learnopengl文章对应地址: https://learnopengl-cn.github.io/02%20Lighting/06%20Multiple%20lights/ VS.qt版本分 ...

  4. 【Tools】Visual Studio 2019搭建Qt开发环境

    00. 目录 文章目录 00. 目录 01. 概述 02. Visual Studio 2019安装 03. Qt6安装 04. qt-vsaddin插件下载 05. qt-vsaddin插件安装 0 ...

  5. 使用Visual Studio 2019开发Qt程序

    安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...

  6. 在visual studio 2019中使用msvc2015

    1.配置visual studio中的qt 下载相应版本的qt插件,这里用的是 qt-vsaddin-msvc2017-2.7.0.vsix 插件下载地址:https://download.qt.io ...

  7. 【网络通信 -- 直播】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 ...

  8. [Qt小白磨刀石]使用Visual Studio 2019+Qt 5.14.2创建GUI程序指南之开发环境配置篇

    1. Visual studio 2019 的安装 a) 点此地址进入 Visual Studio 官网,下载 Community 2019 版(实际下载的为安装器) b) 安装完后会启动 Visua ...

  9. visual studio 2019与c语言生成纯色与随机条纹bmp图片并转化为jpg格式

    visual studio 2019与c语言生成纯色与随机条纹bmp图片并转化为jpg格式(可用于图片生成,插入与测试,主要难点在于压缩图片,图片间不同格式的相互转化) 生成纯色代码如下: #incl ...

最新文章

  1. 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
  2. 16. 最接近的三数之和
  3. LG状告索尼侵权招致荷兰停息出口PS3
  4. POJ 1182 食物链 (并查集解法)(详细注释)
  5. java json特殊字符处理_java json字符串传递给 js 时 特殊字符转义错误 研究
  6. CERC2017 Gambling Guide,最短路变形,期望dp
  7. js笔记(二)数组、对象、this
  8. [转载] Java三元运算符示例
  9. python 保存pdf文件_PyPDF2读取PDF文件内容保存到本地TXT实例
  10. Python笔记16-------类
  11. redis安装----非基于lnmp安装
  12. 第三届网络安全冬训营“朔雪飞扬”在哈尔滨开幕
  13. 推荐linux视频下载地址分享
  14. 大屏导航Linux系统下载,掌讯方案MTK3561大屏导航ROOT固件
  15. PPT进行图片的背景去除以及填充新背景,保存图片为PDF
  16. 餐巾计划(网络流24题之二(模板2))
  17. 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
  18. linux看不到光模块,万兆光模块无法识别问题
  19. 基于GPT模型的对话系统
  20. 如何用“底层逻辑“看透世界的底牌?| 刘润最新演讲-学习总结

热门文章

  1. darksky 经纬度_使用DarkSky API构建天气应用
  2. C#网络编程 - 局域网聊天室(UDP)
  3. 那些指责集度ROBO-01抄袭者,更应该学习它对未来汽车的思考
  4. 腾讯云简单使用-Python
  5. 降本增收 相约Q4 |衡石九月头条
  6. 50个经典的增长黑客策略高效实现增长
  7. HCIA基础知识(1)
  8. 跳舞遇到这五种人,请珍惜!入门舞感的四点必看!
  9. 微信公众号 服务器自动回复,微信订阅后台自动回复功能的实现
  10. mysql left join 索引失效