前面几章主要是针对物体,现在开始针对光源!

一、平行光

在 OpenGL基础18:光照基础 这一章里面讲了几种常见光源,先看平行光吧

一个很好的例子就是太阳光,因为离我们的距离过远,所以太阳光的特点就是“无限范围”且平行

所有的光线都是平行的,这样的话物体与光源的相对位置是不重要的,在之前的章节,Light里面都有position这一属性,对于平行光而言,这个属性就由direction替代,代码改动如下:

struct Light
{// vec3 position;vec3 direction;vec3 ambient;vec3 diffuse;vec3 specular;
};
//……
void main()
{//……vec3 lightDir = normalize(-light.direction);//……
}
GLint lightPosLoc = glGetUniformLocation(shaderObj.Program, "light.direction");
glUniform3f(lightPosLoc, -0.2f, -1.0f, -0.3f);

别忘了main()方法里的lightDir是从片段发出朝向光源的方向,所以注意符号

就这么简单,然后就可以测试看下了

如果想要在不修改着色器的情况下选择传入方向还是位置来确定是方向光还是点光源,那么可以传入vec4而并非vec3,正好:位置有位移但是方向没有位移,因此如果是想表达方向的话就将第四位w设为0.0,如果是想表达位置的话就把第四位w设为1.0,并在着色器中进行 if 判断

二、点光源

之前的例子一直就是点光源,但是非常的简单,并没有体现强度的衰减,无论物体离光源多远都被照的一样亮

  • 衰减(Attenuation):随着光线穿越距离的变远使得亮度也相应地减少的现象

很容易想到用一个线性公式来计算当前物体表面的光线强度,其中变量为距离,但其实这是不太真实的,在现实世界里,通常光源的亮度往往在开始的时候减少的非常快,之后随着距离的增加衰减的速度会慢下来,因此这至少是一个二次的关系

再考虑到光强和距离是一个反比关系,这样就可以得出一个基础的二次公式:

其中  的取值由很多因素决定:环境、你希望光所覆盖的距离范围、光的类型等,和材质一样,设置这些参数也是一个经验的问题,在实际运用中,往往可以通过调参来获取一个尽可能满意的效果

一个参考(来源于维基百科):

距离 常数项 一次项 二次项
7 1 0.7 1.8
13 1 0.35 0.44
20 1 0.22 0.2
32 1 0.14 0.07
50 1 0.09 0.032
65 1 0.07 0.017
100 1 0.045 0.0075
160 1 0.027 0.0028
325 1 0.014 0.0007
600 1 0.007 0.0002
3250 1 0.0014 0.000007

其中距离可以理解为光的“射程”,可以从表中看出:

  • :常数项,通常为1,为了保证最后的光强不会超过1
  • :线性常数,就是上面所说的随着距离越远,光强等比减弱
  • :亮度的二次递减

理论搞定,有了前面的基础应该非常好实现,直接上完整代码:

着色器部分:

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 texture;
out vec2 texIn;
out vec3 normalIn;
out vec3 fragPosIn;
uniform mat4 model;             //模型矩阵
uniform mat4 view;              //观察矩阵
uniform mat4 projection;        //投影矩阵
void main()
{gl_Position = projection * view * model * vec4(position, 1.0);texIn = vec2(texture.x, 1.0f - texture.y);fragPosIn = vec3(model * vec4(position, 1.0f));normalIn = mat3(transpose(inverse(model))) * normal;
}///#version 330 core
struct Material
{sampler2D diffuse;      //贴图sampler2D specular;     //镜面贴图sampler2D emission;     //放射贴图float shininess;        //反光度
};
struct Light
{vec3 position;vec3 ambient;vec3 diffuse;vec3 specular;float k0, k1, k2;
};
uniform Material material;
uniform Light light;
out vec4 color;
uniform vec3 viewPos;
in vec2 texIn;
in vec3 fragPosIn;
in vec3 normalIn;
void main()
{//环境光vec3 ambient = light.ambient * vec3(texture(material.diffuse, texIn));//漫反射光vec3 norm = normalize(normalIn);vec3 lightDir = normalize(light.position - fragPosIn);float diff = max(dot(norm, lightDir), 0.0f);vec3 diffuse = light.diffuse * (diff * vec3(texture(material.diffuse, texIn)));//镜面光vec3 viewDir = normalize(viewPos - fragPosIn);vec3 reflectDir = reflect(-lightDir, norm);float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);vec3 specular = light.specular * (spec * vec3(texture(material.specular, texIn)));//放射光贴图//vec3 emission = vec3(texture(material.emission, texIn));//点光源float dis = length(light.position - fragPosIn);float attenuation = 1.0f / (light.k0 + light.k1 * dis + light.k2 * (dis * dis));//混合diffuse *= attenuation;specular *= attenuation;vec3 result = ambient + diffuse + specular;color = vec4(result, 1.0f);
}

