static inline jlong wrapped_Java_com_badlogic_jglfw_Glfw_glfwCreateWindowJni (JNIEnv* env, jclass clazz, jint width, jint height, jstring obj_title, jlong monitor, jlong share, char* title) { //@line:704 GLFWwindow* window = glfwCreateWindow(width, height, title, (GLFWmonitor*)monitor, (GLFWwindow*)share); if (window) { glfwSetWindowPosCallback(window, windowPos); glfwSetWindowSizeCallback(window, windowSize); glfwSetWindowCloseCallback(window, windowClose); glfwSetWindowRefreshCallback(window, windowRefresh); glfwSetWindowFocusCallback(window, windowFocus); glfwSetWindowIconifyCallback(window, windowIconify); glfwSetKeyCallback(window, key); glfwSetCharCallback(window, character); glfwSetMouseButtonCallback(window, mouseButton); glfwSetCursorPosCallback(window, cursorPos); glfwSetCursorEnterCallback(window, cursorEnter); glfwSetScrollCallback(window, scroll); glfwSetDropCallback(window, drop); } return (jlong)window; }
bool GLView::createWindow(std::string windowname) { if (!glfwInit()) { return false; } _glContextAttrs = { 8, 8, 8, 8, 24,8 }; glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); glfwWindowHint(GLFW_RED_BITS, _glContextAttrs.redBits); glfwWindowHint(GLFW_GREEN_BITS, _glContextAttrs.greenBits); glfwWindowHint(GLFW_BLUE_BITS, _glContextAttrs.blueBits); glfwWindowHint(GLFW_ALPHA_BITS, _glContextAttrs.alphaBits); glfwWindowHint(GLFW_DEPTH_BITS, _glContextAttrs.depthBits); glfwWindowHint(GLFW_STENCIL_BITS, _glContextAttrs.stencilBits); Size winSize = Director::getInstance()->getWinSize(); _mainWindow = glfwCreateWindow(winSize.width, winSize.height, windowname.c_str(), nullptr, nullptr); glfwMakeContextCurrent(_mainWindow); //在我们使用 GL 命令之前我们需要将创建的窗口设置为当前窗口 //glViewport(0, 0, 480, 320); glfwSetMouseButtonCallback(_mainWindow, GLFWEventHandler::onGLFWMouseCallBack); glfwSetCursorPosCallback(_mainWindow, GLFWEventHandler::onGLFWMouseMoveCallBack); glfwSetScrollCallback(_mainWindow, GLFWEventHandler::onGLFWMouseScrollCallback); glfwSetCharCallback(_mainWindow, GLFWEventHandler::onGLFWCharCallback); glfwSetKeyCallback(_mainWindow, GLFWEventHandler::onGLFWKeyCallback); glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback); glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize); glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback); glfwSetWindowIconifyCallback(_mainWindow, GLFWEventHandler::onGLFWWindowIconifyCallback); initGlew(); return true; }
// The MAIN function, from here we start our application and run our Game loop int main() { // Init GLFW 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(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr); // Windowed glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetScrollCallback(window, scroll_callback); // Options glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // Initialize GLEW to setup the OpenGL Function pointers glewExperimental = GL_TRUE; glewInit(); // Define the viewport dimensions glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT); // Setup some OpenGL options glEnable(GL_DEPTH_TEST); // Setup and compile our shaders ////Shader shader("shadow_mapping.vs", "shadow_mapping.frag"); Shader simpleDepthShader("shadow_mapping_depth.vs", "shadow_mapping_depth.frag"); Shader shaderGeometryPass("g_buffer.vs", "g_buffer.frag"); Shader shaderLightingPass("deferred_shading.vs", "deferred_shading.frag"); // Set texture samples ////shader.Use(); ////glUniform1i(glGetUniformLocation(shader.Program, "diffuseTexture"), 0); ////glUniform1i(glGetUniformLocation(shader.Program, "shadowMap"), 1); // Set samplers shaderLightingPass.Use(); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "gPosition"), 0); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "gNormal"), 1); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "gAlbedoSpec"), 2); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "gDepthViewer"), 3); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "gShadowMap"), 4); shaderGeometryPass.Use(); glUniform1i(glGetUniformLocation(shaderGeometryPass.Program, "texture_diffuse1"), 0); glUniform1i(glGetUniformLocation(shaderGeometryPass.Program, "texture_specular1"), 1); GLfloat planeVertices[] = { // Positions // Normals // Texture Coords 25.0f, -0.5f, 25.0f, 0.0f, 1.0f, 0.0f, 25.0f, 0.0f, -25.0f, -0.5f, -25.0f, 0.0f, 1.0f, 0.0f, 0.0f, 25.0f, -25.0f, -0.5f, 25.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 25.0f, -0.5f, 25.0f, 0.0f, 1.0f, 0.0f, 25.0f, 0.0f, 25.0f, -0.5f, -25.0f, 0.0f, 1.0f, 0.0f, 25.0f, 25.0f, -25.0f, -0.5f, -25.0f, 0.0f, 1.0f, 0.0f, 0.0f, 25.0f }; // Setup plane VAO GLuint planeVBO; glGenVertexArrays(1, &planeVAO); glGenBuffers(1, &planeVBO); glBindVertexArray(planeVAO); glBindBuffer(GL_ARRAY_BUFFER, planeVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(planeVertices), &planeVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); glBindVertexArray(0); // Light source glm::vec3 lightPos(-2.0f, 4.0f, -1.0f); // Load textures woodTexture = loadTexture(FileSystem::getPath("resources/textures/wood.png").c_str()); // Configure depth map FBO const GLuint SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; GLuint depthMapFBO; glGenFramebuffers(1, &depthMapFBO); // - Create depth texture GLuint gShadowMap; glGenTextures(1, &gShadowMap); glBindTexture(GL_TEXTURE_2D, gShadowMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gShadowMap, 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0); // Set up G-Buffer // 3 textures: // 1. Positions (RGB) // 2. Color (RGB) + Specular (A) // 3. Normals (RGB) //// 4. gDepthViewer (DEPTH) GLuint gBuffer; glGenFramebuffers(1, &gBuffer); glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); GLuint gPosition, gNormal, gAlbedoSpec, gDepthViewer; // - Position color buffer glGenTextures(1, &gPosition); glBindTexture(GL_TEXTURE_2D, gPosition); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0); // - Normal color buffer glGenTextures(1, &gNormal); glBindTexture(GL_TEXTURE_2D, gNormal); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gNormal, 0); // - Color + Specular color buffer glGenTextures(1, &gAlbedoSpec); glBindTexture(GL_TEXTURE_2D, gAlbedoSpec); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gAlbedoSpec, 0); // - Depth Map from viewer buffer glGenTextures(1, &gDepthViewer); glBindTexture(GL_TEXTURE_2D, gDepthViewer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, gDepthViewer, 0); // - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; //////check! glDrawBuffers(4, attachments); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); // Game loop while (!glfwWindowShouldClose(window)) { // Set frame time GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; // Check and call events glfwPollEvents(); Do_Movement(); // Change light position over time lightPos.z = cos(glfwGetTime()) * 2.0f; // 1. Render depth of scene to texture (from light's perspective) // - Get light projection/view matrix. glm::mat4 lightProjection, lightView; glm::mat4 lightSpaceMatrix; GLfloat near_plane = 1.0f, far_plane = 9.5f; //lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane); lightProjection = glm::perspective(65.0f, (GLfloat)SHADOW_WIDTH / (GLfloat)SHADOW_HEIGHT, near_plane, far_plane); // Note that if you use a perspective projection matrix you'll have to change the light position as the current light position isn't enough to reflect the whole scene. lightView = glm::lookAt(lightPos, glm::vec3(0.0f), glm::vec3(1.0)); lightSpaceMatrix = lightProjection * lightView; // - now render scene from light's point of view simpleDepthShader.Use(); glUniformMatrix4fv(glGetUniformLocation(simpleDepthShader.Program, "lightSpaceMatrix"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glClear(GL_DEPTH_BUFFER_BIT); RenderScene(simpleDepthShader); glBindFramebuffer(GL_FRAMEBUFFER, 0); /* // 2. Render scene as normal glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader.Use(); glm::mat4 projection = glm::perspective(camera.Zoom, (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); glm::mat4 view = camera.GetViewMatrix(); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); // Set light uniforms glUniform3fv(glGetUniformLocation(shader.Program, "lightPos"), 1, &lightPos[0]); glUniform3fv(glGetUniformLocation(shader.Program, "viewPos"), 1, &camera.Position[0]); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "lightSpaceMatrix"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); // Enable/Disable shadows by pressing 'SPACE' glUniform1i(glGetUniformLocation(shader.Program, "shadows"), shadows); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, woodTexture); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, depthMap); RenderScene(shader); */ glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderGeometryPass.Use(); glm::mat4 projection = glm::perspective(camera.Zoom, (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); glm::mat4 view = camera.GetViewMatrix(); glUniformMatrix4fv(glGetUniformLocation(shaderGeometryPass.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLocation(shaderGeometryPass.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(glGetUniformLocation(shaderGeometryPass.Program, "lightSpaceMatrix"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, woodTexture); RenderScene(shaderGeometryPass); glBindFramebuffer(GL_FRAMEBUFFER, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderLightingPass.Use(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, gPosition); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, gNormal); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, gAlbedoSpec); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, gDepthViewer); glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, gShadowMap); // Also send light relevant uniforms glUniform3fv(glGetUniformLocation(shaderLightingPass.Program, "lightPos"), 1, &lightPos[0]); glUniform3fv(glGetUniformLocation(shaderLightingPass.Program, "viewPos"), 1, &camera.Position[0]); glUniform1i(glGetUniformLocation(shaderLightingPass.Program, "draw_mode"), draw_mode); RenderQuad(); // Swap the buffers glfwSwapBuffers(window); } glfwTerminate(); return 0; }
// The MAIN function, from here we start our application and run our Game loop int main() { // Init GLFW 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); glfwWindowHint(GLFW_SAMPLES, 4); GLFWwindow* window = glfwCreateWindow(screenWidth, screenHeight, "LearnOpenGL", nullptr, nullptr); // Windowed glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetScrollCallback(window, scroll_callback); // Options glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // Initialize GLEW to setup the OpenGL Function pointers glewExperimental = GL_TRUE; glewInit(); // Define the viewport dimensions glViewport(0, 0, screenWidth, screenHeight); // Setup some OpenGL options glEnable(GL_DEPTH_TEST); // Setup and compile our shaders Shader ourShader("coordinate_systems.vs", "coordinate_systems.frag"); // Set up our vertex data (and buffer(s)) and attribute pointers GLfloat vertices[] = { -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f }; glm::vec3 cubePositions[] = { glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(2.0f, 5.0f, -15.0f), glm::vec3(-1.5f, -2.2f, -2.5f), glm::vec3(-3.8f, -2.0f, -12.3f), glm::vec3(2.4f, -0.4f, -3.5f), glm::vec3(-1.7f, 3.0f, -7.5f), glm::vec3(1.3f, -2.0f, -2.5f), glm::vec3(1.5f, 2.0f, -2.5f), glm::vec3(1.5f, 0.2f, -1.5f), glm::vec3(-1.3f, 1.0f, -1.5f) }; GLuint VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); // Bind our Vertex Array Object first, then bind and set our buffers and pointers. glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // Position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); // TexCoord attribute glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(2); glBindVertexArray(0); // Unbind VAO // Load and create a texture GLuint texture1; GLuint texture2; // --== TEXTURE 1 == -- glGenTextures(1, &texture1); glBindTexture(GL_TEXTURE_2D, texture1); // All upcoming GL_TEXTURE_2D operations now have effect on our texture object // Set our texture parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Load, create texture and generate mipmaps int width, height; unsigned char* image = SOIL_load_image(FileSystem::getPath("resources/textures/container.jpg").c_str(), &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0); // Unbind texture when done, so we won't accidentily mess up our texture. // --== TEXTURE 2 == -- glGenTextures(1, &texture2); glBindTexture(GL_TEXTURE_2D, texture2); // Set our texture parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Load, create texture and generate mipmaps image = SOIL_load_image(FileSystem::getPath("resources/textures/awesomeface.png").c_str(), &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0); // Game loop while(!glfwWindowShouldClose(window)) { // Set frame time GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; // Check and call events glfwPollEvents(); Do_Movement(); // Clear the colorbuffer glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw our first triangle ourShader.Use(); // Bind Textures using texture units glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture1"), 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture2"), 1); // Create camera transformation glm::mat4 view; view = camera.GetViewMatrix(); glm::mat4 projection; projection = glm::perspective(camera.Zoom, (float)screenWidth/(float)screenHeight, 0.1f, 1000.0f); // Get the uniform locations GLint modelLoc = glGetUniformLocation(ourShader.Program, "model"); GLint viewLoc = glGetUniformLocation(ourShader.Program, "view"); GLint projLoc = glGetUniformLocation(ourShader.Program, "projection"); // Pass the matrices to the shader glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); glBindVertexArray(VAO); for(GLuint i = 0; i < 10; i++) { // Calculate the model matrix for each object and pass it to shader before drawing glm::mat4 model; model = glm::translate(model, cubePositions[i]); GLfloat angle = 20.0f * i; model = glm::rotate(model, angle, glm::vec3(1.0f, 0.3f, 0.5f)); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); } glBindVertexArray(0); // Swap the buffers glfwSwapBuffers(window); } // Properly de-allocate all resources once they've outlived their purpose glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glfwTerminate(); return 0; }
int main(int argc, char *argv[]) { if(!glfwInit()) { std::cerr << "Failed to init GLFW" << std::endl; return 1; } atexit(glfwTerminate); glfwSetErrorCallback(error_callback); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window = glfwCreateWindow(w, h, "Mandelbrot", NULL, NULL); if(!window) { std::cerr << "Failed to create window" << std::endl; return 1; } glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, cursor_callback); glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetScrollCallback(window, scroll_callback); glfwSetInputMode(window, GLFW_CURSOR_NORMAL, GLFW_STICKY_KEYS); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl; std::cout << "OpenGL Version: " << glGetString(GL_VERSION) << std::endl; GLuint prog; compile_shader(prog); last_mtime = get_mtime("shader.glsl"); float points[] = { -1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, }; GLuint vbo = 0; glGenBuffers (1, &vbo); glBindBuffer (GL_ARRAY_BUFFER, vbo); glBufferData (GL_ARRAY_BUFFER, 2 * 9 * sizeof (float), points, GL_STATIC_DRAW); GLuint vao = 0; glGenVertexArrays (1, &vao); glBindVertexArray (vao); glEnableVertexAttribArray (0); glBindBuffer (GL_ARRAY_BUFFER, vbo); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glUseProgram (prog); last_time = glfwGetTime(); glBindVertexArray (vao); while(!glfwWindowShouldClose(window)) { time_t new_time = get_mtime("shader.glsl"); if(new_time != last_mtime) { glDeleteProgram(prog); compile_shader(prog); glUseProgram(prog); last_mtime = new_time; std::cout << "Reloaded shader: " << last_mtime << std::endl; } glfwGetWindowSize(window, &w, &h); glUniform2d(glGetUniformLocation(prog, "screen_size"), (double)w, (double)h); glUniform1d(glGetUniformLocation(prog, "screen_ratio"), (double)w / (double)h); glUniform2d(glGetUniformLocation(prog, "center"), cx, cy); glUniform1d(glGetUniformLocation(prog, "zoom"), zoom); glUniform1i(glGetUniformLocation(prog, "itr"), itr); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawArrays (GL_TRIANGLES, 0, 6); glfwSwapBuffers(window); glfwPollEvents(); ticks++; current_time = glfwGetTime(); if(current_time - last_time > 1.0) { fps = ticks; update_window_title(); last_time = glfwGetTime(); ticks = 0; } } glfwDestroyWindow(window); }
int main() { // glfw: initialize and configure // ------------------------------ glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X // glfw window creation // -------------------- 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); // tell GLFW to capture our mouse glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // glad: load all OpenGL function pointers // --------------------------------------- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // configure global opengl state // ----------------------------- glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); // build and compile shaders // ------------------------- Shader shader("3.2.2.point_shadows.vs", "3.2.2.point_shadows.fs"); Shader simpleDepthShader("3.2.2.point_shadows_depth.vs", "3.2.2.point_shadows_depth.fs", "3.2.2.point_shadows_depth.gs"); // load textures // ------------- unsigned int woodTexture = loadTexture(FileSystem::getPath("resources/textures/wood.png").c_str()); // configure depth map FBO // ----------------------- const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; unsigned int depthMapFBO; glGenFramebuffers(1, &depthMapFBO); // create depth cubemap texture unsigned int depthCubemap; glGenTextures(1, &depthCubemap); glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap); for (unsigned int i = 0; i < 6; ++i) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 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); // attach depth texture as FBO's depth buffer glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthCubemap, 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0); // shader configuration // -------------------- shader.use(); shader.setInt("diffuseTexture", 0); shader.setInt("depthMap", 1); // lighting info // ------------- glm::vec3 lightPos(0.0f, 0.0f, 0.0f); // render loop // ----------- while (!glfwWindowShouldClose(window)) { // per-frame time logic // -------------------- float currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; // input // ----- processInput(window); // move light position over time lightPos.z = sin(glfwGetTime() * 0.5) * 3.0; // render // ------ glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 0. create depth cubemap transformation matrices // ----------------------------------------------- float near_plane = 1.0f; float far_plane = 25.0f; glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), (float)SHADOW_WIDTH / (float)SHADOW_HEIGHT, near_plane, far_plane); std::vector<glm::mat4> shadowTransforms; shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f))); shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f))); shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f))); shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f))); shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f))); shadowTransforms.push_back(shadowProj * glm::lookAt(lightPos, lightPos + glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f))); // 1. render scene to depth cubemap // -------------------------------- glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glClear(GL_DEPTH_BUFFER_BIT); simpleDepthShader.use(); for (unsigned int i = 0; i < 6; ++i) simpleDepthShader.setMat4("shadowMatrices[" + std::to_string(i) + "]", shadowTransforms[i]); simpleDepthShader.setFloat("far_plane", far_plane); simpleDepthShader.setVec3("lightPos", lightPos); renderScene(simpleDepthShader); glBindFramebuffer(GL_FRAMEBUFFER, 0); // 2. render scene as normal // ------------------------- glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader.use(); glm::mat4 projection = glm::perspective(camera.Zoom, (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); glm::mat4 view = camera.GetViewMatrix(); shader.setMat4("projection", projection); shader.setMat4("view", view); // set lighting uniforms shader.setVec3("lightPos", lightPos); shader.setVec3("viewPos", camera.Position); shader.setInt("shadows", shadows); // enable/disable shadows by pressing 'SPACE' shader.setFloat("far_plane", far_plane); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, woodTexture); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap); renderScene(shader); // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) // ------------------------------------------------------------------------------- glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
int main(int argc, char** argv) { Slot* slots; GLFWmonitor* monitor = NULL; int ch, i, width, height, count = 1; setlocale(LC_ALL, ""); glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); printf("Library initialized\n"); glfwSetMonitorCallback(monitor_callback); while ((ch = getopt(argc, argv, "hfn:")) != -1) { switch (ch) { case 'h': usage(); exit(EXIT_SUCCESS); case 'f': monitor = glfwGetPrimaryMonitor(); break; case 'n': count = (int) strtol(optarg, NULL, 10); break; default: usage(); exit(EXIT_FAILURE); } } if (monitor) { const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate); glfwWindowHint(GLFW_RED_BITS, mode->redBits); glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits); glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits); width = mode->width; height = mode->height; } else { width = 640; height = 480; } if (!count) { fprintf(stderr, "Invalid user\n"); exit(EXIT_FAILURE); } slots = calloc(count, sizeof(Slot)); for (i = 0; i < count; i++) { char title[128]; slots[i].closeable = GL_TRUE; slots[i].number = i + 1; sprintf(title, "Event Linter (Window %i)", slots[i].number); if (monitor) { printf("Creating full screen window %i (%ix%i on %s)\n", slots[i].number, width, height, glfwGetMonitorName(monitor)); } else { printf("Creating windowed mode window %i (%ix%i)\n", slots[i].number, width, height); } slots[i].window = glfwCreateWindow(width, height, title, monitor, NULL); if (!slots[i].window) { free(slots); glfwTerminate(); exit(EXIT_FAILURE); } glfwSetWindowUserPointer(slots[i].window, slots + i); glfwSetWindowPosCallback(slots[i].window, window_pos_callback); glfwSetWindowSizeCallback(slots[i].window, window_size_callback); glfwSetFramebufferSizeCallback(slots[i].window, framebuffer_size_callback); glfwSetWindowCloseCallback(slots[i].window, window_close_callback); glfwSetWindowRefreshCallback(slots[i].window, window_refresh_callback); glfwSetWindowFocusCallback(slots[i].window, window_focus_callback); glfwSetWindowIconifyCallback(slots[i].window, window_iconify_callback); glfwSetMouseButtonCallback(slots[i].window, mouse_button_callback); glfwSetCursorPosCallback(slots[i].window, cursor_position_callback); glfwSetCursorEnterCallback(slots[i].window, cursor_enter_callback); glfwSetScrollCallback(slots[i].window, scroll_callback); glfwSetKeyCallback(slots[i].window, key_callback); glfwSetCharCallback(slots[i].window, char_callback); glfwSetCharModsCallback(slots[i].window, char_mods_callback); glfwSetDropCallback(slots[i].window, drop_callback); glfwMakeContextCurrent(slots[i].window); glfwSwapInterval(1); } printf("Main loop starting\n"); for (;;) { for (i = 0; i < count; i++) { if (glfwWindowShouldClose(slots[i].window)) break; } if (i < count) break; glfwWaitEvents(); // Workaround for an issue with msvcrt and mintty fflush(stdout); } free(slots); glfwTerminate(); exit(EXIT_SUCCESS); }
void OGLApp::v_run() { app = std::make_shared<OGLApp>(*this); std::cout << "Starting GLFW context" << std::endl; if (!glfwInit()) { std::cerr << "Failed to initialize GLFW" << std::endl; return; } sw = WindowInfo::getInstance()->getWidth(); sh = WindowInfo::getInstance()->getHeight(); int MonitorCount; GLFWmonitor ** monitors = glfwGetMonitors(&MonitorCount); #ifdef _DEBUG glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, true); #endif //glfwGetPrimaryMonitor(), pWindow = glfwCreateWindow(sw, sh, WindowInfo::getInstance()->getTitle().c_str(), nullptr, nullptr); glfwSetWindowPos(pWindow, WindowInfo::getInstance()->getPosX() - 100, WindowInfo::getInstance()->getPosY() - 100); glfwMakeContextCurrent(pWindow); glfwSetCursorPosCallback(pWindow, glfw_mouse); // - Directly redirect GLFW mouse position events to AntTweakBar glfwSetScrollCallback(pWindow, glfw_scroll); // - Directly redirect GLFW mouse wheel events to AntTweakBar glfwSetKeyCallback(pWindow, glfw_key); // - Directly redirect GLFW key events to AntTweakBar #ifdef USE_ANT glfwSetMouseButtonCallback(pWindow, glfw_mouseButton); // - Directly redirect GLFW mouse button events to AntTweakBar glfwSetCharCallback(pWindow, glfw_char); // - Directly redirect GLFW char events to AntTweakBar #endif glfwSetWindowSizeCallback(pWindow, glfw_resize); //glfwSetInputMode(pWindow, GLFW_STICKY_KEYS, GL_TRUE); // GLFW Options //glfwSetInputMode(pWindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED); if (pWindow == NULL) { std::cerr << "Failed to create GLFW pWindow" << std::endl; glfwTerminate(); return; } glewExperimental = GL_TRUE; //Check the GLSL and OpenGL status if (glewInit() != GLEW_OK) { std::cerr << "Failed to initialize GLEW" << std::endl; return; } const GLubyte *renderer = glGetString(GL_RENDERER); const GLubyte *vendor = glGetString(GL_VENDOR); const GLubyte *version = glGetString(GL_VERSION); const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION); m_GLRenderer = (const char *)renderer; m_GLVersion = (const char *)version; m_GLSLVersion = (const char *)glslVersion; GLint major, minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); std::cout << "GL Vendor :" << vendor << std::endl; std::cout << "GL Renderer : " << renderer << std::endl; std::cout << "GL Version (std::string) : " << version << std::endl; std::cout << "GL Version (integer) : " << major << "." << minor << std::endl; std::cout << "GLSL Version : " << glslVersion << std::endl; std::cout << "--------------------------------------------------------------------------------" << std::endl; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, major); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, minor); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); #ifdef USE_FONT m_pFont.init(); #endif #ifdef USE_CEGUI OGLCEGUI::getInstance()->init(); OGLCEGUI::getInstance()->setupCallbacks(pWindow); #endif v_init(); while (!glfwWindowShouldClose(pWindow)) { glfwPollEvents(); v_movement(pWindow); countFps(); static GLfloat lastFrame = static_cast<float>(glfwGetTime()); GLfloat currentFrame = static_cast<float>(glfwGetTime()); GLfloat deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; v_update(); v_render(); #ifdef USE_FONT glDisable(GL_DEPTH_TEST); m_pFont.render("Graphics card: " + m_GLRenderer, 10, sh - 40); m_pFont.render("GL Version: " + m_GLVersion, 10, sh - 70); m_pFont.render("GLSL Version: " + m_GLSLVersion, 10, sh - 100); m_pFont.render("FPS: " + std::to_string(m_fps), 10, 30); //glEnable(GL_DEPTH_TEST); #endif #ifdef USE_CEGUI OGLCEGUI::getInstance()->render(); #endif glfwSwapBuffers(pWindow); } v_shutdown(); glfwTerminate(); }
int main( int argc, char *argv[] ) { GLFWwindow *window; int Edit; //File name to load string fileName; //whether name inputtted is valid bool validFile = false; //Try to determine file input while(validFile == false) { printf("Type the file to load (Special options: 'd' = default, 'c' = clean):\n"); scanf("%s", &fileName[0]); ifstream toLoad(&fileName[0]); validFile = toLoad.good(); //If 'c' was entered, then load a clean level if(strcmp(&fileName[0], "c") == 0) { printf("Loading clean level...\n"); fileName = "clean"; validFile = true; } //If 'd' was entered, then deafult level else if(strcmp(&fileName[0], "d") == 0) { printf("Loading default level...\n"); fileName = "default"; validFile = true; } else if(validFile == false) { printf("Bad file, please type another file to load.\n"); } else if(validFile == true) { toLoad.close(); } } //Determine mode printf("Type 0 to play, any other int to edit\n"); scanf("%i", &Edit); glfwSetErrorCallback(glfwError); if (!glfwInit()) { exit(EXIT_FAILURE); } //If Edit Mode if(Edit) { //World Edit Init //initWorldEdit(window); window = glfwCreateWindow(800, 800, "World Editor", NULL, NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } srand(time(0)); glfwMakeContextCurrent(window); glfwSetWindowPos(window, 80, 80); glfwSetWindowSizeCallback(window, glfwWindowResize); glfwSetWindowSize(window,1600,800); g_height =800; g_width = 1600; setDistance(7); SetEdit(1); paused = false; glfwSetKeyCallback( window, glfwEditKeyPress); glfwSetCursorPosCallback( window, glfwEditGetCursorPos ); glfwSetMouseButtonCallback( window, glfwEditMouse ); glfwSetScrollCallback( window, glfwEditScroll ); glewInit(); glInitialize(window); physicsInit(); InitGeom(); initLevelLoader(); loadLevel(fileName); } //If Play Mode else { //Game Play Init //initGamePlay(window); window = glfwCreateWindow(800, 800, "Grapple", NULL, NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } srand(time(0)); SetEye(vec3(0, 0, 0)); glfwMakeContextCurrent(window); glfwSetWindowPos(window, 80, 80); glfwSetWindowSizeCallback(window, glfwWindowResize); glfwSetWindowSize(window,1600,800); g_height =800; g_width = 1600; setDistance(10); paused = false; glfwSetKeyCallback(window, glfwGameKeyPress); glfwSetCursorPosCallback( window, glfwGameGetCursorPos ); glewInit(); glInitialize(window); physicsInit(); InitGeom(); initLevelLoader(); loadLevel(fileName); } ShadowMap *shadowMap = new ShadowMap(); if (shadowMap->MakeShadowMap(g_width, g_height) == -1) { printf("SHADOW MAP FAILED\n"); exit(EXIT_FAILURE); } // Start the main execution loop. while (!glfwWindowShouldClose(window)) { glfwPollEvents(); if(Edit) { if(paused == false) { //Keep the cursor centered glfwSetCursorPos(window,g_width/2,g_height/2); renderScene(window, shadowMap); glfwEditGetCursorPos(NULL,g_width/2.0,g_height/2.0); //glfw Game Keyboard glfwEditKeyboard(); } } else { if(paused == false) { //player appy physics controls SetLookAt(glm::vec3(physGetPlayerX(),physGetPlayerY(),physGetPlayerZ())); SetSpeed(.05*magnitude(getPlayerSpeed())); //Keep the cursor centered glfwSetCursorPos(window,g_width/2,g_height/2); physStep(); //Draw stuff renderScene(window, shadowMap); glfwGameGetCursorPos(NULL,g_width/2.0,g_height/2.0); //glfw Game Keyboard glfwGameKeyboard(); } } usleep(15000); } // Clean up after GLFW. glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }
int main (int argc, char* argv[]) { srand (static_cast<unsigned>(time(0))); // Magic glewExperimental = GL_TRUE; // Init GLEW and GLFW if(initializeOpenGL() == -1) { return -1; } scene = new Scene(); utilHandler = new Utils(); createPreDefinedVoronoiPoints(); scene->setPreComputedVoronoiPoints(sVoronoiPoints); // Create geometries and add them to the scene // Floor floor_rect = new Rectangle(1.0f, 1.0f, Vector3<float>(0.0f, 0.0f, 0.0f)); floor_rect->rotate(Vector3<float>(1.0f, 0.0f, 0.0f), 90.0f); floor_rect->scale(Vector3<float>(2.5f, 1.0f, 2.0f)); floor_rect->translate(Vector3<float>(0.0f, -0.35f, 0.0f)); // HalfEdge mesh mesh = new HalfEdgeMesh(Vector4<float>(0.2f, 0.8f, 0.2f, 0.4f)); mesh->addVoronoiPoint(Vector3<float>(0.0f, 0.0f, 0.0f)); mesh->setDebugMode(true); // The following meshes has pre-defined voronoi patterns //mesh->createMesh("pillar"); //mesh->createMesh("icosphere"); //mesh->createMesh("bunnySmall_reduced"); //mesh->createMesh("cube"); mesh->createMesh("cow_2"); mesh->markCurrentVoronoiPoint(currentVoronoiIndex, Vector4<float>(1.0f, 1.0f, 1.0f, 1.0f)); scene->addGeometry(floor_rect, STATIC); scene->addGeometry(mesh, STATIC); initializeScene(); //Set functions to handle mouse input glfwSetMouseButtonCallback(window, mouseButton); glfwSetCursorPosCallback(window, mouseMotion); glfwSetScrollCallback(window, mouseScroll); glfwSetKeyCallback(window, keyboardInput); // render-loop do { calcFPS(1.0, windowTitle); // Clear the screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // render all geometries scene->render(); scene->stepSimulation(); // 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 ); // Clean-up delete scene; // Close OpenGL window and terminate GLFW glfwTerminate(); return 0; }
int main(int argc, char* argv[]) { GLFWwindow window; double t, dt_total, t_old; if (!glfwInit()) { fprintf(stderr, "GLFW initialization failed\n"); exit(EXIT_FAILURE); } window = glfwOpenWindow(640, 480, GLFW_WINDOWED, "Wave Simulation", NULL); if (!window) { fprintf(stderr, "Could not open window\n"); exit(EXIT_FAILURE); } glfwSwapInterval(1); // Keyboard handler glfwSetKeyCallback(key_callback); glfwSetInputMode(window, GLFW_KEY_REPEAT, GL_TRUE); // Window resize handler glfwSetWindowSizeCallback(window_resize_callback); glfwSetMouseButtonCallback(mouse_button_callback); glfwSetMousePosCallback(mouse_position_callback); glfwSetScrollCallback(scroll_callback); // Initialize OpenGL init_opengl(); // Initialize simulation init_vertices(); init_grid(); adjust_grid(); // Initialize timer t_old = glfwGetTime() - 0.01; while (running) { t = glfwGetTime(); dt_total = t - t_old; t_old = t; // Safety - iterate if dt_total is too large while (dt_total > 0.f) { // Select iteration time step dt = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total; dt_total -= dt; // Calculate wave propagation calc_grid(); } // Compute height of each vertex adjust_grid(); // Draw wave grid to OpenGL display draw_scene(); glfwPollEvents(); // Still running? running = running && glfwIsWindow(window); } exit(EXIT_SUCCESS); }
kit::Window::Window(kit::Window::Args const & windowArgs) { kit::Window::m_instanceCount++; this->m_glfwHandle = nullptr; this->m_isFocused = true; this->m_isMinimized = false; this->m_virtualMouse = false; // Get the GLFW handle from the window to share resources with GLFWwindow * glfwSharedWindow = nullptr; if(windowArgs.sharedWindow != nullptr) { glfwSharedWindow = windowArgs.sharedWindow->getGLFWHandle(); } // Get the GLFW handle for the fullscreen monitor to use GLFWmonitor* glfwFullscreenMonitor = windowArgs.fullscreenMonitor->getGLFWHandle(); // Set OpenGL context hints. kit::Window::prepareGLFWHints(GLFW_CONTEXT_VERSION_MAJOR, 4); kit::Window::prepareGLFWHints(GLFW_CONTEXT_VERSION_MINOR, 3); kit::Window::prepareGLFWHints(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Set window-specific hints and create window according to our window-arguments switch(windowArgs.mode) { case kit::Window::Mode::Windowed: if(!windowArgs.resizable) { kit::Window::prepareGLFWHints(GLFW_RESIZABLE, GL_FALSE); } this->m_glfwHandle = glfwCreateWindow(windowArgs.resolution.x, windowArgs.resolution.y, windowArgs.title.c_str(), nullptr, glfwSharedWindow); break; case kit::Window::Mode::Fullscreen: this->m_glfwHandle = glfwCreateWindow(windowArgs.resolution.x, windowArgs.resolution.y, windowArgs.title.c_str(), glfwFullscreenMonitor, glfwSharedWindow); break; case kit::Window::Mode::Borderless: kit::Window::prepareGLFWHints(GLFW_DECORATED, GL_FALSE); kit::Window::prepareGLFWHints(GLFW_RESIZABLE, GL_FALSE); this->m_glfwHandle = glfwCreateWindow(windowArgs.resolution.x, windowArgs.resolution.y, windowArgs.title.c_str(), nullptr, glfwSharedWindow); break; default: KIT_THROW("Invalid window mode"); break; } // Reset the GLFW hints after creation kit::Window::restoreGLFWHints(); // Assert that we have a GLFW window if(!this->m_glfwHandle) { KIT_THROW("Failed to create GLFW window"); } // Register the window to the static list of windows, to keep track of events/callbacks kit::Window::m_windows.push_back(this); // Register GLFW callbacks for this window glfwSetWindowPosCallback(this->m_glfwHandle, kit::Window::__winfunc_position); glfwSetWindowSizeCallback(this->m_glfwHandle, kit::Window::__winfunc_size); glfwSetWindowCloseCallback(this->m_glfwHandle, kit::Window::__winfunc_close); glfwSetWindowFocusCallback(this->m_glfwHandle, kit::Window::__winfunc_focus); glfwSetWindowIconifyCallback(this->m_glfwHandle, kit::Window::__winfunc_minimize); glfwSetFramebufferSizeCallback(this->m_glfwHandle, kit::Window::__winfunc_framebuffersize); glfwSetMouseButtonCallback(this->m_glfwHandle, kit::Window::__infunc_mousebutton); glfwSetCursorPosCallback(this->m_glfwHandle, kit::Window::__infunc_cursorpos); glfwSetCursorEnterCallback(this->m_glfwHandle, kit::Window::__infunc_cursorenter); glfwSetScrollCallback(this->m_glfwHandle, kit::Window::__infunc_scroll); glfwSetKeyCallback(this->m_glfwHandle, kit::Window::__infunc_key); glfwSetCharCallback(this->m_glfwHandle, kit::Window::__infunc_char); // Activate the current windows context this->activateContext(); // Enable V-sync glfwSwapInterval(1); // Make sure GL3W is initialized, and set the viewport kit::initializeGL3W(); KIT_GL(glViewport(0, 0, this->getFramebufferSize().x , this->getFramebufferSize().y)); }
void Application::Init() { //Set the error callback glfwSetErrorCallback(error_callback); //Initialize GLFW if (!glfwInit()) { exit(EXIT_FAILURE); } //Set the GLFW window creation hints - these are optional glfwWindowHint(GLFW_SAMPLES, 4); //Request 4x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //Request a specific OpenGL version glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //Request a specific OpenGL version //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL //Create a window and create its OpenGL context m_window = glfwCreateWindow(1920, 1080, "myFramework", NULL, NULL); glfwSetWindowPos(m_window, 100, 8); //If the window couldn't be created if (!m_window) { fprintf( stderr, "Failed to open GLFW window.\n" ); glfwTerminate(); exit(EXIT_FAILURE); } //This function makes the context of the specified window current on the calling thread. glfwMakeContextCurrent(m_window); glfwSetWindowSizeCallback(m_window, resize_callback); //Sets the key callback //glfwSetKeyCallback(m_window, key_callback); glfwSetScrollCallback(m_window, scroll_callback); glewExperimental = true; // Needed for core profile //Initialize GLEW GLenum err = glewInit(); glfwSetInputMode(m_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //If GLEW hasn't initialized if (err != GLEW_OK) { fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); //return -1; } m_dElapsedTime = 0.0; m_dAccumulatedTime_ThreadOne = 0.0; m_dAccumulatedTime_ThreadTwo = 0.0; Math::InitRNG(); ifstream inData; string data; inData.open ("Assets//Font//ascii.txt"); for (unsigned i = 0; i < 255; i++) { textspace[i] = 0.3f; } int index = 33; while (!inData.eof()) { getline (inData, data); if (data == "") continue; int number = 0; for (unsigned i = 0; i < data.size(); i++) { if (data[i] == '=') { number = i + 1; break; } } textspace[index] = atoi(&data[number]) / 11.f; index++; } inData.close (); }
int main(int argc, char **argv) { srand(time(NULL)); rand(); if (argc == 2 || argc == 3) { char *hostname = argv[1]; int port = DEFAULT_PORT; if (argc == 3) { port = atoi(argv[2]); } db_disable(); client_enable(); client_connect(hostname, port); client_start(); } if (!glfwInit()) { return -1; } create_window(); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSwapInterval(VSYNC); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetKeyCallback(window, on_key); glfwSetMouseButtonCallback(window, on_mouse_button); glfwSetScrollCallback(window, on_scroll); #ifndef __APPLE__ if (glewInit() != GLEW_OK) { return -1; } #endif if (db_init()) { return -1; } glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_LINE_SMOOTH); glLogicOp(GL_INVERT); glClearColor(0.53, 0.81, 0.92, 1.00); GLuint texture; glGenTextures(1, &texture); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); load_png_texture("texture.png"); GLuint block_program = load_program( "shaders/block_vertex.glsl", "shaders/block_fragment.glsl"); GLuint matrix_loc = glGetUniformLocation(block_program, "matrix"); GLuint camera_loc = glGetUniformLocation(block_program, "camera"); GLuint sampler_loc = glGetUniformLocation(block_program, "sampler"); GLuint timer_loc = glGetUniformLocation(block_program, "timer"); GLuint position_loc = glGetAttribLocation(block_program, "position"); GLuint normal_loc = glGetAttribLocation(block_program, "normal"); GLuint uv_loc = glGetAttribLocation(block_program, "uv"); GLuint line_program = load_program( "shaders/line_vertex.glsl", "shaders/line_fragment.glsl"); GLuint line_matrix_loc = glGetUniformLocation(line_program, "matrix"); GLuint line_position_loc = glGetAttribLocation(line_program, "position"); GLuint item_position_buffer = 0; GLuint item_normal_buffer = 0; GLuint item_uv_buffer = 0; int previous_block_type = 0; Chunk chunks[MAX_CHUNKS]; int chunk_count = 0; Player players[MAX_PLAYERS]; int player_count = 0; FPS fps = {0, 0}; float matrix[16]; float x = (rand_double() - 0.5) * 10000; float z = (rand_double() - 0.5) * 10000; float y = 0; float dy = 0; float rx = 0; float ry = 0; double px = 0; double py = 0; int loaded = db_load_state(&x, &y, &z, &rx, &ry); ensure_chunks(chunks, &chunk_count, floorf(roundf(x) / CHUNK_SIZE), floorf(roundf(z) / CHUNK_SIZE), 1); if (!loaded) { y = highest_block(chunks, chunk_count, x, z) + 2; } glfwGetCursorPos(window, &px, &py); double previous = glfwGetTime(); while (!glfwWindowShouldClose(window)) { update_fps(&fps, SHOW_FPS); double now = glfwGetTime(); double dt = MIN(now - previous, 0.2); previous = now; if (exclusive && (px || py)) { double mx, my; glfwGetCursorPos(window, &mx, &my); float m = 0.0025; rx += (mx - px) * m; ry -= (my - py) * m; if (rx < 0) { rx += RADIANS(360); } if (rx >= RADIANS(360)){ rx -= RADIANS(360); } ry = MAX(ry, -RADIANS(90)); ry = MIN(ry, RADIANS(90)); px = mx; py = my; } else { glfwGetCursorPos(window, &px, &py); } int sz = 0; int sx = 0; ortho = glfwGetKey(window, 'F'); fov = glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) ? 15.0 : 65.0; if (glfwGetKey(window, 'Q')) break; if (glfwGetKey(window, 'W')) sz--; if (glfwGetKey(window, 'S')) sz++; if (glfwGetKey(window, 'A')) sx--; if (glfwGetKey(window, 'D')) sx++; float m = dt * 1.0; if (glfwGetKey(window, GLFW_KEY_LEFT)) rx -= m; if (glfwGetKey(window, GLFW_KEY_RIGHT)) rx += m; if (glfwGetKey(window, GLFW_KEY_UP)) ry += m; if (glfwGetKey(window, GLFW_KEY_DOWN)) ry -= m; float vx, vy, vz; get_motion_vector(flying, sz, sx, rx, ry, &vx, &vy, &vz); if (glfwGetKey(window, GLFW_KEY_SPACE)) { if (flying) { vy = 1; } else if (dy == 0) { dy = 8; } } if (glfwGetKey(window, 'Z')) { vx = -1; vy = 0; vz = 0; } if (glfwGetKey(window, 'X')) { vx = 1; vy = 0; vz = 0; } if (glfwGetKey(window, 'C')) { vx = 0; vy = -1; vz = 0; } if (glfwGetKey(window, 'V')) { vx = 0; vy = 1; vz = 0; } if (glfwGetKey(window, 'B')) { vx = 0; vy = 0; vz = -1; } if (glfwGetKey(window, 'N')) { vx = 0; vy = 0; vz = 1; } float speed = flying ? 20 : 5; int step = 8; float ut = dt / step; vx = vx * ut * speed; vy = vy * ut * speed; vz = vz * ut * speed; for (int i = 0; i < step; i++) { if (flying) { dy = 0; } else { dy -= ut * 25; dy = MAX(dy, -250); } x += vx; y += vy + dy * ut; z += vz; if (collide(chunks, chunk_count, 2, &x, &y, &z)) { dy = 0; } } if (y < 0) { y = highest_block(chunks, chunk_count, x, z) + 2; } for (int i = 0; i < chunk_count; i++) { Chunk *chunk = chunks + i; chunk->dirty = 0; } if (left_click) { left_click = 0; int hx, hy, hz; int hw = hit_test(chunks, chunk_count, 0, x, y, z, rx, ry, &hx, &hy, &hz); if (hy > 0 && is_destructable(hw)) { set_block(chunks, chunk_count, hx, hy, hz, 0, 1); } } if (right_click) { right_click = 0; int hx, hy, hz; int hw = hit_test(chunks, chunk_count, 1, x, y, z, rx, ry, &hx, &hy, &hz); if (is_obstacle(hw)) { if (!player_intersects_block(2, x, y, z, hx, hy, hz)) { set_block(chunks, chunk_count, hx, hy, hz, block_type, 1); } } } if (middle_click) { middle_click = 0; int hx, hy, hz; int hw = hit_test(chunks, chunk_count, 0, x, y, z, rx, ry, &hx, &hy, &hz); if (is_selectable(hw)) { block_type = hw; } } if (teleport) { teleport = 0; if (player_count) { int index = rand_int(player_count); Player *player = players + index; x = player->x; y = player->y; z = player->z; rx = player->rx; ry = player->ry; ensure_chunks(chunks, &chunk_count, floorf(roundf(x) / CHUNK_SIZE), floorf(roundf(z) / CHUNK_SIZE), 1); } } client_position(x, y, z, rx, ry); char buffer[RECV_BUFFER_SIZE]; while (client_recv(buffer, RECV_BUFFER_SIZE)) { float ux, uy, uz, urx, ury; if (sscanf(buffer, "U,%*d,%f,%f,%f,%f,%f", &ux, &uy, &uz, &urx, &ury) == 5) { x = ux; y = uy; z = uz; rx = urx; ry = ury; ensure_chunks(chunks, &chunk_count, floorf(roundf(x) / CHUNK_SIZE), floorf(roundf(z) / CHUNK_SIZE), 1); y = highest_block(chunks, chunk_count, x, z) + 2; } int bx, by, bz, bw; if (sscanf(buffer, "B,%*d,%*d,%d,%d,%d,%d", &bx, &by, &bz, &bw) == 4) { set_block(chunks, chunk_count, bx, by, bz, bw, 0); if ((int)roundf(x) == bx && (int)roundf(z) == bz) { y = highest_block(chunks, chunk_count, x, z) + 2; } } int pid; float px, py, pz, prx, pry; if (sscanf(buffer, "P,%d,%f,%f,%f,%f,%f", &pid, &px, &py, &pz, &prx, &pry) == 6) { Player *player = find_player(players, player_count, pid); if (!player && player_count < MAX_PLAYERS) { player = players + player_count; player_count++; player->id = pid; player->position_buffer = 0; player->normal_buffer = 0; player->uv_buffer = 0; printf("%d other players are online\n", player_count); } if (player) { update_player(player, px, py, pz, prx, pry); } } if (sscanf(buffer, "D,%d", &pid) == 1) { delete_player(players, &player_count, pid); printf("%d other players are online\n", player_count); } } for (int i = 0; i < chunk_count; i++) { Chunk *chunk = chunks + i; if (chunk->dirty) { update_chunk(chunk); } } int p = floorf(roundf(x) / CHUNK_SIZE); int q = floorf(roundf(z) / CHUNK_SIZE); ensure_chunks(chunks, &chunk_count, p, q, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update_matrix_3d(matrix, x, y, z, rx, ry); // render chunks glUseProgram(block_program); glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, matrix); glUniform3f(camera_loc, x, y, z); glUniform1i(sampler_loc, 0); glUniform1f(timer_loc, glfwGetTime()); for (int i = 0; i < chunk_count; i++) { Chunk *chunk = chunks + i; if (chunk_distance(chunk, p, q) > RENDER_CHUNK_RADIUS) { continue; } if (!chunk_visible(chunk, matrix)) { continue; } draw_chunk(chunk, position_loc, normal_loc, uv_loc); } // render players for (int i = 0; i < player_count; i++) { Player *player = players + i; draw_player(player, position_loc, normal_loc, uv_loc); } // render focused block wireframe int hx, hy, hz; int hw = hit_test( chunks, chunk_count, 0, x, y, z, rx, ry, &hx, &hy, &hz); if (is_obstacle(hw)) { glUseProgram(line_program); glLineWidth(1); glEnable(GL_COLOR_LOGIC_OP); glUniformMatrix4fv(line_matrix_loc, 1, GL_FALSE, matrix); GLuint cube_buffer = make_cube_buffer(hx, hy, hz, 0.51); draw_lines(cube_buffer, line_position_loc, 3, 48); glDeleteBuffers(1, &cube_buffer); glDisable(GL_COLOR_LOGIC_OP); } update_matrix_2d(matrix); // render crosshairs glUseProgram(line_program); glLineWidth(4); glEnable(GL_COLOR_LOGIC_OP); glUniformMatrix4fv(line_matrix_loc, 1, GL_FALSE, matrix); GLuint line_buffer = make_line_buffer(); draw_lines(line_buffer, line_position_loc, 2, 4); glDeleteBuffers(1, &line_buffer); glDisable(GL_COLOR_LOGIC_OP); // render selected item update_matrix_item(matrix); if (block_type != previous_block_type) { previous_block_type = block_type; make_single_cube( &item_position_buffer, &item_normal_buffer, &item_uv_buffer, 0, 0, 0, 0.5, block_type); } glUseProgram(block_program); glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, matrix); glUniform3f(camera_loc, 0, 0, 5); glUniform1i(sampler_loc, 0); glUniform1f(timer_loc, glfwGetTime()); glDisable(GL_DEPTH_TEST); draw_single_cube( item_position_buffer, item_normal_buffer, item_uv_buffer, position_loc, normal_loc, uv_loc); glEnable(GL_DEPTH_TEST); glfwSwapBuffers(window); glfwPollEvents(); } client_stop(); db_save_state(x, y, z, rx, ry); db_close(); glfwTerminate(); return 0; }
// // コンストラクタ // Window::Window(int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share) : window(glfwCreateWindow(width, height, title, monitor, share)) , ex(startPosition[0]) // カメラの x 座標 , ey(startPosition[1]) // カメラの y 座標 , ez(startPosition[2]) // カメラの z 座標 , threshold(0.5f) // 閾値 , blend(true) // アルファブレンディング #if STEREO != OCULUS && STEREO != NONE , parallax(initialParallax) #endif #if STEREO != OCULUS , scrH(zNear * screenCenter / screenDistance) #endif { if (!window) return; // 現在のウィンドウを処理対象にする glfwMakeContextCurrent(window); // 作成したウィンドウに対する設定 glfwSwapInterval(1); // ウィンドウのサイズ変更時に呼び出す処理の登録 glfwSetFramebufferSizeCallback(window, resize); // マウスボタンを操作したときの処理 glfwSetMouseButtonCallback(window, mouse); // マウスホイール操作時に呼び出す処理 glfwSetScrollCallback(window, wheel); // キーボードを操作した時の処理 glfwSetKeyCallback(window, keyboard); // マウスカーソルを表示する glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); // このインスタンスの this ポインタを記録しておく glfwSetWindowUserPointer(window, this); // ゲームグラフィックス特論の都合にもとづく初期化 if (!glCreateProgram) ggInit(); // ジョイステックの有無を調べて番号を決める joy = glfwJoystickPresent(count) ? count : -1; // スティックの中立位置を求める if (joy >= 0) { int axesCount; const float *const axes(glfwGetJoystickAxes(joy, &axesCount)); if (axesCount > 3 + axesOffset) { // 起動直後のスティックの位置を基準にする origin[0] = axes[0]; origin[1] = axes[1]; origin[2] = axes[2 + axesOffset]; origin[3] = axes[3 + axesOffset]; } } #if STEREO == OCULUS // プログラムオブジェクト, VAO / VBO, Oculus Rift のデバイスマネージャーの作成は最初一度だけ行う if (count == 0) { // Oculus Rift のレンズの歪みを補正するシェーダプログラム ocuProgram = ggLoadShader("oculus.vert", "oculus.frag"); ocuFboColorLoc = glGetUniformLocation(ocuProgram, "ocuFboColor"); ocuAspectLoc = glGetUniformLocation(ocuProgram, "ocuAspect"); projectionCenterOffsetLoc = glGetUniformLocation(ocuProgram, "projectionCenterOffset"); lensDistortionLoc = glGetUniformLocation(ocuProgram, "lensDistortion"); lensScaleLoc = glGetUniformLocation(ocuProgram, "lensScale"); // Oculus Rift 表示に使う矩形 glGenVertexArrays(1, &ocuVao); glBindVertexArray(ocuVao); glGenBuffers(1, &ocuVbo); glBindBuffer(GL_ARRAY_BUFFER, ocuVbo); static const GLfloat rect[] = { -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof rect, rect, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(0); // Oculus Rift のデバイスマネージャーの作成 pManager = *DeviceManager::Create(); } // Oculus Rift のデバイスマネージャーが作成できたら情報を取得する if (pManager && (pHmd = *pManager->EnumerateDevices<HMDDevice>().CreateDevice()) && pHmd->GetDeviceInfo(&hmdInfo) ) { # if defined(_DEBUG) // 取得した情報を表示する std::cout << hmdInfo.DisplayDeviceName << std::endl; std::cout << "\nResolution:" << hmdInfo.HResolution << ", " << hmdInfo.VResolution << std::endl; std::cout << "\nScreen size: " << hmdInfo.HScreenSize << ", " << hmdInfo.VScreenSize << std::endl; std::cout << "\nVertical Screen Center: " << hmdInfo.VScreenCenter << std::endl; std::cout << "\nEye to Screen Distance: " << hmdInfo.EyeToScreenDistance << std::endl; std::cout << "\nLens Separation Distance: " << hmdInfo.LensSeparationDistance << std::endl; std::cout << "\nInterpupillary Distance: " << hmdInfo.InterpupillaryDistance << std::endl; std::cout << "\nDistortion: " << hmdInfo.DistortionK[0] << ", " << hmdInfo.DistortionK[1] << ", " << hmdInfo.DistortionK[2] << ", " << hmdInfo.DistortionK[3] << std::endl; std::cout << std::endl; # endif // レンズの中心の画面の中心からのずれ projectionCenterOffset = 1.0f - 2.0f * hmdInfo.LensSeparationDistance / hmdInfo.HScreenSize; // スクリーンの幅と高さ scrW = scrH = zNear * hmdInfo.VScreenCenter / hmdInfo.EyeToScreenDistance; // 視差 parallax = hmdInfo.InterpupillaryDistance * 0.5f; // レンズの歪みの補正係数 lensDistortion[0] = hmdInfo.DistortionK[0]; lensDistortion[1] = hmdInfo.DistortionK[1]; lensDistortion[2] = hmdInfo.DistortionK[2]; lensDistortion[3] = hmdInfo.DistortionK[3]; // 片目の表示領域のアスペクト比 ocuAspect = hmdInfo.HScreenSize * 0.5f / hmdInfo.VScreenSize; // Oculus Rift のセンサの取得 pSensor = *pHmd->GetSensor(); // センサーを登録する if (pSensor) sensorFusion.AttachToSensor(pSensor); } else { // Oculus Rift をつながずにデバッグする時の設定 scrW = scrH = zNear * 0.0468f / 0.041f; parallax = 0.064f * 0.5f; projectionCenterOffset = 1.0f - 2.0f * 0.0635f / 0.14976f; lensDistortion[0] = 1.0f; lensDistortion[1] = 0.2f; lensDistortion[2] = 0.24f; lensDistortion[3] = 0.0f; ocuAspect = 0.14976f * 0.5f / 0.0936f; pSensor = nullptr; } // レンズの歪み補正に伴う拡大率の補正 lensScale = 1.0f / (lensDistortion[0] + lensDistortion[1] + lensDistortion[2] + lensDistortion[3]); // Oculus Rift の左目用と右目用の FBO の準備 glGenFramebuffers(2, ocuFbo); // Oculus Rift 表示用の FBO のデプスバッファとして使うレンダーバッファの作成 glGenRenderbuffers(1, &ocuFboDepth); glBindRenderbuffer(GL_RENDERBUFFER, ocuFboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, fboWidth, fboHeight); // Oculus Rift 表示用の FBO のカラーバッファとして使うカラーテクスチャの作成 glGenTextures(2, ocuFboColor); for (int i = 0; i < 2; ++i) { // 左右の目のそれぞれの表示サイズより少し大きなテクスチャメモリの確保 glBindTexture(GL_TEXTURE_2D, ocuFboColor[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); // 左右の目のそれぞれについて FBO を作成する glBindFramebuffer(GL_FRAMEBUFFER, ocuFbo[i]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ocuFboColor[i], 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, ocuFboDepth); } #endif // 投影変換行列・ビューポートを初期化する resize(window, width, height); #if BENCHMARK // 時間計測用の Query Object を作成する glGenQueries(1, &query); #endif // 参照カウントを増す ++count; }
bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor) { setViewName(viewName); _frameZoomFactor = frameZoomFactor; if (s_intriGdipCanvasEnabled) IrregularGL::thisObject()->setupGL(); glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); glfwWindowHint(GLFW_RED_BITS,_glContextAttrs.redBits); glfwWindowHint(GLFW_GREEN_BITS,_glContextAttrs.greenBits); glfwWindowHint(GLFW_BLUE_BITS,_glContextAttrs.blueBits); glfwWindowHint(GLFW_ALPHA_BITS,_glContextAttrs.alphaBits); glfwWindowHint(GLFW_DEPTH_BITS,_glContextAttrs.depthBits); glfwWindowHint(GLFW_STENCIL_BITS,_glContextAttrs.stencilBits); // x-studio365 spec hints glfwWindowHint(GLFW_DECORATED, !s_intriWindowNoB); glfwWindowHint(GLFW_VISIBLE, s_intriWindowVisible); glfwWindowHint(GLFW_ALPHA_MASK, s_intriWindowAlphaEnabled); glfwxSetParent(s_intriWindowParent); int needWidth = rect.size.width * _frameZoomFactor; int neeHeight = rect.size.height * _frameZoomFactor; _mainWindow = glfwCreateWindow(needWidth, neeHeight, _viewName.c_str(), _monitor, nullptr); if (_mainWindow == nullptr) { std::string message = "Can't create window"; if (!_glfwError.empty()) { message.append("\nMore info: \n"); message.append(_glfwError); } ccMessageBox(message.c_str(), "Error launch application"); return false; } /* * Note that the created window and context may differ from what you requested, * as not all parameters and hints are * [hard constraints](@ref window_hints_hard). This includes the size of the * window, especially for full screen windows. To retrieve the actual * attributes of the created window and context, use queries like @ref * glfwGetWindowAttrib and @ref glfwGetWindowSize. * * see declaration glfwCreateWindow */ int realW = 0, realH = 0; glfwGetWindowSize(_mainWindow, &realW, &realH); if (realW != needWidth) { rect.size.width = realW / _frameZoomFactor; } if (realH != neeHeight) { rect.size.height = realH / _frameZoomFactor; } glfwMakeContextCurrent(_mainWindow); // x-studio365 spec: use glfwx setMouseButtonCallback ensure update mouse coord immediately. glfwxSetMouseButtonCallback(_mainWindow, GLFWEventHandler::onGLFWMouseCallBackEx); glfwSetCursorPosCallback(_mainWindow, GLFWEventHandler::onGLFWMouseMoveCallBack); glfwSetScrollCallback(_mainWindow, GLFWEventHandler::onGLFWMouseScrollCallback); glfwSetCharCallback(_mainWindow, GLFWEventHandler::onGLFWCharCallback); glfwSetKeyCallback(_mainWindow, GLFWEventHandler::onGLFWKeyCallback); glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback); glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize); glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback); glfwSetWindowIconifyCallback(_mainWindow, GLFWEventHandler::onGLFWWindowIconifyCallback); setFrameSize(rect.size.width, rect.size.height); // check OpenGL version at first const GLubyte* glVersion = glGetString(GL_VERSION); if ( utils::atof((const char*)glVersion) < 1.5 ) { char strComplain[256] = {0}; sprintf(strComplain, "OpenGL 1.5 or higher is required (your version is %s). Please upgrade the driver of your video card.", glVersion); ccMessageBox(strComplain, "OpenGL version too old"); return false; } initGlew(); // Enable point size by default. glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); return true; }
MillerRender::MillerRender() { gLookAtOther = true; gPosition1 = vec3(-1.5f, 0.0f, 0.0f); // gOrientation1; // Initialise GLFW if( !glfwInit() ) { fprintf( stderr, "Failed to initialize GLFW\n" ); //return -1;exit } glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Open a window and create its OpenGL context window = glfwCreateWindow( 1024, 768, "Tutorial 17 - Rotations", NULL, NULL); if( window == NULL ){ fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" ); glfwTerminate(); // return -1;exit } glfwMakeContextCurrent(window); // Initialize GLEW glewExperimental = true; // Needed for core profile if (glewInit() != GLEW_OK) { fprintf(stderr, "Failed to initialize GLEW\n"); // return -1; exit } //initGL(window); // Initialize the GUI TwInit(TW_OPENGL_CORE, NULL); TwWindowSize(1024, 768); TwBar * EulerGUI = TwNewBar("Euler settings"); // TwBar * QuaternionGUI = TwNewBar("Quaternion settings"); TwSetParam(EulerGUI, NULL, "refresh", TW_PARAM_CSTRING, 1, "0.1"); // TwSetParam(QuaternionGUI, NULL, "position", TW_PARAM_CSTRING, 1, "808 16"); TwAddVarRW(EulerGUI, "Euler X", TW_TYPE_FLOAT, &gOrientation1.x, "step=0.01"); TwAddVarRW(EulerGUI, "Euler Y", TW_TYPE_FLOAT, &gOrientation1.y, "step=0.01"); TwAddVarRW(EulerGUI, "Euler Z", TW_TYPE_FLOAT, &gOrientation1.z, "step=0.01"); TwAddVarRW(EulerGUI, "Pos X" , TW_TYPE_FLOAT, &gPosition1.x, "step=0.1"); TwAddVarRW(EulerGUI, "Pos Y" , TW_TYPE_FLOAT, &gPosition1.y, "step=0.1"); TwAddVarRW(EulerGUI, "Pos Z" , TW_TYPE_FLOAT, &gPosition1.z, "step=0.1"); //TwAddVarRW(QuaternionGUI, "Quaternion", TW_TYPE_QUAT4F, &gOrientation2, "showval=true open=true "); //TwAddVarRW(QuaternionGUI, "Use LookAt", TW_TYPE_BOOL8 , &gLookAtOther, "help='Look at the other monkey ?'"); // Set GLFW event callbacks. I removed glfwSetWindowSizeCallback for conciseness glfwSetMouseButtonCallback(window, (GLFWmousebuttonfun)TwEventMouseButtonGLFW); // - Directly redirect GLFW mouse button events to AntTweakBar glfwSetCursorPosCallback(window, (GLFWcursorposfun)TwEventMousePosGLFW); // - Directly redirect GLFW mouse position events to AntTweakBar glfwSetScrollCallback(window, (GLFWscrollfun)TwEventMouseWheelGLFW); // - Directly redirect GLFW mouse wheel events to AntTweakBar glfwSetKeyCallback(window, (GLFWkeyfun)TwEventKeyGLFW); // - Directly redirect GLFW key events to AntTweakBar glfwSetCharCallback(window, (GLFWcharfun)TwEventCharGLFW); // - Directly redirect GLFW char events to AntTweakBar // Ensure we can capture the escape key being pressed below glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); 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); // Read our .obj file std::vector<unsigned short> indices; std::vector<glm::vec3> indexed_vertices; std::vector<glm::vec2> indexed_uvs; std::vector<glm::vec3> indexed_normals; // load model //char* file = "/home/kaeon/MyProgram/src/rim.stl"; //char* file = "/home/kaeon/MyProgram/src/box.stl"; char* file = "/home/kaeon/MyProgram/OpenGL-33-myproject/src/cube.obj"; //char* file = "/home/kaeon/MyProgram/OpenGL-33-myproject/src/ES4.STL"; //char* file = "/home/kaeon/MyProgram/src/suzanne.obj"; //char* file = "/home/kaeon/MyProgram/src/monkey.obj"; //loadOBJ(file,outIndices,vertexArray,uvArray,normalArray); //bool res = loadAssImp(file, indices, indexed_vertices, indexed_uvs, indexed_normals); loadOBJ(file, indices,indexed_vertices,indexed_uvs,indexed_normals); ChangeVerticesCoord(indexed_vertices); GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); GLuint WP_VertexArrayID; glGenVertexArrays(1, &WP_VertexArrayID); glBindVertexArray(WP_VertexArrayID); // Create and compile our GLSL program from the shaders //GLuint programID = LoadShaders( "/home/kaeon/MyProgram/opengl_test_success/SimpleTransform.vertexshader", "/home/kaeon/MyProgram/opengl_test_success/SingleColor.fragmentshader" ); programID = LoadShaders( "/home/kaeon/MyProgram/OpenGL-33-myproject/src/StandardShading.vertexshader", "/home/kaeon/MyProgram/OpenGL-33-myproject/src/StandardShading.fragmentshader" ); // Get a handle for our "MVP" uniform MatrixID = glGetUniformLocation(programID, "MVP"); ViewMatrixID = glGetUniformLocation(programID, "V"); ModelMatrixID = glGetUniformLocation(programID, "M"); // Load the texture Texture = loadDDS("/home/kaeon/MyProgram/OpenGL-33-myproject/src/uvmap.DDS"); // Get a handle for our "myTextureSampler" uniform TextureID = glGetUniformLocation(programID, "myTextureSampler"); /***==================== My triangle=============================e **/ std::vector<unsigned short> indices2;//(101*101); std::vector<glm::vec3> indexed_vertices2;//(101*101); std::vector<glm::vec2> indexed_uvs2; std::vector<glm::vec3> indexed_normals2; // /* for (int i = 0; i < 101; i++) { for (int j = 0; j < 101; j++) { double z = sin(float(i)/10.0)*sin(float(i)/10.0); indexed_vertices2[i] = glm::vec3( i-50, j-50, z-20.0); } }*/ // CalculateIndices(indices2); // calculate indices //loadOBJ("/home/kaeon/MyProgram/OpenGL-33-myproject/src/ES4.STL", indices2,indexed_vertices2,indexed_uvs2,indexed_normals2); loadOBJ("/home/kaeon/MyProgram/OpenGL-33-myproject/src/cube.obj", indices2,indexed_vertices2,indexed_uvs2,indexed_normals2); ChangeVerticesCoord(indexed_vertices2); /***==================================================================**/ // Load it into a VBO GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); // glBufferData(GL_ARRAY_BUFFER, indexed_vertices.size() * sizeof(glm::vec3), &indexed_vertices[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, (indexed_vertices.size() + indexed_vertices2.size()) * sizeof(glm::vec3), 0, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0 ,indexed_vertices.size()*sizeof(glm::vec3), &indexed_vertices[0] ); glBufferSubData(GL_ARRAY_BUFFER, indexed_vertices.size()*sizeof(glm::vec3), indexed_vertices2.size()*sizeof(glm::vec3), &indexed_vertices2[0]); GLuint uvbuffer; glGenBuffers(1, &uvbuffer); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); //glBufferData(GL_ARRAY_BUFFER, indexed_uvs.size() * sizeof(glm::vec2), &indexed_uvs[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, (indexed_uvs.size()+indexed_uvs2.size() )* sizeof(glm::vec2), 0, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0 ,indexed_uvs.size()*sizeof(glm::vec2), &indexed_uvs[0] ); glBufferSubData(GL_ARRAY_BUFFER, indexed_uvs.size()*sizeof(glm::vec2), indexed_uvs2.size()*sizeof(glm::vec2), &indexed_uvs2[0]); GLuint normalbuffer; glGenBuffers(1, &normalbuffer); glBindBuffer(GL_ARRAY_BUFFER, normalbuffer); //glBufferData(GL_ARRAY_BUFFER, indexed_normals.size() * sizeof(glm::vec3), &indexed_normals[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, (indexed_normals.size()+indexed_normals2.size() )* sizeof(glm::vec3), 0, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0 ,indexed_normals.size()*sizeof(glm::vec3), &indexed_normals[0] ); glBufferSubData(GL_ARRAY_BUFFER, indexed_normals.size()*sizeof(glm::vec3), indexed_normals2.size()*sizeof(glm::vec3), &indexed_normals2[0]); // Generate a buffer for the indices as well GLuint elementbuffer; glGenBuffers(1, &elementbuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer); //glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned short), &indices[0] , GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, (indices.size()+indices2.size() )* sizeof(unsigned short), 0, GL_STATIC_DRAW); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0 ,indices.size()*sizeof(unsigned short), &indices[0] ); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(unsigned short), indices2.size()*sizeof(unsigned short), &indices2[0]); // Get a handle for our "LightPosition" uniform glUseProgram(programID); GLuint LightID = glGetUniformLocation(programID, "LightPosition_worldspace"); // For speed computation double lastTime = glfwGetTime(); double lastFrameTime = lastTime; int nbFrames = 0; std::cout<<"test0"<<std::endl; float tt = 0.0; do{ // Measure speed double currentTime = glfwGetTime(); float deltaTime = (float)(currentTime - lastFrameTime); lastFrameTime = currentTime; nbFrames++; if ( currentTime - lastTime >= 1.0 ){ // If last prinf() was more than 1sec ago // printf and reset printf("%f ms/frame\n", 1000.0/double(nbFrames)); nbFrames = 0; lastTime += 1.0; } // 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]); glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]); glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]); */ glm::mat4 ProjectionMatrix = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 110.0f);// display range glm::mat4 ViewMatrix = glm::lookAt( //glm::vec3( 0, 0, 70 ), // Camera is here glm::vec3( 20,30, 70 ), // Camera is here //glm::vec3(gOrientation1.x,0,0),// and looks here glm::vec3( 0, 0, 0 ), // and looks here //glm::vec3( 0, 1, 0 ) // Head is up (set to 0,-1,0 to look upside-down) glm::vec3( 3, 10, 5 ) // Head is up (set to 0,-1,0 to look upside-down) ); glm::vec3 lightPos = glm::vec3(gPosition1.x,2,10); //glm::vec3 lightPos = glm::vec3(0,2,10); glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z); // 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(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, // attribute 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)0 // array buffer offset ); // 2nd attribute buffer : UVs glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glVertexAttribPointer( 1, // attribute 2, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)0 // array buffer offset ); // 3rd attribute buffer : normals glEnableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, normalbuffer); glVertexAttribPointer( 2, // attribute 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)0 // array buffer offset ); // Index buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer); glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z); { // Euler // As an example, rotate arount the vertical axis at 180\B0/sec /* gOrientation1.z += 3.14159f/2.0f * deltaTime * 5; gOrientation1.x = 3.14159f/2; gPosition1.y = 40; // Build the model matrix glm::mat4 RotationMatrix = eulerAngleYXZ(gOrientation1.y, gOrientation1.x, gOrientation1.z); glm::mat4 TranslationMatrix = translate(mat4(), gPosition1); // A bit to the left glm::mat4 ScalingMatrix = scale(mat4(), vec3(1.0f, 1.0f, 1.0f)); glm::mat4 ModelMatrix = TranslationMatrix * RotationMatrix * ScalingMatrix;*/ gOrientation1.z += 3.14159f/2.0f * deltaTime; gOrientation1.x = 20;3.14159f/2; gPosition1.y = 10; tt = tt + 0.01f; gPosition1.x = 20.0*sin(tt); //gPosition1.z = tt;//20.0*sin(tt); // Build the model matrix glm::mat4 RotationMatrix = eulerAngleYXZ(gOrientation1.y, gOrientation1.x, gOrientation1.z); glm::mat4 TranslationMatrix = translate(mat4(), gPosition1); // A bit to the left glm::mat4 ScalingMatrix = scale(mat4(), vec3(1.0f, 1.0f, 1.0f)); glm::mat4 ModelMatrix = TranslationMatrix * RotationMatrix * ScalingMatrix; // glm::mat4 ModelMatrix = eulerAngleYXZ((float)3,(float)0,(float)0)*translate(mat4(), glm::vec3(5,0,0)) *TranslationMatrix* RotationMatrix * ScalingMatrix; 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]); glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]); glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]); // Draw the triangles ! glDrawElements( GL_TRIANGLES, // mode indices.size(), // count GL_UNSIGNED_SHORT, // type (void*)0 // element array buffer offset ); } //=============================================================================// glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, // attribute 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)(0+indexed_vertices.size()*sizeof(glm::vec3)) // array buffer offset ); // 2nd attribute buffer : UVs glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glVertexAttribPointer( 1, // attribute 2, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)(0+indexed_uvs.size()*sizeof(glm::vec2)) // array buffer offset ); // 3rd attribute buffer : normals glEnableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, normalbuffer); glVertexAttribPointer( 2, // attribute 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)(0+indexed_normals.size()*sizeof(glm::vec3)) // array buffer offset ); // Index buffer glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer); glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z); { // Euler // As an example, rotate arount the vertical axis at 180\B0/sec /* gOrientation1.z += 3.14159f/2.0f * deltaTime * 5; gOrientation1.x = 3.14159f/2; gPosition1.y = 40; // Build the model matrix glm::mat4 RotationMatrix = eulerAngleYXZ(gOrientation1.y, gOrientation1.x, gOrientation1.z); glm::mat4 TranslationMatrix = translate(mat4(), gPosition1); // A bit to the left glm::mat4 ScalingMatrix = scale(mat4(), vec3(1.0f, 1.0f, 1.0f)); glm::mat4 ModelMatrix = TranslationMatrix * RotationMatrix * ScalingMatrix;*/ gOrientation1.z += 3.14159f/2.0f * deltaTime/1000.0; gOrientation1.x = 3.14159f/2; gPosition1.y = 10;40; tt = tt + 0.01f; gPosition1.x = 20.0*sin(tt/100.0); //gPosition1.z = tt;//20.0*sin(tt); // Build the model matrix glm::mat4 RotationMatrix = eulerAngleYXZ(gOrientation1.y, gOrientation1.x, gOrientation1.z); glm::mat4 TranslationMatrix = translate(mat4(), gPosition1); // A bit to the left glm::mat4 ScalingMatrix = scale(mat4(), vec3(1.0f, 1.0f, 1.0f)); glm::mat4 ModelMatrix = TranslationMatrix * RotationMatrix * ScalingMatrix; // glm::mat4 ModelMatrix = eulerAngleYXZ((float)3,(float)0,(float)0)*translate(mat4(), glm::vec3(5,0,0)) *TranslationMatrix* RotationMatrix * ScalingMatrix; 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]); glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]); glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]); // Draw the triangles ! glDrawElements( GL_TRIANGLES, // mode indices2.size(), // count GL_UNSIGNED_SHORT, // type (void*)(0 + indices.size()) // element array buffer offset ); } //======================================================================================// glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); // Draw GUI TwDraw(); // 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); glDeleteBuffers(1, &normalbuffer); glDeleteBuffers(1, &elementbuffer); glDeleteProgram(programID); glDeleteTextures(1, &Texture); glDeleteVertexArrays(1, &VertexArrayID); glDeleteVertexArrays(1, &WP_VertexArrayID); }
/** main */ int main() { // GLFW and GLEW initialization glfwInit(); // Core profile glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Window creation pWindow = glfwCreateWindow(1280, 720, "PerVoxelRaycaster", NULL, NULL); if (!pWindow) { glfwTerminate(); exit(EXIT_FAILURE); } glfwMakeContextCurrent(pWindow); ogl_LoadFunctions(); glfwSetCursorPosCallback(pWindow, cursorCallback); glfwSetMouseButtonCallback(pWindow, buttonsCallback); glfwSetScrollCallback(pWindow, scrollCallback); // OpenGL initialization glEnable(GL_DEPTH_TEST); glClearColor(0.0f, 0.0f, 0.0f, 1); // Setup shader // ### CHOOSE FROM ONE OF THESE THREE SHADERS ### //shader.loadShaders("Raycaster.vert", "SimpleRaycaster.frag"); //shader.loadShaders("Raycaster.vert", "SimplePerVoxelRaycaster.frag"); shader.loadShaders("Raycaster.vert", "PerVoxelRaycaster.frag"); shader.setVertexBuffer(cube::vertices, sizeof(cube::vertices), "positionAttribute"); uniformModelHandle= shader.getUniformHandle("uniformModel"); uniformViewHandle= shader.getUniformHandle("uniformView"); uniformProjectionHandle = shader.getUniformHandle("uniformProjection"); uniformCameraPositionHandle= shader.getUniformHandle("uniformCameraPosition"); uniformVolumeHandle= shader.getUniformHandle("uniformVolume"); uniformTransferfunctionHandle= shader.getUniformHandle("uniformTransferfunction"); shader.use(); // Initialize camera camera.init(glm::vec3(0.5f), glm::radians(-135.0f), glm::radians(80.0f), 2, 0.5f, 5); // Other initializations prevCursorX = cursorX; prevCursorY = cursorY; // Read volume const GLuint volumeX = 256; const GLuint volumeY = 256; const GLuint volumeZ = 256; GLuint voxelCount = volumeX * volumeY * volumeZ; GLubyte* volumeData = new GLubyte[voxelCount]; std::ifstream rawDataFile(std::string(RESOURCES_PATH) + "/bonsai.raw", std::ios::in|std::ios::binary); rawDataFile.read((GLchar*)volumeData, static_cast<GLuint>(voxelCount) * sizeof(GLubyte)); // Create volume 3D texture glGenTextures(1, &uniformVolume); glBindTexture(GL_TEXTURE_3D, uniformVolume); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, volumeX, volumeY, volumeZ, 0, GL_RED, GL_UNSIGNED_BYTE, volumeData); glBindTexture(GL_TEXTURE_3D, 0); delete[] volumeData; // Set volume in shader shader.setUniformTexture(uniformVolumeHandle, uniformVolume, GL_TEXTURE_3D); // Read transfer function std::vector<GLubyte> transferfunction; unsigned long transferfunctionX; unsigned long transferfunctionY; std::ifstream in(std::string(std::string(RESOURCES_PATH) + "/Transferfunction.png").c_str(), std::ios::in|std::ios::binary); in.seekg(0, std::ios::end); std::streamsize size = in.tellg(); in.seekg(0, std::ios::beg); std::vector<GLchar> buffer(static_cast<GLuint>(size)); in.read(&(buffer[0]), static_cast<size_t>(size)); in.close(); decodePNG(transferfunction, transferfunctionX, transferfunctionY, reinterpret_cast<GLubyte*>(&(buffer[0])), static_cast<size_t>(size), GL_FALSE); // Create transfer function 1D texture glGenTextures(1, &uniformTransferfunction); glBindTexture(GL_TEXTURE_1D, uniformTransferfunction); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, transferfunctionX, 0, GL_RGBA, GL_UNSIGNED_BYTE, &transferfunction[0]); glBindTexture(GL_TEXTURE_1D, 0); // Set transfer function in shader shader.setUniformTexture(uniformTransferfunctionHandle, uniformTransferfunction, GL_TEXTURE_1D); // Loop while(!glfwWindowShouldClose(pWindow)) { // Clear buffers glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Get window resolution GLint width, height; glfwGetWindowSize(pWindow, &width, &height); // Give OpenGL the window resolution if(width != prevWidth || height != prevHeight) { glViewport(0, 0, width, height); prevWidth = width; prevHeight = height; } // Calc time per frame GLfloat currentTime = (GLfloat)glfwGetTime(); deltaTime = currentTime - prevTime; prevTime = currentTime; std::cout << 1.0f / deltaTime << std::endl; // Calculate cursor movement cursorDeltaX = cursorX - prevCursorX; cursorDeltaY = cursorY - prevCursorY; prevCursorX = cursorX; prevCursorY = cursorY; // Model matrix uniformModel = glm::mat4(1.0f); // View matrix if(buttonPressed) { camera.setAlpha(camera.getAlpha() + 0.005f * cursorDeltaX); camera.setBeta(camera.getBeta() - 0.005f * cursorDeltaY); } uniformView = camera.getViewMatrix(); // Projection matrix uniformProjection = glm::perspective(glm::radians(30.f), ((GLfloat)width/(GLfloat)height), 0.1f, 100.f); // Set updated uniforms in shader shader.setUniformValue(uniformModelHandle, uniformModel); shader.setUniformValue(uniformViewHandle, uniformView); shader.setUniformValue(uniformProjectionHandle, uniformProjection); shader.setUniformValue(uniformCameraPositionHandle, camera.getPosition()); // Draw cube shader.draw(GL_TRIANGLES); // GLFW updates glfwSwapBuffers(pWindow); glfwPollEvents(); } // Clean up glfwDestroyWindow(pWindow); glfwTerminate(); return 0; }
int main(void) { Context ctx; // Create a GLFW window glfwSetErrorCallback(errorCallback); glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); ctx.width = 800; ctx.height = 600; ctx.aspect = float(ctx.width) / float(ctx.height); ctx.window = glfwCreateWindow(ctx.width, ctx.height, "Model viewer", nullptr, nullptr); glfwMakeContextCurrent(ctx.window); glfwSetWindowUserPointer(ctx.window, &ctx); glfwSetKeyCallback(ctx.window, keyCallback); glfwSetMouseButtonCallback(ctx.window, mouseButtonCallback); glfwSetCursorPosCallback(ctx.window, cursorPosCallback); glfwSetScrollCallback(ctx.window, scrollCallback); glfwSetFramebufferSizeCallback(ctx.window, resizeCallback); // Load OpenGL functions glewExperimental = true; GLenum status = glewInit(); if (status != GLEW_OK) { std::cerr << "Error: " << glewGetErrorString(status) << std::endl; std::exit(EXIT_FAILURE); } std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl; // Initialize AntTweakBar (if enabled) #ifdef WITH_TWEAKBAR TwInit(TW_OPENGL_CORE, nullptr); TwWindowSize(ctx.width, ctx.height); TwBar *tweakbar = TwNewBar("Settings"); TwDefine("Settings size='300 500'"); TwDefine("Settings refresh=0.1"); TwDefine("Settings valueswidth=fit"); TwEnumVal lensEV[] = { {ORTOGRAPHIC, "Orthographic"}, {PERSPECTIVE, "Perspective"} }; TwType lensType = TwDefineEnum("LensType", lensEV, 2); TwAddVarRW(tweakbar, "Lens / Projection", lensType, &ctx.lensType, NULL); TwAddSeparator(tweakbar, NULL, NULL); TwAddVarRW(tweakbar, "Background color", TW_TYPE_COLOR3F, &ctx.background_color[0], "colormode=hls"); TwAddSeparator(tweakbar, NULL, NULL); TwAddVarRW(tweakbar, "Ambient light color", TW_TYPE_COLOR3F, &ctx.ambient_light[0], "colormode=hls"); TwAddVarRW(tweakbar, "Point light color", TW_TYPE_COLOR3F, &ctx.light_color[0], "colormode=hls"); TwAddVarRW(tweakbar, "Point light position", TW_TYPE_DIR3F, &ctx.light_position[0], NULL); //TwAddVarRW(tweakbar, "Point light x", TW_TYPE_FLOAT, &ctx.light_position[0], NULL); //TwAddVarRW(tweakbar, "Point light y", TW_TYPE_FLOAT, &ctx.light_position[1], NULL); //TwAddVarRW(tweakbar, "Point light z", TW_TYPE_FLOAT, &ctx.light_position[2], NULL); TwAddSeparator(tweakbar, NULL, NULL); TwAddVarRW(tweakbar, "Material diffuse color", TW_TYPE_COLOR3F, &ctx.diffuse_color[0], "colormode=hls"); TwAddVarRW(tweakbar, "Material specular color", TW_TYPE_COLOR3F, &ctx.specular_color[0], "colormode=hls"); TwAddVarRW(tweakbar, "Material specular power", TW_TYPE_FLOAT, &ctx.specular_power, NULL); TwAddSeparator(tweakbar, NULL, NULL); TwEnumVal colorModeEV[] = { {NORMAL_AS_RGB, "Normal as RGB"}, {BLINN_PHONG, "Blinn-Phong"}, {REFLECTION, "Reflection"} }; TwType colorModeType = TwDefineEnum("ColorMode", colorModeEV, ColorMode::SIZE); TwAddVarRW(tweakbar, "Color mode", colorModeType, &ctx.color_mode, NULL); TwAddVarRW(tweakbar, "Use gamma correction", TW_TYPE_BOOL32, &ctx.use_gamma_correction, NULL); TwAddVarRW(tweakbar, "Use color inversion", TW_TYPE_BOOL32, &ctx.use_color_inversion, NULL); TwAddSeparator(tweakbar, NULL, NULL); TwAddVarRW(tweakbar, "Ambient weight", TW_TYPE_FLOAT, &ctx.ambient_weight, NULL); TwAddVarRW(tweakbar, "Diffuse weight", TW_TYPE_FLOAT, &ctx.diffuse_weight, NULL); TwAddVarRW(tweakbar, "Specular weight", TW_TYPE_FLOAT, &ctx.specular_weight, NULL); #endif // WITH_TWEAKBAR // Initialize rendering glGenVertexArrays(1, &ctx.defaultVAO); glBindVertexArray(ctx.defaultVAO); glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); init(ctx); // Start rendering loop while (!glfwWindowShouldClose(ctx.window)) { glfwPollEvents(); ctx.elapsed_time = glfwGetTime(); display(ctx); #ifdef WITH_TWEAKBAR TwDraw(); #endif // WITH_TWEAKBAR glfwSwapBuffers(ctx.window); } // Shutdown #ifdef WITH_TWEAKBAR TwTerminate(); #endif // WITH_TWEAKBAR glfwDestroyWindow(ctx.window); glfwTerminate(); std::exit(EXIT_SUCCESS); }
int main() { // msaa glfwWindowHint(GLFW_SAMPLES, 4); GLFWwindow * window = initWindow(windowWidth, windowHeight); if (!window) { glfwTerminate(); return -1; } glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, cursor_callback); glfwSetScrollCallback(window, scroll_callback); glEnable(GL_DEPTH_TEST); // prepare texture loading library(devil) init_texture_loading(); //plane Shader simpleDepthShader("data/shaders/shadow_mapping_depth.vs", "data/shaders/shadow_mapping_depth.frag"); Model ourModel("data/models/nanosuit/nanosuit.obj"); GLfloat planeVertices[] = { // Positions // Normals // Texture Coords 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, -2.0f, 0.0f, -2.0f, 0.0f, 1.0f, 0.0f, 0.0f, 2.0f, -2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 2.0f, 0.0f, -2.0f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, -2.0f, 0.0f, -2.0f, 0.0f, 1.0f, 0.0f, 0.0f, 2.0f }; // Setup plane VAO xzhs GLuint planeVBO; GLuint woodTexture; GLuint rockTexture; glGenVertexArrays(1, &planeVAO); glGenBuffers(1, &planeVBO); glBindVertexArray(planeVAO); glBindBuffer(GL_ARRAY_BUFFER, planeVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(planeVertices), &planeVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); glBindVertexArray(0); // Load textures woodTexture = load_texture("data/textures/wood.png"); rockTexture = load_texture("data/textures/rock.jpg"); // Configure depth map FBO const GLuint SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; GLuint depthMapFBO; glGenFramebuffers(1, &depthMapFBO); // - Create depth texture GLuint depthMap; glGenTextures(1, &depthMap); glBindTexture(GL_TEXTURE_2D, depthMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); GLfloat borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0); glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); //xzhe Shader shaders("data/shaders/shader.vert", "data/shaders/shader.frag"); Shader colorShaders("data/shaders/shaderColorUniform.vert", "data/shaders/shaderColorUniform.frag"); Shader domeShaders("data/shaders/dome.vert", "data/shaders/dome.frag"); Shader lightShaders("data/shaders/lightShader.vert", "data/shaders/lightShader.frag"); Shader spriteShaders("data/shaders/spriteShader.vert", "data/shaders/spriteShader.frag"); Shader starShaders("data/shaders/spriteShader.vert", "data/shaders/stars.frag"); std::cout << "Loading models..." << std::endl; Model dome("data/models/geodesic_dome.obj"); Model landscape("data/models/landscape.obj"); std::cout << "Models loaded!" << std::endl; std::cout << "Loading extra textures..." << std::endl; GLuint domeColor = load_texture("data/textures/sky.png", true, GL_MIRRORED_REPEAT, GL_MIRRORED_REPEAT); GLuint domeGlow = load_texture("data/textures/glow.png", true, GL_MIRRORED_REPEAT, GL_MIRRORED_REPEAT); Sprite sun("data/textures/sun.png"); Sprite moon("data/textures/moon.png"); Sprite star("data/textures/star.png"); // enable blending! glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // enable msaa(multisample anti-aliasing) glEnable(GL_MULTISAMPLE); std::vector<glm::mat4> starModels(256); for (auto& m : starModels) { m = glm::rotate(m, glm::radians(rand_rotate()), glm::vec3(1.0f, 0.0f, 0.0f)); m = glm::rotate(m, glm::radians(rand_rotate()), glm::vec3(0.0f, 1.0f, 0.0f)); m = glm::rotate(m, glm::radians(rand_rotate()), glm::vec3(0.0f, 0.0f, 1.0f)); m = glm::translate(m, glm::vec3(5.0f, 0.0f, 0.0f)); m = glm::rotate(m, glm::radians(rand_rotate()), glm::vec3(1.0f, 0.0f, 0.0f)); m = glm::rotate(m, glm::radians(rand_rotate()), glm::vec3(0.0f, 1.0f, 0.0f)); } double last_frame = glfwGetTime(); while (!glfwWindowShouldClose(window)) { double current_frame = glfwGetTime(); double delta_time = current_frame - last_frame; last_frame = current_frame; glfwPollEvents(); do_movement(delta_time); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glViewport(0, 0, windowWidth, windowHeight); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)windowWidth / (float)windowHeight, 0.1f, 100.0f); glm::mat4 view = camera.GetViewMatrix(); // sun float sunAngle = current_frame * 30.0f; glm::mat4 sunModel; sunModel = glm::rotate(sunModel, glm::radians(sunAngle), glm::vec3(0.0f, 0.0f, 1.0f)); sunModel = glm::translate(sunModel, glm::vec3(3.5f, 0.0f, 0.0f)); glm::vec3 sunPos = glm::vec3(sunModel * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); // moon float moonAngle = sunAngle + 180.0f; glm::mat4 moonModel; moonModel = glm::rotate(moonModel, glm::radians(moonAngle), glm::vec3(0.0f, 0.0f, 1.0f)); moonModel = glm::translate(moonModel, glm::vec3(3.5f, 0.0f, 0.0f)); // directional light DirLight dirLight(-sunPos, glm::vec3(0.8f, 0.8f, 0.8f)); // point light GLfloat light_pos_angle = glm::radians(60.0f * current_frame); glm::vec3 light_pos(1.2f + sin(light_pos_angle), 0.0f, 2.0f + cos(light_pos_angle)); glm::vec3 lightColor(1.0f, 1.0f, 1.0f); lightColor.r = sin(current_frame * 2.0f); lightColor.g = sin(current_frame * 0.7f); lightColor.b = sin(current_frame * 1.3f); PointLight pointLight(light_pos, lightColor * 0.5f); // spot light SpotLight spotLight(camera.Position, camera.Front, glm::vec3((GLfloat)flash_light_on)); shaders.Use(); shaders.SetUniform("view", view); shaders.SetUniform("projection", projection); shaders.SetUniform("ViewPos", camera.Position); dirLight.SetUniforms(shaders, "dirLight"); pointLight.SetUniforms(shaders, "pointLights[0]"); shaders.SetUniform("pointLightCount", 0); spotLight.SetUniforms(shaders, "spotLight"); shaders.SetUniform("material.shininess", 16.0f); colorShaders.Use(); colorShaders.SetUniform("view", view); colorShaders.SetUniform("projection", projection); colorShaders.SetUniform("ViewPos", camera.Position); dirLight.SetUniforms(colorShaders, "dirLight"); //pointLight.SetUniforms(colorShaders, "pointLights[0]"); colorShaders.SetUniform("pointLightCount", 0); spotLight.SetUniforms(colorShaders, "spotLight"); colorShaders.SetUniform("material.shininess", 1.8f); // make the dome and landscape pinned glm::mat4 pinnedView = glm::lookAt(glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f) + camera.Front, glm::vec3(0.0f, 1.0f, 0.0f)); if (enable_stars) { // stars starShaders.Use(); starShaders.SetUniform("view", view); starShaders.SetUniform("projection", projection); starShaders.SetUniform("groundBases[0]", 1.0f, 0.0f, 0.0f); starShaders.SetUniform("groundBases[1]", 0.0f, 0.0f, 1.0f); starShaders.SetUniform("groundUp", 0.0f, 1.0f, 0.0f); starShaders.SetUniform("sunPos", sunPos); for (const auto& m : starModels) { glm::mat4 model = glm::rotate(glm::mat4(), glm::radians(sunAngle), glm::vec3(0.0f, 0.0f, 1.0f)) * m; starShaders.SetUniform("model", model); star.Draw(starShaders); } } colorShaders.Use(); glm::mat4 lmodel; lmodel = glm::scale(lmodel, glm::vec3(3.0f, 3.0f, 3.0f)); lmodel = glm::translate(lmodel, glm::vec3(0.0f, 0.1f, 0.0f)); lmodel = glm::rotate(lmodel, glm::radians(30.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat3 normalMatrix = glm::mat3(glm::transpose(glm::inverse(lmodel))); colorShaders.SetUniform("view", view); colorShaders.SetUniform("model", lmodel); colorShaders.SetUniform("normalMatrix", normalMatrix); colorShaders.SetUniform("Color", glm::vec4(0.93f, 0.79f, 0.69f, 1.0f)); landscape.Draw(colorShaders, false); domeShaders.Use(); domeShaders.SetUniform("view", view); domeShaders.SetUniform("projection", projection); glActiveTexture(GL_TEXTURE7); glBindTexture(GL_TEXTURE_2D, domeColor); glActiveTexture(GL_TEXTURE8); glBindTexture(GL_TEXTURE_2D, domeGlow); domeShaders.SetUniform("domeColor", 7); domeShaders.SetUniform("glow", 8); glm::mat4 dmodel; dmodel = glm::scale(dmodel, glm::vec3(4.0f, 4.0f, 4.0f)); domeShaders.SetUniform("model", dmodel); domeShaders.SetUniform("sunPos", sunPos); dome.Draw(domeShaders, false); // cheating billboarding to make the sun and moon always face the camera glm::mat4 sunModelView = view * sunModel; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) sunModelView[i][j] = (GLfloat)(i == j); sunModelView = glm::scale(sunModelView, glm::vec3(0.5f, 0.5f, 0.5f)); glm::mat4 moonModelView = view * moonModel; for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) moonModelView[i][j] = (GLfloat)(i == j); moonModelView = glm::scale(moonModelView, glm::vec3(0.5f, 0.5f, 0.5f)); spriteShaders.Use(); spriteShaders.SetUniform("view", glm::mat4()); spriteShaders.SetUniform("projection", projection); spriteShaders.SetUniform("model", sunModelView); sun.Draw(spriteShaders); spriteShaders.SetUniform("model", moonModelView); moon.Draw(spriteShaders); //xzhs // Set texture samples shaders.Use(); glActiveTexture(GL_TEXTURE13); glBindTexture(GL_TEXTURE_2D, woodTexture); glActiveTexture(GL_TEXTURE14); glBindTexture(GL_TEXTURE_2D, rockTexture); glActiveTexture(GL_TEXTURE15); glBindTexture(GL_TEXTURE_2D, depthMap); shaders.SetUniform("material.texture_diffuse1", 14); shaders.SetUniform("material.texture_specular1", 14); shaders.SetUniform("shadowMap", 15); // 1. Render depth of scene to texture (from light's perspective) // - Get light projection/view matrix. glm::mat4 lightProjection, lightView; glm::mat4 lightSpaceMatrix; GLfloat near_plane = 1.0f, far_plane = 7.5f; lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane); lightView = glm::lookAt(sunPos, glm::vec3(0.0f), glm::vec3(1.0)); lightSpaceMatrix = lightProjection * lightView; // - now render scene from light's point of view simpleDepthShader.Use(); simpleDepthShader.SetUniform("lightSpaceMatrix", lightSpaceMatrix); glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glClear(GL_DEPTH_BUFFER_BIT); RenderFloor(simpleDepthShader); RenderCubes(simpleDepthShader); glm::mat4 nmodel; nmodel = glm::translate(nmodel, glm::vec3(0.1f, 0.3f, -0.5f)); nmodel = glm::rotate(nmodel, glm::radians(70.0f), glm::vec3(0.0f, 1.0f, 0.0f)); nmodel = glm::scale(nmodel, glm::vec3(0.05f, 0.05f, 0.05f)); simpleDepthShader.SetUniform("model", nmodel); ourModel.Draw(simpleDepthShader); glBindFramebuffer(GL_FRAMEBUFFER, 0); // 2. Render scene as normal glViewport(0, 0, windowWidth, windowHeight); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaders.Use(); shaders.SetUniform("projection", projection); shaders.SetUniform("view", view); shaders.SetUniform("ViewPos", camera.Position); // Set light uniforms // PointLight sunPointLight(sunPos, glm::vec3(0.02f, 0.02f, 0.02f), glm::vec3(1.0f, 1.0f, 1.0f), glm::vec3(0.5f, 0.5f, 0.5f)); // sunPointLight.SetUniforms(shaders, "pointLights[0]"); // shaders.SetUniform("pointLightCount", 0); dirLight.SetUniforms(shaders, "dirLight"); shaders.SetUniform("pointLightCount", 0); shaders.SetUniform("lightSpaceMatrix", lightSpaceMatrix); shaders.SetUniform("material.texture_diffuse1", 14); shaders.SetUniform("material.texture_specular1", 14); shaders.SetUniform("shadowMap", 15); RenderFloor(shaders); shaders.SetUniform("material.texture_diffuse1", 13); shaders.SetUniform("material.texture_specular1", 13); RenderCubes(shaders); shaders.SetUniform("model", nmodel); ourModel.Draw(shaders); //xzhe glfwSwapBuffers(window); } glfwTerminate(); return 0; }
void Camera::Input(GLFWwindow *window, float speed, float deltaTime) { glfwSetScrollCallback(window, scrollFunc); /*if (glfwGetKey(window,GLFW_KEY_LEFT) == GLFW_PRESS) { worldTransform[3].xyz += -1 * worldTransform[0].xyz * speed * deltaTime; } if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) { worldTransform[3].xyz += worldTransform[0].xyz * speed * deltaTime; } if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { worldTransform[3].xyz += worldTransform[1].xyz * speed * deltaTime; } if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) { worldTransform[3].xyz -= worldTransform[1].xyz *speed * deltaTime; }*/ if ( Y_SCROLL == -1) { worldTransform[3].xyz += worldTransform[2].xyz * speed * deltaTime * 100; Y_SCROLL = 0; } if ( Y_SCROLL == 1) { worldTransform[3].xyz -= worldTransform[2].xyz * speed * deltaTime * 100; Y_SCROLL = 0; } glfwGetCursorPos(window, ¤tXCursor, ¤tYCursor); deltaXCursor = currentXCursor - lastXCursor; deltaYCursor = currentYCursor - lastYCursor; lastXCursor = currentXCursor; lastYCursor = currentYCursor; // scrollbar click if (glfwGetMouseButton(window, 2)) { if (deltaXCursor > 0) { worldTransform[3] -= worldTransform[0] * speed * deltaXCursor * deltaTime; } if (deltaXCursor < 0) { worldTransform[3] += worldTransform[0] * speed * -deltaXCursor * deltaTime; } if (deltaYCursor < 0) { worldTransform[3] -= worldTransform[1] * speed * -deltaYCursor * deltaTime; } if (deltaYCursor > 0) { worldTransform[3] += worldTransform[1] * speed * deltaYCursor * deltaTime; } } // right click if (glfwGetMouseButton(window, 1)) { if (deltaXCursor > 0) { //worldTransform = rotate((double)deltaXCursor, vec3(0, 1, 0)); //worldTransform = rotate(worldTransform, 10, vec3(0, 1, 0)); //worldTransform = rotateX(glm::vec3(worldTransform[3].xyz), (const double) deltaXCursor); } if (deltaXCursor < 0) { //worldTransform[0] += worldTransform[0] * speed * -deltaXCursor * deltaTime; } if (deltaYCursor < 0) { //worldTransform[2] -= worldTransform[1] * speed * -deltaYCursor * deltaTime; } if (deltaYCursor > 0) { //worldTransform[2] += worldTransform[1] * speed * deltaYCursor * deltaTime; } } }
bool CrossDelegate::performInit() { if (!initialized_) { if (glfwInit()) { glfwWindowHint(GLFW_SAMPLES, initInfo.windowInfo.aaSamples); glfwWindowHint(GLFW_DEPTH_BITS, initInfo.windowInfo.depthBits); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); // --- int targetWidth; int targetHeight; if (initInfo.windowInfo.size.x * initInfo.windowInfo.size.y == 0) { GLFWmonitor* monitor = glfwGetPrimaryMonitor(); if (monitor) { const GLFWvidmode *mode = glfwGetVideoMode(monitor); targetWidth = mode->width; targetHeight = mode->height; glfwWindowHint(GLFW_RED_BITS, mode->redBits); glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits); glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits); glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate); window = glfwCreateWindow(targetWidth, targetHeight, "", monitor, NULL); } } else { targetWidth = initInfo.windowInfo.width; targetHeight = initInfo.windowInfo.height; window = glfwCreateWindow(targetWidth, targetHeight, "", NULL, NULL); } if (window) { setupInfo.windowInfo = WindowInfo(targetWidth, targetHeight, initInfo.windowInfo.aaSamples, initInfo.windowInfo.depthBits); glfwSetCursorPosCallback(window, cursorPosCallback); glfwSetMouseButtonCallback(window, mouseButtonCallback); glfwSetKeyCallback(window, keyCallback); glfwSetCharCallback(window, characterCallback); glfwSetScrollCallback(window, scrollCallback); glfwSwapInterval(1); glfwMakeContextCurrent(window); gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); // --- intern::instance = this; initialized_ = _init(); } } } return initialized_; }
void MouseInput::Initiate() { GLFWwindow *window = static_cast<GLFWwindow*>(windowHandle); glfwSetScrollCallback(window,scroll); }
int main(int argc, char** argv) { if (!glfwInit()) // 初始化glfw库 { std::cout << "Error::GLFW could not initialize GLFW!" << std::endl; return -1; } // 开启OpenGL 3.3 core profile std::cout << "Start OpenGL core profile version 3.3" << std::endl; 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(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo of geometry shader", NULL, NULL); if (!window) { std::cout << "Error::GLFW could not create winddow!" << std::endl; glfwTerminate(); std::system("pause"); return -1; } // 创建的窗口的context指定为当前context glfwMakeContextCurrent(window); // 注册窗口键盘事件回调函数 glfwSetKeyCallback(window, key_callback); // 注册鼠标事件回调函数 glfwSetCursorPosCallback(window, mouse_move_callback); // 注册鼠标滚轮事件回调函数 glfwSetScrollCallback(window, mouse_scroll_callback); // 鼠标捕获 停留在程序内 glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // 初始化GLEW 获取OpenGL函数 glewExperimental = GL_TRUE; // 让glew获取所有拓展函数 GLenum status = glewInit(); if (status != GLEW_OK) { std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION) << " error string:" << glewGetErrorString(status) << std::endl; glfwTerminate(); std::system("pause"); return -1; } // 设置视口参数 glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); //Section1 顶点属性数据 // 指定顶点属性数据 顶点位置 GLfloat points[] = { -0.5f, 0.5f, // 左上 0.5f, 0.5f, // 右上 0.5f, -0.5f, // 右下 -0.5f, -0.5f // 左下 }; // Section2 准备缓存对象 GLuint pointVAOId, pointVBOId; glGenVertexArrays(1, &pointVAOId); glGenBuffers(1, &pointVBOId); glBindVertexArray(pointVAOId); glBindBuffer(GL_ARRAY_BUFFER, pointVBOId); glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); // 顶点位置数据 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GL_FLOAT), (GLvoid*)0); glEnableVertexAttribArray(0); glBindVertexArray(0); // Section3 准备着色器程序 Shader shader("scene.vertex", "scene.frag", "scene.gs"); // 添加了几何着色器 glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glDepthFunc(GL_LESS); glEnable(GL_PROGRAM_POINT_SIZE); // 启用在顶点着色器中指定点的大小 // 开始游戏主循环 while (!glfwWindowShouldClose(window)) { GLfloat currentFrame = (GLfloat)glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; glfwPollEvents(); // 处理例如鼠标 键盘等事件 do_movement(); // 根据用户操作情况 更新相机属性 // 设置colorBuffer颜色 glClearColor(0.18f, 0.04f, 0.14f, 1.0f); // 清除colorBuffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 先绘制场景 演示几何着色器时 暂不使用MVP矩阵了 shader.use(); glBindVertexArray(pointVAOId); glDrawArrays(GL_POINTS, 0, 4); glBindVertexArray(0); glUseProgram(0); glfwSwapBuffers(window); // 交换缓存 } // 释放资源 glDeleteVertexArrays(1, &pointVAOId); glDeleteBuffers(1, &pointVBOId); glfwTerminate(); return 0; }
void GlfwWindow::open() { glfwSetErrorCallback(error_callback); int monitor_count(0); auto monitors(glfwGetMonitors(&monitor_count)); if (monitor_count == 0) { Logger::LOG_WARNING << "Failed to open GlfwWindow: No monitor found!" << std::endl; glfwTerminate(); return; } if (config.monitor() >= monitor_count) { Logger::LOG_WARNING << "Failed to open GlfwWindow: There is no monitor with the number " << config.monitor() << "!" << std::endl; glfwTerminate(); return; } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, config.get_debug()); if (config.get_stereo_mode() == StereoMode::QUAD_BUFFERED) { glfwWindowHint(GLFW_STEREO, GL_TRUE); } glfw_window_ = glfwCreateWindow( config.get_size().x, config.get_size().y, config.get_title().c_str(), config.get_fullscreen_mode()? glfwGetPrimaryMonitor(): nullptr, nullptr ); if (!glfw_window_) { throw std::runtime_error("GlfwWindow::open() : unable to create window"); } glfwSetWindowUserPointer(glfw_window_, this); glfwSetWindowSizeCallback(glfw_window_, &on_window_resize); glfwSetKeyCallback( glfw_window_, &on_window_key_press); glfwSetCharCallback( glfw_window_, &on_window_char); glfwSetMouseButtonCallback( glfw_window_, &on_window_button_press); glfwSetCursorPosCallback( glfw_window_, &on_window_move_cursor); glfwSetScrollCallback( glfw_window_, &on_window_scroll); glfwSetCursorEnterCallback( glfw_window_, &on_window_enter); switch(cursor_mode_) { case CursorMode::NORMAL: glfwSetInputMode(glfw_window_, GLFW_CURSOR, GLFW_CURSOR_NORMAL); break; case CursorMode::HIDDEN: glfwSetInputMode(glfw_window_, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); break; case CursorMode::DISABLED: glfwSetInputMode(glfw_window_, GLFW_CURSOR, GLFW_CURSOR_DISABLED); break; } if (!glfw_window_) { Logger::LOG_WARNING << "Failed to open GlfwWindow: Could not create glfw3 window!" << std::endl; glfwTerminate(); return; } }
int main(int argc,char**argv) { double atStart,now,remain; /// Initialize GLFW glfwInit(); // Open registers OpenGL window if( !(windows[REGISTER_WINDOW]=glfwCreateWindow( REGISTER_WIDTH, REGISTER_HEIGHT, "cpu",NULL,NULL)) ) { glfwTerminate(); return 1; } glfwSetWindowPos(windows[REGISTER_WINDOW],600,740); glfwMakeContextCurrent(windows[REGISTER_WINDOW]); setupGL(REGISTER_WINDOW,REGISTER_WIDTH,REGISTER_HEIGHT); // Open timing OpenGL window if( !(windows[TIMING_WINDOW]=glfwCreateWindow( TIMING_WIDTH, TIMING_HEIGHT, "timing",NULL,NULL)) ) { glfwTerminate(); return 1; } glfwSetWindowPos(windows[TIMING_WINDOW],600,300); glfwMakeContextCurrent(windows[TIMING_WINDOW]); setupGL(TIMING_WINDOW,TIMING_WIDTH,TIMING_HEIGHT); // Open invaders OpenGL window if( !(windows[MAIN_WINDOW]=glfwCreateWindow( WIDTH, HEIGHT, "invaders",NULL,NULL)) ) { glfwTerminate(); return 1; } glfwSetWindowPos(windows[MAIN_WINDOW],300,300); glfwMakeContextCurrent(windows[MAIN_WINDOW]); setupGL(MAIN_WINDOW,WIDTH,HEIGHT); glfwSwapInterval(0); // Disable VSYNC glfwSetKeyCallback(windows[MAIN_WINDOW],kbHandler); glfwSetScrollCallback(windows[TIMING_WINDOW],mwHandler); atStart=glfwGetTime(); ////////////////// if (InitialiseMemory()) return -1; PinSetRESET(1); PIN_BUFFER_RESET=1; PinSetO1(1); // Run with reset high for a few cycles to perform a full cpu reset PinSetO1(0); PinSetO2(1); PinSetO2(0); PinSetO1(1); PinSetO1(0); PinSetO2(1); PinSetO2(0); PinSetO1(1); PinSetO1(0); PinSetO2(1); PinSetO2(0); PinSetRESET(0); // RESET CPU PIN_BUFFER_RESET=0; //dumpInstruction=100000; int stopTheClock=0; while (!glfwGetKey(windows[MAIN_WINDOW],GLFW_KEY_ESCAPE)) { if (!stopTheClock) { masterClock++; if ((masterClock%4)==0) pixelClock++; if ((masterClock%10)==0) { // I8080 emulation works off positive edge trigger. So we need to supply the same sort of // clock. PIN_BUFFER_O2=0; PIN_BUFFER_O1=1; PinSetO1(1); // Execute a cpu step if (bTimingEnabled) RecordPins(); PIN_BUFFER_O1=0; PinSetO1(0); if (bTimingEnabled) RecordPins(); PIN_BUFFER_O2=1; PinSetO2(1); if (bTimingEnabled) RecordPins(); PIN_BUFFER_O2=0; PinSetO2(0); if (!MEM_Handler()) { stopTheClock=1; } if (bTimingEnabled) RecordPins(); PinSetINT(0); // clear interrupt state PIN_BUFFER_INT=0; cpuClock++; } if (pixelClock==30432+10161) // Based on 19968000 Mhz master clock + mame notes { NEXTINT=0xCF; PinSetINT(1); PIN_BUFFER_INT=1; } if (pixelClock==71008+10161) { NEXTINT=0xD7; PinSetINT(1); PIN_BUFFER_INT=1; } } if (pixelClock>=83200 || stopTheClock) { if (pixelClock>=83200) pixelClock=0; if (glfwWindowShouldClose(windows[TIMING_WINDOW])) { bTimingEnabled=0; glfwHideWindow(windows[TIMING_WINDOW]); } if (glfwWindowShouldClose(windows[REGISTER_WINDOW])) { bRegisterEnabled=0; glfwHideWindow(windows[REGISTER_WINDOW]); } glfwMakeContextCurrent(windows[MAIN_WINDOW]); ShowScreen(MAIN_WINDOW,WIDTH,HEIGHT); glfwSwapBuffers(windows[MAIN_WINDOW]); if (bTimingEnabled) { glfwMakeContextCurrent(windows[TIMING_WINDOW]); DrawTiming(videoMemory[TIMING_WINDOW],TIMING_WIDTH); ShowScreen(TIMING_WINDOW,TIMING_WIDTH,TIMING_HEIGHT); glfwSwapBuffers(windows[TIMING_WINDOW]); } if (bRegisterEnabled) { glfwMakeContextCurrent(windows[REGISTER_WINDOW]); DrawRegister(videoMemory[REGISTER_WINDOW],REGISTER_WIDTH); ShowScreen(REGISTER_WINDOW,REGISTER_WIDTH,REGISTER_HEIGHT); glfwSwapBuffers(windows[REGISTER_WINDOW]); } glfwPollEvents(); g_traceStep=0; if (CheckKey(GLFW_KEY_PAUSE)) { g_instructionStep^=1; if (stopTheClock && !g_instructionStep) stopTheClock=0; ClearKey(GLFW_KEY_PAUSE); } if (stopTheClock && CheckKey('S')) { stopTheClock=0; ClearKey('S'); } if (stopTheClock && CheckKey('T')) { stopTheClock=0; g_traceStep=1; ClearKey('T'); } now=glfwGetTime(); remain = now-atStart; while ((remain<0.02f)) { now=glfwGetTime(); remain = now-atStart; } atStart=glfwGetTime(); } } return 0; }
void Viewer::init() { // initialize glfw glfwSetErrorCallback( err_callback ); if( !glfwInit() ) { out_err("Error: could not initialize GLFW!"); exit( 1 ); } // create window string title = renderer ? "CMU462: " + renderer->name() : "CMU462"; window = glfwCreateWindow( DEFAULT_W, DEFAULT_H, title.c_str(), NULL, NULL ); if (!window) { out_err("Error: could not create window!"); glfwTerminate(); exit( 1 ); } // set context glfwMakeContextCurrent( window ); glfwSwapInterval(1); // framebuffer event callbacks glfwSetFramebufferSizeCallback( window, resize_callback ); // key event callbacks glfwSetKeyCallback( window, key_callback ); // cursor event callbacks glfwSetCursorPosCallback( window, cursor_callback ); // wheel event callbacks glfwSetScrollCallback(window, scroll_callback); // mouse button callbacks glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1); glfwSetMouseButtonCallback(window, mouse_button_callback); // initialize glew if (glewInit() != GLEW_OK) { out_err("Error: could not initialize GLEW!"); glfwTerminate(); exit( 1 ); } // enable alpha blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // resize components to current window size, get DPI glfwGetFramebufferSize(window, (int*) &buffer_w, (int*) &buffer_h ); if( buffer_w > DEFAULT_W ) HDPI = true; // initialize renderer if already set if (renderer){ if (HDPI) renderer->use_hdpi_reneder_target(); renderer->init(); } // initialize status OSD osd_text = new OSDText(); if (osd_text->init(HDPI) < 0) { out_err("Error: could not initialize on-screen display!"); exit( 1 ); } // add lines for renderer and fps line_id_renderer = osd_text->add_line(-0.95, 0.90, "Renderer", 18, Color(0.15, 0.5, 0.15)); line_id_framerate = osd_text->add_line(-0.98, -0.96, "Framerate", 14, Color(0.15, 0.5, 0.15)); // resize elements to current size resize_callback(window, buffer_w, buffer_h); }
// The MAIN function, from here we start the application and run the game loop int main() { // Init GLFW glfwInit(); // Set all the required options for GLFW 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); // Create a GLFWwindow object that we can use for GLFW's functions GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetScrollCallback(window, scroll_callback); // GLFW Options glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions glewExperimental = GL_TRUE; // Initialize GLEW to setup the OpenGL Function pointers glewInit(); // Define the viewport dimensions glViewport(0, 0, WIDTH, HEIGHT); // OpenGL options glEnable(GL_DEPTH_TEST); // Build and compile our shader program Shader lightingShader("path/to/shaders/lighting.vs", "path/to/shaders/lighting.frag"); Shader lampShader("path/to/shaders/lamp.vs", "path/to/shaders/lamp.frag"); // Set up vertex data (and buffer(s)) and attribute pointers GLfloat vertices[] = { // Positions // Normals // Texture Coords -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 }; // Positions all containers glm::vec3 cubePositions[] = { glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(2.0f, 5.0f, -15.0f), glm::vec3(-1.5f, -2.2f, -2.5f), glm::vec3(-3.8f, -2.0f, -12.3f), glm::vec3(2.4f, -0.4f, -3.5f), glm::vec3(-1.7f, 3.0f, -7.5f), glm::vec3(1.3f, -2.0f, -2.5f), glm::vec3(1.5f, 2.0f, -2.5f), glm::vec3(1.5f, 0.2f, -1.5f), glm::vec3(-1.3f, 1.0f, -1.5f) }; // First, set the container's VAO (and VBO) GLuint VBO, containerVAO; glGenVertexArrays(1, &containerVAO); glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindVertexArray(containerVAO); 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); glBindVertexArray(0); // Then, we set the light's VAO (VBO stays the same. After all, the vertices are the same for the light object (also a 3D cube)) GLuint lightVAO; glGenVertexArrays(1, &lightVAO); glBindVertexArray(lightVAO); // We only need to bind to the VBO (to link it with glVertexAttribPointer), no need to fill it; the VBO's data already contains all we need. glBindBuffer(GL_ARRAY_BUFFER, VBO); // Set the vertex attributes (only position data for the lamp)) glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); // Note that we skip over the other data in our buffer object (we don't need the normals/textures, only positions). glEnableVertexAttribArray(0); glBindVertexArray(0); // Load textures GLuint diffuseMap, specularMap, emissionMap; glGenTextures(1, &diffuseMap); glGenTextures(1, &specularMap); glGenTextures(1, &emissionMap); int width, height; unsigned char* image; // Diffuse map image = SOIL_load_image("container2.png", &width, &height, 0, SOIL_LOAD_RGB); glBindTexture(GL_TEXTURE_2D, diffuseMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); 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); // Specular map image = SOIL_load_image("container2_specular.png", &width, &height, 0, SOIL_LOAD_RGB); glBindTexture(GL_TEXTURE_2D, specularMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); 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); glBindTexture(GL_TEXTURE_2D, 0); // Set texture units lightingShader.Use(); glUniform1i(glGetUniformLocation(lightingShader.Program, "material.diffuse"), 0); glUniform1i(glGetUniformLocation(lightingShader.Program, "material.specular"), 1); // Game loop while (!glfwWindowShouldClose(window)) { // Calculate deltatime of current frame GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions glfwPollEvents(); do_movement(); // Clear the colorbuffer glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Use cooresponding shader when setting uniforms/drawing objects lightingShader.Use(); GLint lightPosLoc = glGetUniformLocation(lightingShader.Program, "light.position"); GLint lightSpotdirLoc = glGetUniformLocation(lightingShader.Program, "light.direction"); GLint lightSpotCutOffLoc = glGetUniformLocation(lightingShader.Program, "light.cutOff"); GLint lightSpotOuterCutOffLoc = glGetUniformLocation(lightingShader.Program, "light.outerCutOff"); GLint viewPosLoc = glGetUniformLocation(lightingShader.Program, "viewPos"); glUniform3f(lightPosLoc, camera.Position.x, camera.Position.y, camera.Position.z); glUniform3f(lightSpotdirLoc, camera.Front.x, camera.Front.y, camera.Front.z); glUniform1f(lightSpotCutOffLoc, glm::cos(glm::radians(12.5f))); glUniform1f(lightSpotOuterCutOffLoc, glm::cos(glm::radians(17.5f))); glUniform3f(viewPosLoc, camera.Position.x, camera.Position.y, camera.Position.z); // Set lights properties glUniform3f(glGetUniformLocation(lightingShader.Program, "light.ambient"), 0.1f, 0.1f, 0.1f); // We set the diffuse intensity a bit higher; note that the right lighting conditions differ with each lighting method and environment. // Each environment and lighting type requires some tweaking of these variables to get the best out of your environment. glUniform3f(glGetUniformLocation(lightingShader.Program, "light.diffuse"), 0.8f, 0.8f, 0.8f); glUniform3f(glGetUniformLocation(lightingShader.Program, "light.specular"), 1.0f, 1.0f, 1.0f); glUniform1f(glGetUniformLocation(lightingShader.Program, "light.constant"), 1.0f); glUniform1f(glGetUniformLocation(lightingShader.Program, "light.linear"), 0.09); glUniform1f(glGetUniformLocation(lightingShader.Program, "light.quadratic"), 0.032); // Set material properties glUniform1f(glGetUniformLocation(lightingShader.Program, "material.shininess"), 32.0f); // Create camera transformations glm::mat4 view; view = camera.GetViewMatrix(); glm::mat4 projection = glm::perspective(camera.Zoom, (GLfloat)WIDTH / (GLfloat)HEIGHT, 0.1f, 100.0f); // Get the uniform locations GLint modelLoc = glGetUniformLocation(lightingShader.Program, "model"); GLint viewLoc = glGetUniformLocation(lightingShader.Program, "view"); GLint projLoc = glGetUniformLocation(lightingShader.Program, "projection"); // Pass the matrices to the shader glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); // Bind diffuse map glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, diffuseMap); // Bind specular map glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, specularMap); // Draw the container (using container's vertex attributes) /*glBindVertexArray(containerVAO); glm::mat4 model; glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0);*/ // Draw 10 containers with the same VAO and VBO information; only their world space coordinates differ glm::mat4 model; glBindVertexArray(containerVAO); for (GLuint i = 0; i < 10; i++) { model = glm::mat4(); model = glm::translate(model, cubePositions[i]); GLfloat angle = 20.0f * i; model = glm::rotate(model, angle, glm::vec3(1.0f, 0.3f, 0.5f)); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); } glBindVertexArray(0); // Again, no need to draw the lamp object // Also draw the lamp object, again binding the appropriate shader //lampShader.Use(); //// Get location objects for the matrices on the lamp shader (these could be different on a different shader) //modelLoc = glGetUniformLocation(lampShader.Program, "model"); //viewLoc = glGetUniformLocation(lampShader.Program, "view"); //projLoc = glGetUniformLocation(lampShader.Program, "projection"); //// Set matrices //glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); //glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); //model = glm::mat4(); //model = glm::translate(model, lightPos); //model = glm::scale(model, glm::vec3(0.2f)); // Make it a smaller cube //glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); //// Draw the light object (using light's vertex attributes) //glBindVertexArray(lightVAO); //glDrawArrays(GL_TRIANGLES, 0, 36); //glBindVertexArray(0); // Swap the screen buffers glfwSwapBuffers(window); } // Terminate GLFW, clearing any resources allocated by GLFW. glfwTerminate(); return 0; }
// The MAIN function, from here we start our application and run our Game loop int main() { // Init GLFW 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(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr); // Windowed glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetScrollCallback(window, scroll_callback); // Options glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // Initialize GLEW to setup the OpenGL Function pointers glewExperimental = GL_TRUE; glewInit(); // Define the viewport dimensions glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT); // Setup some OpenGL options glEnable(GL_DEPTH_TEST); //glEnable(GL_FRAMEBUFFER_SRGB); // This enables OpenGL's built-in sRGB support. Once enabled, all subsequent fragment outputs (into framebuffer's color buffer(s)) are first gamma corrected. // Setup and compile our shaders Shader shader("gamma_correction.vs", "gamma_correction.frag"); GLfloat planeVertices[] = { // Positions // Normals // Texture Coords 5.0f, -0.5f, 5.0f, 0.0f, 1.0f, 0.0f, 5.0f, 0.0f, -5.0f, -0.5f, 5.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -5.0f, -0.5f, -5.0f, 0.0f, 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, -0.5f, 5.0f, 0.0f, 1.0f, 0.0f, 5.0f, 0.0f, -5.0f, -0.5f, -5.0f, 0.0f, 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, -0.5f, -5.0f, 0.0f, 1.0f, 0.0f, 5.0f, 5.0f }; // Setup plane VAO GLuint planeVAO, planeVBO; glGenVertexArrays(1, &planeVAO); glGenBuffers(1, &planeVBO); glBindVertexArray(planeVAO); glBindBuffer(GL_ARRAY_BUFFER, planeVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(planeVertices), &planeVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); glBindVertexArray(0); // Light sources glm::vec3 lightPositions[] = { glm::vec3(-3.0f, 0.0f, 0.0f), glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3( 3.0f, 0.0f, 0.0f) }; glm::vec3 lightColors[] = { glm::vec3(0.25), glm::vec3(0.50), glm::vec3(0.75), glm::vec3(1.00) }; // Load textures GLuint floorTexture = loadTexture(FileSystem::getPath("resources/textures/wood.png").c_str(), false); GLuint floorTextureGammaCorrected = loadTexture(FileSystem::getPath("resources/textures/wood.png").c_str(), true); // Game loop while (!glfwWindowShouldClose(window)) { // Set frame time GLfloat currentFrame = glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; // Check and call events glfwPollEvents(); Do_Movement(); // Clear the colorbuffer glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw objects shader.Use(); glm::mat4 view = camera.GetViewMatrix(); glm::mat4 projection = glm::perspective(camera.Zoom, (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); glUniformMatrix4fv(glGetUniformLocation(shader.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); // Set light uniforms glUniform3fv(glGetUniformLocation(shader.Program, "lightPositions"), 4, &lightPositions[0][0]); glUniform3fv(glGetUniformLocation(shader.Program, "lightColors"), 4, &lightColors[0][0]); glUniform3fv(glGetUniformLocation(shader.Program, "viewPos"), 1, &camera.Position[0]); glUniform1i(glGetUniformLocation(shader.Program, "gamma"), gammaEnabled); // Floor glBindVertexArray(planeVAO); glBindTexture(GL_TEXTURE_2D, gammaEnabled ? floorTextureGammaCorrected : floorTexture); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); std::cout << (gammaEnabled ? "Gamma enabled" : "Gamma disabled") << std::endl; // Swap the buffers glfwSwapBuffers(window); } glfwTerminate(); return 0; }
int main(int argc, char** argv) { if (!glfwInit()) // 初始化glfw库 { std::cout << "Error::GLFW could not initialize GLFW!" << std::endl; return -1; } // 开启OpenGL 3.3 core profile std::cout << "Start OpenGL core profile version 3.3" << std::endl; 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(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo of lighting with diffuse and specular map", NULL, NULL); if (!window) { std::cout << "Error::GLFW could not create winddow!" << std::endl; glfwTerminate(); return -1; } // 创建的窗口的context指定为当前context glfwMakeContextCurrent(window); // 注册窗口键盘事件回调函数 glfwSetKeyCallback(window, key_callback); // 注册鼠标事件回调函数 glfwSetCursorPosCallback(window, mouse_move_callback); // 注册鼠标滚轮事件回调函数 glfwSetScrollCallback(window, mouse_scroll_callback); // 鼠标捕获 停留在程序内 glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // 初始化GLEW 获取OpenGL函数 glewExperimental = GL_TRUE; // 让glew获取所有拓展函数 GLenum status = glewInit(); if (status != GLEW_OK) { std::cout << "Error::GLEW glew version:" << glewGetString(GLEW_VERSION) << " error string:" << glewGetErrorString(status) << std::endl; glfwTerminate(); return -1; } // 设置视口参数 glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); // Section1 准备顶点数据 // 指定顶点属性数据 顶点位置 纹理 法向量 GLfloat vertices[] = { -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f,1.0f, // A 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // B 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // C 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // C -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // D -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, // A -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, // E -0.5f, 0.5f, -0.5f, 0.0, 1.0f, 0.0f, 0.0f, -1.0f, // H 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f, // G 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f, // G 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, // F -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, // E -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, // D -0.5f, 0.5f, -0.5f, 1.0, 1.0f, -1.0f, 0.0f, 0.0f, // H -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, // E -0.5f, -0.5f, -0.5f,1.0f, 0.0f, -1.0f, 0.0f, 0.0f, // E -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // A -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, // D 0.5f, -0.5f, -0.5f,1.0f, 0.0f, 1.0f, 0.0f, 0.0f, // F 0.5f, 0.5f, -0.5f,1.0f, 1.0f, 1.0f, 0.0f, 0.0f, // G 0.5f, 0.5f, 0.5f,0.0f, 1.0f, 1.0f, 0.0f, 0.0f, // C 0.5f, 0.5f, 0.5f,0.0f, 1.0f, 1.0f, 0.0f, 0.0f, // C 0.5f, -0.5f, 0.5f,0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // B 0.5f, -0.5f, -0.5f,1.0f, 0.0f, 1.0f, 0.0f, 0.0f, // F 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, // G -0.5f, 0.5f, -0.5f, 0.0, 1.0f, 0.0f, 1.0f, 0.0f, // H -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, // D -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, // D 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // C 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, // G -0.5f, -0.5f, 0.5f,0.0f, 0.0f, 0.0f, -1.0f, 0.0f, // A -0.5f, -0.5f, -0.5f,0.0f, 1.0f, 0.0f, -1.0f, 0.0f, // E 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f, // F 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f, // F 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, // B -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, // A }; // 创建物体缓存对象 GLuint VAOId, VBOId; // Step1: 创建并绑定VAO对象 glGenVertexArrays(1, &VAOId); glBindVertexArray(VAOId); // Step2: 创建并绑定VBO 对象 传送数据 glGenBuffers(1, &VBOId); glBindBuffer(GL_ARRAY_BUFFER, VBOId); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // Step3: 指定解析方式 并启用顶点属性 // 顶点位置属性 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GL_FLOAT), (GLvoid*)0); glEnableVertexAttribArray(0); // 顶点纹理坐标 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); glEnableVertexAttribArray(1); // 顶点法向量属性 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GL_FLOAT), (GLvoid*)(5 * sizeof(GL_FLOAT))); glEnableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); // 创建光源的VAO GLuint lampVAOId; glGenVertexArrays(1, &lampVAOId); glBindVertexArray(lampVAOId); glBindBuffer(GL_ARRAY_BUFFER, VBOId); // 重用上面的数据 无需重复发送顶点数据 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GL_FLOAT), (GLvoid*)0); glEnableVertexAttribArray(0); // 只需要顶点位置即可 glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); // Section2 准备着色器程序 Shader shader("cube.vertex", "cube.frag"); Shader lampShaer("lamp.vertex", "lamp.frag"); // Section3 准备diffuseMap和specularMap GLint diffuseMap = TextureHelper::load2DTexture("../../resources/textures/container_diffuse.png"); GLint specularMap = TextureHelper::load2DTexture("../../resources/textures/container_specular.png"); shader.use(); glUniform1i(glGetUniformLocation(shader.programId, "material.diffuseMap"), 0); glUniform1i(glGetUniformLocation(shader.programId, "material.specularMap"), 1); glEnable(GL_DEPTH_TEST); // 开始游戏主循环 while (!glfwWindowShouldClose(window)) { GLfloat currentFrame = (GLfloat)glfwGetTime(); deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; glfwPollEvents(); // 处理例如鼠标 键盘等事件 do_movement(); // 根据用户操作情况 更新相机属性 // 清除颜色缓冲区 重置为指定颜色 glClearColor(0.18f, 0.04f, 0.14f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::mat4 projection = glm::perspective(camera.mouse_zoom, (GLfloat)(WINDOW_WIDTH) / WINDOW_HEIGHT, 1.0f, 100.0f); // 投影矩阵 glm::mat4 view = camera.getViewMatrix(); // 视变换矩阵 // 这里填写场景绘制代码 glBindVertexArray(VAOId); shader.use(); // 设置光源属性 GLint lightAmbientLoc = glGetUniformLocation(shader.programId, "light.ambient"); GLint lightDiffuseLoc = glGetUniformLocation(shader.programId, "light.diffuse"); GLint lightSpecularLoc = glGetUniformLocation(shader.programId, "light.specular"); GLint lightPosLoc = glGetUniformLocation(shader.programId, "light.position"); glUniform3f(lightAmbientLoc, 0.2f, 0.2f, 0.2f); glUniform3f(lightDiffuseLoc, 0.5f, 0.5f, 0.5f); glUniform3f(lightSpecularLoc, 1.0f, 1.0f, 1.0f); glUniform3f(lightPosLoc, lampPos.x, lampPos.y, lampPos.z); // 设置材料光照属性 // 启用diffuseMap glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, diffuseMap); // 启用specularMap glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, specularMap); GLint objectShininessLoc = glGetUniformLocation(shader.programId, "material.shininess"); glUniform1f(objectShininessLoc, 32.0f); // 设置观察者位置 GLint viewPosLoc = glGetUniformLocation(shader.programId, "viewPos"); glUniform3f(viewPosLoc, camera.position.x, camera.position.y, camera.position.z); // 设置变换矩阵 glUniformMatrix4fv(glGetUniformLocation(shader.programId, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLocation(shader.programId, "view"), 1, GL_FALSE, glm::value_ptr(view)); // 绘制立方体 glm::mat4 model; //model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glUniformMatrix4fv(glGetUniformLocation(shader.programId, "model"), 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); // 绘制光源 用立方体代表 glBindVertexArray(lampVAOId); lampShaer.use(); glUniformMatrix4fv(glGetUniformLocation(lampShaer.programId, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLocation(lampShaer.programId, "view"), 1, GL_FALSE, glm::value_ptr(view)); model = glm::mat4(); model = glm::translate(model, lampPos); model = glm::scale(model, glm::vec3(0.2f, 0.2f, 0.2f)); glUniformMatrix4fv(glGetUniformLocation(lampShaer.programId, "model"), 1, GL_FALSE, glm::value_ptr(model)); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); glUseProgram(0); glfwSwapBuffers(window); // 交换缓存 } // 释放资源 glDeleteVertexArrays(1, &VAOId); glDeleteBuffers(1, &VBOId); glDeleteVertexArrays(1, &lampVAOId); glfwTerminate(); return 0; }