一些3D小场景
来源:互联网 发布:世界编程大赛第一名 编辑:程序博客网 时间:2024/06/04 19:46
一、立方体贴图以及模型加载
#include<string>#include<algorithm>using namespace std;#define GLEW_STATIC#include<GL\glew.h>#include<GLFW\glfw3.h>#include<GL\Shader.h>#include<GL\Camera.h>#include<GL\Model.h>#include<glm\glm.hpp>#include<glm\gtc\matrix_transform.hpp>#include<glm\gtc\type_ptr.hpp>#include<GL\SOIL.h>using namespace glm;GLuint screenWidth = 800, screenHeight = 600;Camera camera(vec3(0.0f, 0.0f, 3.0f));bool keys[1024];GLfloat lastX = screenWidth / 2, lastY = screenHeight / 2;bool firstMouse = true;GLfloat deltaTime = 0.0f;GLfloat lastFrame = 0.0f;#pragma region "read picture"GLuint loadCubemap(vector<const GLchar*>faces){ GLuint textureID; glGenTextures(1, &textureID); int width, height; unsigned char* image; glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); for (GLuint i = 0; i < faces.size(); i++) { image = SOIL_load_image(faces[i], &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); } glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); return textureID;}GLuint loadTexture(GLchar* path){ GLuint textureID; glGenTextures(1, &textureID); int width, height; unsigned char* image = SOIL_load_image(path, &width, &height, 0, SOIL_LOAD_RGB); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); 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_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); SOIL_free_image_data(image); return textureID;}#pragma endregion#pragma region "User input"void Do_Movement(){ if (keys[GLFW_KEY_W]) camera.ProcessKeyboard(FORWARD, deltaTime); if (keys[GLFW_KEY_S]) camera.ProcessKeyboard(BACKWARD, deltaTime); if (keys[GLFW_KEY_A]) camera.ProcessKeyboard(LEFT, deltaTime); if (keys[GLFW_KEY_D]) camera.ProcessKeyboard(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 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; camera.ProcessMouseMovement(xoffset, yoffset);}void scroll_callback(GLFWwindow* window, double xoffset, double yoffset){ camera.ProcessMouseScroll(yoffset);}#pragma endregionint 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(screenWidth, screenHeight, "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(); glGetError(); glViewport(0, 0, screenWidth, screenHeight); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); Shader shader("vertexadvanced.txt", "fragmentadvanced.txt"); Shader skyboxshader("vertexskybox.txt", "fragmentskybox.txt"); GLfloat skyboxVertices[] = { // Positions -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, -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, 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 }; GLuint skyboxVAO, skyboxVBO; glGenVertexArrays(1, &skyboxVAO); glGenBuffers(1, &skyboxVBO); glBindVertexArray(skyboxVAO); glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glBindVertexArray(0); vector<const GLchar*>faces; faces.push_back("skybox/right.jpg"); faces.push_back("skybox/left.jpg"); faces.push_back("skybox/top.jpg"); faces.push_back("skybox/bottom.jpg"); faces.push_back("skybox/back.jpg"); faces.push_back("skybox/front.jpg"); GLuint skyboxTexture = loadCubemap(faces); Model nanosuit("nanosuit/nanosuit.obj"); while (!glfwWindowShouldClose(window)) { GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; glfwPollEvents(); Do_Movement(); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader.Use(); mat4 model; mat4 view = camera.GetViewMatrix(); mat4 projection = perspective(camera.Zoom, (float)screenWidth / (float)screenHeight, 0.1f, 100.0f); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model)); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glUniform3f(glGetUniformLocation(shader.Program, "cameraPos"), camera.Position.x, camera.Position.y, camera.Position.z); glActiveTexture(GL_TEXTURE3); glUniform1i(glGetUniformLocation(shader.Program, "skybox"), 3); glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); nanosuit.Draw(shader); glDepthFunc(GL_LEQUAL); skyboxshader.Use(); view = glm::mat4(glm::mat3(camera.GetViewMatrix())); glUniformMatrix4fv(glGetUniformLocation(skyboxshader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(glGetUniformLocation(skyboxshader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); // skybox cube glBindVertexArray(skyboxVAO); glActiveTexture(GL_TEXTURE0); glUniform1i(glGetUniformLocation(shader.Program, "skybox"), 0); glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); glDepthFunc(GL_LESS); glfwSwapBuffers(window); } glfwTerminate(); return 0;}
vertexshader:
#version 330 corelayout (location = 0) in vec3 position;layout (location = 1) in vec3 normal;layout (location = 2) in vec2 texCoords;out vec3 Normal;out vec3 Position;out vec2 TexCoords;uniform mat4 model;uniform mat4 view;uniform mat4 projection;void main(){ gl_Position = projection * view * model * vec4(position, 1.0f); Normal = mat3(transpose(inverse(model))) * normal; Position = vec3(model * vec4(position, 1.0f)); TexCoords = texCoords;}
fragmentshader:
#version 330 corein vec3 Normal;in vec3 Position;in vec2 TexCoords;uniform vec3 cameraPos;uniform sampler2D texture_diffuse1;uniform sampler2D texture_reflection1;uniform samplerCube skybox;out vec4 color;void main(){ vec4 diffuse_color = texture(texture_diffuse1, TexCoords); vec3 I = normalize(Position - cameraPos); vec3 R = reflect(I, normalize(Normal)); float reflect_intensity = texture(texture_reflection1, TexCoords).r; vec4 reflect_color; if(reflect_intensity > 0.1) // Only sample reflections when above a certain treshold reflect_color = texture(skybox, R) * reflect_intensity; color = diffuse_color + reflect_color;}
二、实例化之小行星
#define GLEW_STATIC#include<GL\glew.h>#include<GLFW\glfw3.h>#include<GL\Shader.h>#include<GL\Camera.h>#include<GL\Model.h>#include<glm\glm.hpp>#include<glm\gtc\matrix_transform.hpp>#include<glm\gtc\type_ptr.hpp>using namespace std;using namespace glm;GLuint screenWidth = 800, screenHeight = 600;Camera camera(vec3(0.0f, 0.0f, 55.0f));bool keys[1024];GLfloat lastX = screenWidth / 2, lastY = screenHeight / 2;bool firstMouse = true;GLfloat deltaTime = 0.0f;GLfloat lastFrame = 0.0f;void Do_Movement(){ if (keys[GLFW_KEY_W]) { camera.ProcessKeyboard(FORWARD, deltaTime); } if (keys[GLFW_KEY_S]) { camera.ProcessKeyboard(BACKWARD, deltaTime); } if (keys[GLFW_KEY_A]) { camera.ProcessKeyboard(LEFT, deltaTime); } if (keys[GLFW_KEY_D]) { camera.ProcessKeyboard(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 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; camera.ProcessMouseMovement(xoffset, yoffset);}GLuint loadCubemap(vector<const GLchar*> faces){ GLuint textureID; glGenTextures(1, &textureID); int width, height; unsigned char* image; glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); for (GLuint i = 0; i < faces.size(); i++) { image = SOIL_load_image(faces[i], &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); } glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); return textureID;}GLuint loadTexture(GLchar* path){ GLuint textureID; glGenTextures(1, &textureID); int width, height; unsigned char* image = SOIL_load_image(path, &width, &height, 0, SOIL_LOAD_RGB); glBindTexture(GL_TEXTURE_2D, textureID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); 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_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); SOIL_free_image_data(image); return textureID;}int main(){ GLfloat skyboxVertices[] = { // Positions -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, -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, 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 }; 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(screenWidth, screenHeight, "learnopengl", nullptr, nullptr); glfwMakeContextCurrent(window); glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glewExperimental = GL_TRUE; glewInit(); glViewport(0, 0, screenWidth, screenHeight); glEnable(GL_DEPTH_TEST); Shader planetShader("vertex.txt", "fragment.txt"); Shader instanceShader("vertex2.txt", "fragment2.txt"); Shader skyboxshader("vertexskybox.txt", "fragmentskybox.txt"); Model rock("rock/rock.obj"); Model planet("planet/planet.obj"); GLuint skyboxVAO, skyboxVBO; glGenVertexArrays(1, &skyboxVAO); glGenBuffers(1, &skyboxVBO); glBindVertexArray(skyboxVAO); glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glBindVertexArray(0); vector<const GLchar*>faces; faces.push_back("ame_nebula/right.jpg"); faces.push_back("ame_nebula/left.jpg"); faces.push_back("ame_nebula/up.jpg"); faces.push_back("ame_nebula/down.jpg"); faces.push_back("ame_nebula/back.jpg"); faces.push_back("ame_nebula/front.jpg"); GLuint cubemapTexture = loadCubemap(faces); mat4 projection = perspective(45.0f, (GLfloat)screenWidth / (GLfloat)screenHeight, 0.1f, 1000.0f); planetShader.Use(); glUniformMatrix4fv(glGetUniformLocation(planetShader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); instanceShader.Use(); glUniformMatrix4fv(glGetUniformLocation(instanceShader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); GLuint amount = 10000; mat4* modelMatrices; modelMatrices = new mat4[amount]; srand(glfwGetTime()); //srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子, //rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。 GLfloat radius = 150.0f; GLfloat offset = 50.0f; for (GLuint i = 0; i < amount; i++) { mat4 model; GLfloat angle = (GLfloat)i / (GLfloat)amount*360.0f; GLfloat displacement = (rand() % (GLint)(2 * offset * 100)) / 100.0f - offset; GLfloat x = sin(angle)*radius + displacement; displacement = (rand() % (GLint)(2 * offset * 100)) / 100.0f - offset; GLfloat y = displacement*0.4f; displacement = (rand() % (GLint)(2 * offset * 100)) / 100.0f - offset; GLfloat z = cos(angle)*radius + displacement; model = translate(model, vec3(x, y, z)); GLfloat scale = (rand() % 20) / 100.0f + 0.05; model = glm::scale(model, vec3(scale)); GLfloat rotAngle = (rand() % 360); model = rotate(model, rotAngle, vec3(0.4f, 0.6f, 0.8f)); modelMatrices[i] = model; } GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW); vector<Mesh> meshes=rock.getmeshes(); for (GLuint i = 0; i < meshes.size(); i++) { GLuint VAO = meshes[i].getVAO(); glBindVertexArray(VAO); glEnableVertexAttribArray(3); glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)0); glEnableVertexAttribArray(4); glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(sizeof(glm::vec4))); glEnableVertexAttribArray(5); glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(2 * sizeof(glm::vec4))); glEnableVertexAttribArray(6); glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (GLvoid*)(3 * sizeof(glm::vec4))); glVertexAttribDivisor(3, 1); glVertexAttribDivisor(4, 1); glVertexAttribDivisor(5, 1); glVertexAttribDivisor(6, 1); glBindVertexArray(0); } while (!glfwWindowShouldClose(window)) { GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; glfwPollEvents(); Do_Movement(); glClearColor(0.3f, 0.6f, 0.9f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); planetShader.Use(); glUniformMatrix4fv(glGetUniformLocation(planetShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(camera.GetViewMatrix())); instanceShader.Use(); glUniformMatrix4fv(glGetUniformLocation(instanceShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(camera.GetViewMatrix())); planetShader.Use(); mat4 model; model = translate(model, vec3(0.0f, -3.0f, 0.0f)); model = scale(model, vec3(4.0f, 4.0f, 4.0f)); GLfloat time = glfwGetTime()*0.1; model = rotate(model, time,vec3(0.0f, 1.0f, 0.0f)); glUniformMatrix4fv(glGetUniformLocation(planetShader.Program, "model"), 1, GL_FALSE, value_ptr(model)); planet.Draw(planetShader); instanceShader.Use(); vector<Texture> textures = rock.getmtexture(); glBindTexture(GL_TEXTURE_2D, textures[0].id); for (GLuint i = 0; i < meshes.size(); i++) { glBindVertexArray(meshes[i].getVAO()); glDrawElementsInstanced(GL_TRIANGLES, meshes[i].indices.size(), GL_UNSIGNED_INT, 0, amount); glBindVertexArray(0); } glDepthFunc(GL_LEQUAL); skyboxshader.Use(); mat4 view = mat4(mat3(camera.GetViewMatrix())); glUniformMatrix4fv(glGetUniformLocation(skyboxshader.Program, "view"), 1, GL_FALSE, value_ptr(view)); glUniformMatrix4fv(glGetUniformLocation(skyboxshader.Program, "projection"), 1, GL_FALSE, value_ptr(projection)); glBindVertexArray(skyboxVAO); glActiveTexture(GL_TEXTURE0); glUniform1i(glGetUniformLocation(skyboxshader.Program, "skybox"), 0); glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); glDepthFunc(GL_LESS); glfwSwapBuffers(window); } delete[] modelMatrices; glfwTerminate(); return 0;}
vertexshader1:
#version 330 corelayout (location = 0) in vec3 position;layout (location = 2) in vec2 texCoords;out vec2 TexCoords;uniform mat4 projection;uniform mat4 view;uniform mat4 model;void main(){ gl_Position = projection * view * model * vec4(position, 1.0f); TexCoords = texCoords;}
vertexshader2:
#version 330 corelayout (location = 0) in vec3 position;layout (location = 2) in vec2 texCoords;layout (location = 3) in mat4 instanceMatrix;out vec2 TexCoords;uniform mat4 projection;uniform mat4 view;void main(){ gl_Position = projection * view * instanceMatrix * vec4(position, 1.0f); TexCoords = texCoords;}
fragmentshader1:
#version 330 corein vec2 TexCoords;out vec4 color;uniform sampler2D texture_diffuse1;void main(){ color = texture(texture_diffuse1, TexCoords);}
fragmentshader2:
#version 330 corein vec2 TexCoords;out vec4 color;uniform sampler2D texture_diffuse1;void main(){ color = texture(texture_diffuse1, TexCoords);}
0 0
- 一些3D小场景
- Android 3D jpct-ae 一个场景小例子
- 【OpenCV】3D场景定位的一些资源
- unity 3D学习日记:创建一个小场景并编写简单C#移动脚本
- Unity 3D BehaviorDesigner初用 一些小坑
- 3D引擎场景管理
- css3-3d场景创建
- 3D场景中选取场景中的物体。
- React-Native生命周期的触发场景和一些小建议
- 使用WPF实现3D场景[一]
- 使用WPF实现3D场景[二]
- Medusa 3D 我的场景编辑器
- 开发一款3D场景编辑器
- Ycnd 3D 场景文件转换器
- 3D游戏场景数据的组织
- 3D场景的制作步骤
- flash11的3d场景编辑器
- 3D场景中的圆形天空顶
- c++容器queue的用法整理
- STL之Set:Set的基本用法
- 挖坑 代填
- 父母恩情
- java中的多态-父类引用指向子类对象
- 一些3D小场景
- 分治求逆序对算法
- 在Fedora 25中修改GRUB 2默认启动项手记
- 畅通工程再续
- Cousera-stanford-机器学习练习-第二周-Linear Regression with Multiple Variables
- RStudio快捷键总结
- Java SE 基础:反射
- 51nod 1020 逆序排列
- 网易MySQL数据库工程师微专业学习笔记(六)