main.cpp:

#include<iostream>
#include<opengl/glew.h>
#define GLEW_STATIC
#include<GLFW/glfw3.h>
#include"Camera.h"
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
#include"Shader.h"
#include<opengl/freeglut.h>
#include<SOIL.h>bool keys[1024];
Camera camera;
GLfloat lastX, lastY;
bool firstMouse = true;
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void mouse_callback(GLFWwindow* window, double xpos, double ypos);
void cameraMove();
glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
const GLuint WIDTH = 800, HEIGHT = 600;int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);glfwSetKeyCallback(window, key_callback);glfwSetCursorPosCallback(window, mouse_callback);glfwSetScrollCallback(window, scroll_callback);glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);glewExperimental = GL_TRUE;glewInit();int width, height;glfwGetFramebufferSize(window, &width, &height);glViewport(0, 0, width, height);Shader shaderObj("ObjVShader.txt", "ObjFShader.txt");Shader shaderLight("LightVShader.txt", "LightFShader.txt");GLfloat vertices[] = {-0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f,  0.0f,0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f,  1.0f,0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  1.0f,  1.0f,-0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f,  1.0f,-0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,-0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f,  0.0f,0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f,  1.0f,0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  1.0f,  1.0f,-0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f,  1.0f,-0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,-0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  1.0f,  0.0f,-0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  1.0f,  1.0f,-0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  0.0f,  1.0f,-0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,  0.0f,  1.0f,-0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,-0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,  1.0f,  0.0f,0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  1.0f,  0.0f,0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  1.0f,  1.0f,0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  0.0f,  1.0f,0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,  0.0f,  1.0f,0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,  1.0f,  0.0f,-0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  0.0f,  1.0f,0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  1.0f,  1.0f,0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  1.0f,  0.0f,0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  1.0f,  0.0f,-0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,-0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,  0.0f,  1.0f,-0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f,  1.0f,0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  1.0f,  1.0f,0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  1.0f,  0.0f,0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  1.0f,  0.0f,-0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,-0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f,  1.0f};glm::vec3 position[] = {glm::vec3(0.0f, -2.0f, 0.0f),glm::vec3(0.0f, -1.0f, 0.0f),glm::vec3(0.0f, 0.0f, 0.0f),glm::vec3(-2.0f, -2.0f, 0.0f),glm::vec3(-2.0f, -1.0f, 0.0f),glm::vec3(-3.0f, -2.0f, 0.0f),glm::vec3(-2.0f, -2.0f, 1.0f),glm::vec3(-1.0f, -2.0f, -4.0f),};GLuint VBO, VAO, textureA, textureB;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));glEnableVertexAttribArray(2);int picWidth, picHeight;glGenTextures(1, &textureA);glBindTexture(GL_TEXTURE_2D, textureA);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);unsigned char* image = SOIL_load_image("Texture/wood2.jpg", &picWidth, &picHeight, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(image);glGenTextures(1, &textureB);glBindTexture(GL_TEXTURE_2D, textureB);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);image = SOIL_load_image("Texture/specular.jpg", &picWidth, &picHeight, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(image);glBindTexture(GL_TEXTURE_2D, 0);shaderObj.Use();glUniform1i(glGetUniformLocation(shaderObj.Program, "material.diffuse"), 0);glUniform1i(glGetUniformLocation(shaderObj.Program, "material.specular"), 1);GLuint lightVAO;glGenVertexArrays(1, &lightVAO);glBindVertexArray(lightVAO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);//VBO数据已经绑定且我们就用之前的顶点数据,所以无需再管理VBOglEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);glEnable(GL_DEPTH_TEST);while (!glfwWindowShouldClose(window)){glfwPollEvents();glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glClear(GL_DEPTH_BUFFER_BIT);cameraMove();shaderLight.Use();lightPos.x = 1.0f + sin(glfwGetTime()) * 2.0f;lightPos.y = sin(glfwGetTime() / 2.0f) * 1.0f;glm::mat4 view = camera.GetViewMatrix();glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (GLfloat)WIDTH / (GLfloat)HEIGHT, 0.1f, 100.0f);glm::mat4 model = glm::translate(glm::mat4(1.0f), lightPos);model = glm::scale(model, glm::vec3(0.2f));GLint modelLoc = glGetUniformLocation(shaderLight.Program, "model");GLint viewLoc = glGetUniformLocation(shaderLight.Program, "view");GLint projLoc = glGetUniformLocation(shaderLight.Program, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));glBindVertexArray(lightVAO);glDrawArrays(GL_TRIANGLES, 0, 36);shaderObj.Use();glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, textureA);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, textureB);GLint matSpecularLoc = glGetUniformLocation(shaderObj.Program, "material.specular");GLint matShineLoc = glGetUniformLocation(shaderObj.Program, "material.shininess");glUniform3f(matSpecularLoc, 0.0f, 0.0f, 0.0f);glUniform1f(matShineLoc, 32.0f);GLint lightPosLoc = glGetUniformLocation(shaderObj.Program, "light.position");GLint lightAmbientLoc = glGetUniformLocation(shaderObj.Program, "light.ambient");GLint lightDiffuseLoc = glGetUniformLocation(shaderObj.Program, "light.diffuse");GLint lightSpecularLoc = glGetUniformLocation(shaderObj.Program, "light.specular");GLint lightK0 = glGetUniformLocation(shaderObj.Program, "light.k0");GLint lightK1 = glGetUniformLocation(shaderObj.Program, "light.k1");GLint lightK2 = glGetUniformLocation(shaderObj.Program, "light.k2");glUniform3f(lightAmbientLoc, 0.2f, 0.2f, 0.2f);glUniform3f(lightDiffuseLoc, 1.0f, 1.0f, 1.0f);glUniform3f(lightSpecularLoc, 1.0f, 1.0f, 1.0f);glUniform1f(lightK0, 1.0f);glUniform1f(lightK1, 0.09f);glUniform1f(lightK2, 0.032f);glUniform3f(lightPosLoc, lightPos.x, lightPos.y, lightPos.z);GLint viewPosLoc = glGetUniformLocation(shaderObj.Program, "viewPos");glUniform3f(viewPosLoc, camera.Position.x, camera.Position.y, camera.Position.z);model = glm::mat4(1.0f);model = glm::rotate(model, glm::radians(57.0f), glm::vec3(-0.5f, 1.0f, 0.0f));modelLoc = glGetUniformLocation(shaderObj.Program, "model");viewLoc = glGetUniformLocation(shaderObj.Program, "view");projLoc = glGetUniformLocation(shaderObj.Program, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));glBindVertexArray(VAO);for (int i = 0; i <= 7; i++){model = glm::translate(glm::mat4(1.0f), position[i]);model = glm::rotate(model, glm::radians(0.0f), glm::vec3(-0.5f, 1.0f, 0.0f));glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glDrawArrays(GL_TRIANGLES, 0, 36);}glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glfwTerminate();return 0;
}GLfloat deltaTime = 0.0f;
GLfloat lastFrame = 0.0f;
void cameraMove()
{GLfloat currentFrame = glfwGetTime();deltaTime = currentFrame - lastFrame;lastFrame = currentFrame;GLfloat cameraSpeed = 1.0f * deltaTime;if (keys[GLFW_KEY_W])camera.ProcessKeyboard(Camera_Movement(FORWARD), deltaTime);if (keys[GLFW_KEY_S])camera.ProcessKeyboard(Camera_Movement(BACKWARD), deltaTime);if (keys[GLFW_KEY_A])camera.ProcessKeyboard(Camera_Movement(LEFT), deltaTime);if (keys[GLFW_KEY_D])camera.ProcessKeyboard(Camera_Movement(RIGHT), deltaTime);
}void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);if (action == GLFW_PRESS)           //如果当前是按下操作keys[key] = true;else if (action == GLFW_RELEASE)            //松开键盘keys[key] = false;
}void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{camera.ProcessMouseScroll(yoffset);
}void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{if (firstMouse){lastX = xpos;lastY = ypos;firstMouse = false;}GLfloat xoffset = xpos - lastX;GLfloat yoffset = lastY - ypos;lastX = xpos;lastY = ypos;GLfloat sensitivity = 0.05;xoffset *= sensitivity;yoffset *= sensitivity;camera.ProcessMouseMovement(xoffset, yoffset);
}

