Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <vector>
- // Include GLEW
- #include <GL/glew.h>
- // Include GLFW
- #include <glfw3.h>
- GLFWwindow* window;
- // Include GLM
- #include <glm/glm.hpp>
- #include <glm/gtc/matrix_transform.hpp>
- using namespace glm;
- int main()
- {
- glewExperimental = true; // Needed for core profile
- if (!glfwInit())
- {
- if (!glfwInit())
- {
- fprintf(stderr, "Failed to initialize GLFW\n");
- getchar();
- return -1;
- }
- glfwWindowHint(GLFW_SAMPLES, 4);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
- // Open a window and create its OpenGL context
- window = glfwCreateWindow(1024, 768, "Tutorial 07 - Model Loading", NULL, NULL);
- if (window == NULL) {
- fprintf(stderr, "Failed to open GLFW window.\n");
- getchar();
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window);
- // Initialize GLEW
- if (glewInit() != GLEW_OK) {
- fprintf(stderr, "Failed to initialize GLEW\n");
- getchar();
- glfwTerminate();
- return -1;
- }
- // Ensure we can capture the escape key being pressed below
- glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
- // Hide the mouse and enable unlimited mouvement
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
- // Set the mouse at the center of the screen
- glfwPollEvents();
- glfwSetCursorPos(window, 1024 / 2, 768 / 2);
- // Dark blue background
- glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
- // Enable depth test
- glEnable(GL_DEPTH_TEST);
- // Accept fragment if it closer to the camera than the former one
- glDepthFunc(GL_LESS);
- // Cull triangles which normal is not towards the camera
- glEnable(GL_CULL_FACE);
- // Create and compile our GLSL program from the shaders
- GLuint programID = LoadShaders("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader");
- // Get a handle for our "MVP" uniform
- GLuint MatrixID = glGetUniformLocation(programID, "MVP");
- // Get a handle for our buffers
- GLuint vertexPosition_modelspaceID = glGetAttribLocation(programID, "vertexPosition_modelspace");
- GLuint vertexUVID = glGetAttribLocation(programID, "vertexUV");
- // Load the texture
- GLuint Texture = loadDDS("uvmap.DDS");
- // Get a handle for our "myTextureSampler" uniform
- GLuint TextureID = glGetUniformLocation(programID, "myTextureSampler");
- // Read our .obj file
- std::vector<glm::vec3> vertices;
- std::vector<glm::vec2> uvs;
- std::vector<glm::vec3> normals; // Won't be used at the moment.
- bool res = loadOBJ("cube.obj", vertices, uvs, normals);
- // Load it into a VBO
- GLuint vertexbuffer;
- glGenBuffers(1, &vertexbuffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
- glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
- GLuint uvbuffer;
- glGenBuffers(1, &uvbuffer);
- glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
- glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
- do {
- // Clear the screen
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Use our shader
- glUseProgram(programID);
- // Compute the MVP matrix from keyboard and mouse input
- computeMatricesFromInputs();
- glm::mat4 ProjectionMatrix = getProjectionMatrix();
- glm::mat4 ViewMatrix = getViewMatrix();
- glm::mat4 ModelMatrix = glm::mat4(1.0);
- glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;
- // Send our transformation to the currently bound shader,
- // in the "MVP" uniform
- glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
- // Bind our texture in Texture Unit 0
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, Texture);
- // Set our "myTextureSampler" sampler to user Texture Unit 0
- glUniform1i(TextureID, 0);
- // 1rst attribute buffer : vertices
- glEnableVertexAttribArray(vertexPosition_modelspaceID);
- glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
- glVertexAttribPointer(
- vertexPosition_modelspaceID, // The attribute we want to configure
- 3, // size
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- // 2nd attribute buffer : UVs
- glEnableVertexAttribArray(vertexUVID);
- glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
- glVertexAttribPointer(
- vertexUVID, // The attribute we want to configure
- 2, // size : U+V => 2
- GL_FLOAT, // type
- GL_FALSE, // normalized?
- 0, // stride
- (void*)0 // array buffer offset
- );
- // Draw the triangles !
- glDrawArrays(GL_TRIANGLES, 0, vertices.size());
- glDisableVertexAttribArray(vertexPosition_modelspaceID);
- glDisableVertexAttribArray(vertexUVID);
- // Swap buffers
- glfwSwapBuffers(window);
- glfwPollEvents();
- } // Check if the ESC key was pressed or the window was closed
- while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
- glfwWindowShouldClose(window) == 0);
- // Cleanup VBO and shader
- glDeleteBuffers(1, &vertexbuffer);
- glDeleteBuffers(1, &uvbuffer);
- glDeleteProgram(programID);
- glDeleteTextures(1, &TextureID);
- // Close OpenGL window and terminate GLFW
- glfwTerminate();
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement