第一个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.01fusing 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.5f, 0.5f, 0.5f, 1.0f };		//全局环境光
glm::vec4 DirLightAmbient = { 0.2f, 0.2f, 0.2f, 1.0f };		//定向光:环境特征
glm::vec4 DirLightDiffuse = { 0.35f, 0.35f, 0.35f, 1.0f };	//定向光:漫反射
glm::vec3 DirLightDirection = { -0.5f, -0.866f, 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矩阵的逆
glm::vec4 texture_color;struct Camera {float x, y, z;float theta, fine;
}camera;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);}void draw() {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);}
}plane;
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);}void draw() {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);}
}tetrahedron;
struct Icosahedron {GLuint vbo_index[2] = { 0 };glm::vec3 position = { 0.0f, 0.0f, 0.0f };float vertex_positions[180] = {-0.618f, 1.0f, 0.0f, 0.618f, 1.0f, 0.0f, 0.0f, 0.618f, -1.0f,0.618f, -1.0f, 0.0f, -0.618f, -1.0f, 0.0f, 0.0f, -0.618f, -1.0f,0.0f, 0.618f, -1.0f, -1.0f, 0.0f, -0.618f, -0.618f, 1.0f, 0.0f,-1.0f, 0.0f, -0.618f, 0.0f, -0.618f, -1.0f, -0.618f, -1.0f, 0.0f,0.618f, 1.0f, 0.0f, 1.0f, 0.0f, -0.618f, 0.0f, 0.618f, -1.0f,1.0f, 0.0f, -0.618f, 0.618f, -1.0f, 0.0f, 0.0f, -0.618f, -1.0f,-1.0f, 0.0f, -0.618f, 0.0f, 0.618f, -1.0f, 0.0f, -0.618f, -1.0f,0.0f, -0.618f, -1.0f, 0.0f, 0.618f, -1.0f, 1.0f, 0.0f, -0.618f,0.618f, 1.0f, 0.0f, -0.618f, 1.0f, 0.0f, 0.0f, 0.618f, 1.0f,-0.618f, -1.0f, 0.0f, 0.618f, -1.0f, 0.0f, 0.0f, -0.618f, 1.0f,-1.0f, 0.0f, 0.618f, 0.0f, 0.618f, 1.0f, -0.618f, 1.0f, 0.0f,-1.0f, 0.0f, 0.618f, -0.618f, -1.0f, 0.0f, 0.0f, -0.618f, 1.0f,0.618f, 1.0f, 0.0f, 0.0f, 0.618f, 1.0f, 1.0f, 0.0f, 0.618f,0.0f, -0.618f, 1.0f, 0.618f, -1.0f, 0.0f, 1.0f, 0.0f, 0.618f,0.0f, -0.618f, 1.0f, 0.0f, 0.618f, 1.0f, -1.0f, 0.0f, 0.618f,0.0f, 0.618f, 1.0f, 0.0f, -0.618f, 1.0f, 1.0f, 0.0f, 0.618f,-1.0f, 0.0f, 0.618f, -0.618f, 1.0f, 0.0f, -1.0f, 0.0f, -0.618f,-1.0f, 0.0f, 0.618f, -1.0f, 0.0f, -0.618f, -0.618f, -1.0f, 0.0f,1.0f, 0.0f, 0.618f, 1.0f, 0.0f, -0.618f, 0.618f, 1.0f, 0.0f,1.0f, 0.0f, -0.618f, 1.0f, 0.0f, 0.618f, 0.618f, -1.0f, 0.0f};float vertex_normal[180] = {0.0f, 2.618f, -1.0f, 0.0f, 2.618f, -1.0f, 0.0f, 2.618f, -1.0f,0.0f, -2.618f, -1.0f, 0.0f, -2.618f, -1.0f, 0.0f, -2.618f, -1.0f,-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,-1.0f, 0.0f, -2.618f, -1.0f, 0.0f, -2.618f, -1.0f, 0.0f, -2.618f,1.0f, 0.0f, -2.618f, 1.0f, 0.0f, -2.618f, 1.0f, 0.0f, -2.618f,0.0f, 2.618f, 1.0f, 0.0f, 2.618f, 1.0f, 0.0f, 2.618f, 1.0f,0.0f, -2.618f, 1.0f, 0.0f, -2.618f, 1.0f, 0.0f, -2.618f, 1.0f,-1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f,-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f,1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,-1.0f, 0.0f, 2.618f, -1.0f, 0.0f, 2.618f, -1.0f, 0.0f, 2.618f,1.0f, 0.0f, 2.618f, 1.0f, 0.0f, 2.618f, 1.0f, 0.0f, 2.618f,-2.618f, 1.0f, 0.0f, -2.618f, 1.0f, 0.0f, -2.618f, 1.0f, 0.0f,-2.618f, -1.0f, 0.0f, -2.618f, -1.0f, 0.0f, -2.618f, -1.0f, 0.0f,2.618f, 1.0f, 0.0f, 2.618f, 1.0f, 0.0f, 2.618f, 1.0f, 0.0f,2.618f, -1.0f, 0.0f, 2.618f, -1.0f, 0.0f, 2.618f, -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);}void draw() {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[icosahedron.vbo_index[0]]);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, vbo[icosahedron.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, 60);}
}icosahedron;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, 0.0f);icosahedron.init(0.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::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 };elsetexture_color = { 0.0f, 0.0f, 1.0f, 1.0f };mvmat = vmat * mmat_p;invmat = glm::transpose(glm::inverse(mvmat));plane.draw();}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));texture_color = { 1.0f, 0.0f, 0.0f, 1.0f };tetrahedron.draw();glm::mat4 mmat_i = glm::translate(glm::mat4(1.0f), icosahedron.position);mvmat = vmat * mmat_i;invmat = glm::transpose(glm::inverse(mvmat));texture_color = { 1.0f, 0.0f, 0.0f, 1.0f };icosahedron.draw();
}
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 430layout (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 430in 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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…

简要介绍C++中的 max 和 min 函数以及返回值

简要介绍C中的 max 和 min 函数 在C中&#xff0c;std::max 和 std::min 是标准库 <algorithm> 中提供的函数&#xff0c;用于比较两个或多个值并返回最大值或最小值。这些函数非常强大且灵活&#xff0c;支持多种数据类型&#xff08;如整数、浮点数、字符串等&#xff…

【MyDB】4-VersionManager 之 3-死锁及超时检测

【MyDB】4-VersionManager 之 3-死锁及超时检测 死锁及超时检测案例背景LockTable锁请求与等待管理 addvm调用addputIntoList&#xff0c;isInList&#xff0c;removeFromList 死锁检测 hasDeadLock方法资源释放与重分配 参考资料 死锁及超时检测 本章涉及代码&#xff1a;top/…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

服务器虚拟化实战:架构、技术与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分&#xff0c;通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…

【LLM】Ollama框架入门指北

note Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama提供了对模型量化的支…

Linux系统:Ubuntu替换镜像源具体方法;

在Linux系统更新下载软件时&#xff0c;如遇因镜像源问题下载失败时&#xff0c;我们就需要替换系统原有镜像源&#xff0c;那么&#xff0c;此时&#xff0c;你是否还在百度四处搜索可以用的镜像源地址&#xff0c;然后反复去测试源地址的正确性呢&#xff0c;下面介绍一个亲测…

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置&#xff0c;输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字&#xff0c;用于区分8.打开…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

d3.js: Relation Graph

d3.js Tags d3/d3 GitHub D3 by Observable | The JavaScript library for bespoke data visualization 下载或 <!-- 引入 D3.js 库 --> <script src"https://d3js.org/d3.v7.min.js"></script> <!-- 引入 D3.js 库 --> <…

Oracle Primavera P6自动进行进度计算

前言 在P6 Professional 有一个自动计划计算的选项&#xff0c;很多人不了解该设置如何使用&#xff0c;以及什么时候该启动这项配置。 详情 P6 Professional 默认为非自动进度计算。启用自动选项后&#xff0c;可以快速查看调度更改的效果。 ​ ​ 如图所示&#xff0c;当你…

反射、枚举以及lambda表达式

一.反射 1.概念&#xff1a;Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&am…

【Proteus仿真】【51单片机】简易计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后&#xff0c;LCD1602显示数据&#xff0c;通过矩阵按键…

HarmonyOS简介:HarmonyOS核心技术理念

核心理念 一次开发、多端部署可分可合、自由流转统一生态、原生智能 一次开发、多端部署 可分可合 自由流转 自由流转可分为跨端迁移和多端协同两种情况 统一生态 支持业界主流跨平台开发框架&#xff0c;通过多层次的开放能力提供统一接入标准&#xff0c;实现三方框架快速…

(即插即用模块-特征处理部分) 十九、(NeurIPS 2023) Prompt Block 提示生成 / 交互模块

文章目录 1、Prompt Block2、代码实现 paper&#xff1a;PromptIR: Prompting for All-in-One Blind Image Restoration Code&#xff1a;https://github.com/va1shn9v/PromptIR 1、Prompt Block 在解决现有图像恢复模型时&#xff0c;现有研究存在一些局限性&#xff1a; 现有…

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?

文章目录 13003数据结构与算法全书框架考试题型的分值分布如何&#xff1f; 本次内容概述绪论第一节概览什么是数据、数据元素&#xff0c;数据项&#xff0c;数据项的值&#xff1f;什么是数据结构&#xff1f;分哪两种集合形式&#xff08;逻辑和存储&#xff09;&#xff1f…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

unity学习21:Application类与文件存储的位置

目录 1 unity是一个跨平台的引擎 1.1 使用 Application类&#xff0c;去读写文件 1.2 路径特点 1.2.1 相对位置/相对路径&#xff1a; 1.2.2 固定位置/绝对路径&#xff1a; 1.3 测试方法&#xff0c;仍然挂一个C#脚本在gb上 2 游戏数据文件夹路径&#xff08;只读&…

【Redis】hash 类型的介绍和常用命令

1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构&#xff0c;存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…

基于51单片机和WS2812B彩色灯带的流水灯

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码四、主函数总结 系列文章目录 前言 用彩色灯带按自己想法DIY一条流水灯&#xff0c;谁不喜欢呢&#xff1f; 所用单片机&#xff1a;STC15W204S &#xff08;也可以用其他1T单片机&#xff0c;例如&#xff0c;S…