可以调下参数看下别的效果

OpenGL基础23:平行光与点光源相关推荐

  1. OpenGL基础25:多光源(附简单GLSL配置)

    到这里,光照基础就已经接近尾声了,当然对于光照渲染的学习,这可能只是百步中的一步,尽管如此,至少还是做到了从 0 到 1 的一个过程,就像之前刚学会"HelloWorld"一样,一 ...

  2. OpenGL基础24:聚光灯

    前置:OpenGL基础23:平行光与点光源 一.聚光灯 三种基础光源在上一章讲了2种,现在只剩下聚光灯了 手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点 依然有衰减,但是聚光灯的光照一般都 ...

  3. OpenGL基础54:点光源阴影

    前置: OpenGL基础53:阴影映射(下) 一.万象阴影贴图 之前成功实现了平行光阴影,生成阴影贴图时使用的矩阵是正交矩阵,若是想要实现点光源的阴影效果,那么理论上只需要修改投影矩阵为透视矩阵就好了 ...

  4. OpenGL基础44:光照矫正(上)

    对于openGL的API,倒是没有必要花太多时间,重点应该还是在着色器上 一.采样器.glActiveTexture和glBindTexture 在之前测试简单光照时可能出现的两个问题,尽管它们可能不 ...

  5. OpenGL基础40:Uniform缓冲

    前置:OpenGL基础39:GLSL内建变量与接口块 想想之前代码,glUniform()和glGetUniformLocation()的使用数量是不是过于频繁了,对于每个着色器的每一个uniform ...

  6. OpenGL基础28:模型

    参考文献:https://learnopengl.com/#!Getting-started/OpenGL 前置:OpenGL基础27:网格 一.模型 有了mesh类之后,接下来就是实现一个model ...

  7. OpenGL基础53:阴影映射(下)

    接上文:OpenGL基础52:阴影映射(上) 五.阴影失真 按照上文的计算的结果,一个很明显的问题是:对于参与计算深度贴图的物体,其表面可以看到这样的栅格状的阴影,这种常见的错误表现也叫做阴影失真(S ...

  8. OpenGL基础30:模板测试

    前置:OpenGL基础29:深度测试 一.模板测试 前面一章提到过:深度缓冲测试在片段着色器运行.以及模板测试(Stencil Testing)之后,那么这下知道模板测试是在什么时候了吧,模板测试和深 ...

  9. OpenGL基础图形编程

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

最新文章

  1. CodeIgniter 的购物车类只能添加10个商品的解决办法
  2. Android--制作开场动画/MediaPlayer OnCompletionListener
  3. Codeforces 167B Wizards and Huge Prize(概率dp)
  4. JavaScript 中的内存泄露模式
  5. VTK:可视化算法之ColoredAnnotatedCube
  6. 命令行下操作MySQL数据库,各种命令的使用入门示例。(附图)
  7. Hadoop集群规划
  8. 15.4.3 用于Generator的泛型方法
  9. Microsoft Edge Chrome 下载
  10. 〖经典〗网页特效汇总实例
  11. ip跳转跟踪命令_在跟踪命令(-T272)的帮助下学习避免身份跳转问题(IDENTITY_CACHE)
  12. vue的main.js讲解一
  13. Oracle如何建立多库,基于Oracle多库查询方法(分享)
  14. 微博api unexpected response status: 403_抖音直播监控Api:开播查询
  15. 线性代数第3章思维导图
  16. 最新MT6763参考设计芯片资料
  17. 把对方微信拉黑了怎么恢复
  18. light动名词_英语里有些动词有名词形式,那还用不用它的动名词?怎么区分?...
  19. [机器学习] 实验笔记 - 表情识别(emotion recognition)
  20. river歌曲表达的意思_Lost Rivers这首歌到底想表达什么?

热门文章

  1. python画曲线图-利用python绘制数据曲线图的实现
  2. 零基础学python好学吗-想要0基础学python要怎么做?python好学吗?
  3. python能做什么工作-学Python能找到什么工作?这4种工作最热门!
  4. 科大讯飞独家Founding赞助国际语音顶会,14篇论文被收录
  5. 家电智能化转型之下 长虹在挖什么“坑”?
  6. php response.write,ASP_RESPONSE.WRITE和lt;%=%的区别,RESPONSE.WRITE与%=%都是ASP程 - phpStudy...
  7. Error: Cannot find module ‘webpack-cli/bin/config-yargs‘ 解决办法
  8. 【王道操作系统笔记】操作系统的概念,功能和目标
  9. python怎么隔一个读取一个_Python实现中一次读取多个值的方法
  10. 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理