inline GLuint load_program_from_file_wo_link( const std::string& vs_src_file, const std::string& fs_src_file) { GLuint program = glCreateProgram(); assert(program!=0); if(program == 0) { return 0; } { const GLuint shader = load_shader_from_file(vs_src_file, GL_VERTEX_SHADER); assert(shader!=0); if(shader == 0) { return 0; } glAttachShader(program, shader); } { const GLuint shader = load_shader_from_file(fs_src_file, GL_FRAGMENT_SHADER); assert(shader!=0); if(shader == 0) { return 0; } glAttachShader(program, shader); } return program; }
NE_API void load_shader_asset(shader_asset* shader) { Assert(shader->program_id == 0); shader->program_id = glCreateProgram(); CHECK_GL_ERROR(); shader->vertex_shader_id = create_shader(GL_VERTEX_SHADER); shader->fragment_shader_id = create_shader(GL_FRAGMENT_SHADER); load_shader_from_file(shader->vertex_shader_id, shader->path + "/vertex.glsl"); load_shader_from_file(shader->fragment_shader_id, shader->path + "/fragment.glsl"); attach_vertex_shader(shader->program_id, shader->vertex_shader_id); attach_fragment_shader(shader->program_id, shader->fragment_shader_id); link_shader_program(shader->program_id); shader->color_uniform = shader_uniform_location(shader->program_id, "uni_Color"); shader->model_uniform = shader_uniform_location(shader->program_id, "uni_Model"); shader->view_uniform = shader_uniform_location(shader->program_id, "uni_View"); shader->projection_uniform = shader_uniform_location(shader->program_id, "uni_Projection"); }
inline GLuint load_program_from_file_wo_link_with_common ( GLenum shader_type, const std::string& common_src_file, const std::string& src_file ) { GLuint program = glCreateProgram(); assert(program!=0); if(program == 0) { return 0; } { const GLuint shader = load_shader_from_file(shader_type, common_src_file, src_file); assert(shader!=0); if(shader == 0) { return 0; } glAttachShader(program, shader); } return program; }
void compile_shader(void) { GLuint vertex_shader; GLuint fragment_shader; GLint status; GLchar message[512]; GLchar *glsl = NULL; vertex_shader = glCreateShader(GL_VERTEX_SHADER); load_shader_from_file("shaders/simple.vert", &glsl); glShaderSource(vertex_shader, 1, &glsl, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(vertex_shader, 512, NULL, message); printf("%s\n", message); } fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); free(glsl); load_shader_from_file("shaders/simple.frag", &glsl); glShaderSource(fragment_shader, 1, &glsl, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(fragment_shader, 512, NULL, message); printf("%s\n", message); } free(glsl); g_program = glCreateProgram(); glAttachShader(g_program, vertex_shader); glAttachShader(g_program, fragment_shader); glLinkProgram(g_program); glGetProgramiv(g_program, GL_LINK_STATUS, &status); if (!status) { glGetProgramInfoLog(g_program, 512, NULL, message); printf("%s\n", message); } glUseProgram(g_program); }
int main(int argc, char **argv) { wrt = (struct warp_runtime *)malloc(sizeof(struct warp_runtime)); assert(NULL != wrt); memset(wrt, 0, sizeof(struct warp_runtime)); create_warp_runtime(wrt); glViewport(0, 0, 500, 500); /* setup shader & program */ GLchar message[512]; GLint status; GLchar *source = NULL; GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); load_shader_from_file("shaders/es3_draw_rect.vert", &source); glShaderSource(vertex_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(vertex_shader, 512, NULL, message); printf("%s\n", message); } GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); free(source); load_shader_from_file("shaders/es3_draw_rect.frag", &source); glShaderSource(fragment_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(fragment_shader, 512, NULL, message); printf("%s\n", message); } GLuint prog = glCreateProgram(); glAttachShader(prog, vertex_shader); glAttachShader(prog, fragment_shader); glLinkProgram(prog); glGetProgramiv(prog, GL_LINK_STATUS, &status); if (!status) { glGetProgramInfoLog(prog, 512, NULL, message); printf("%s\n", message); } glUseProgram(prog); /* set up resource */ /* packed in vec3 (pos) + vec4 (color) */ GLfloat buffer[] = { /* down triangle */ -0.25f, 0.25f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.25f, -0.25f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -0.25f, -0.25f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, /* up triangle */ -0.25f, 0.25f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.25f, 0.25f, 0.25f, 1.0f, 1.0f, 0.0f, 0.0f, 0.25f, -0.25f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(buffer), buffer, GL_STATIC_DRAW); /* here we pack position and color buffer into a single * vbo, therefore the offset should be considered when setting * its relative attribute index on glsl side */ glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid *)0); glEnableVertexAttribArray(1); /* color buffer content is 3*sizeof(GLfloat) = 12 * offset from the vbo */ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid *)12); /* game loop */ while (1) { XNextEvent(wrt->x11_display, &(wrt->event)); switch(wrt->event.type) { case Expose: /* do the render */ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); eglSwapBuffers(wrt->egl_display, wrt->egl_surface); break; case ButtonPress: case KeyPress: goto finish; default: break; } } finish: glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); glDeleteProgram(prog); glDeleteBuffers(1, &vbo); glDeleteVertexArrays(1, &vao); destroy_warp_runtime(wrt); return 0; }
int main( int argc, char **argv ) { int width = 800, height= 600; float widthf = (float) width, heightf = (float) height; double t; float fps = 0.f; // Initialise GLFW if( !glfwInit() ) { fprintf( stderr, "Failed to initialize GLFW\n" ); exit( EXIT_FAILURE ); } // Force core profile on Mac OSX #ifdef __APPLE__ glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #endif // Open a window and create its OpenGL context if( !glfwOpenWindow( width, height, 0,0,0,0, 24, 0, GLFW_WINDOW ) ) { fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); exit( EXIT_FAILURE ); } glfwSetWindowTitle( "001_a" ); // Core profile is flagged as experimental in glew #ifdef __APPLE__ glewExperimental = GL_TRUE; #endif GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); exit( EXIT_FAILURE ); } // Ensure we can capture the escape key being pressed below glfwEnable( GLFW_STICKY_KEYS ); // Enable vertical sync (on cards that support it) glfwSwapInterval( 1 ); GLenum glerr = GL_NO_ERROR; glerr = glGetError(); if (!imguiRenderGLInit(DroidSans_ttf, DroidSans_ttf_len)) { fprintf(stderr, "Could not init GUI renderer.\n"); exit(EXIT_FAILURE); } // Init viewer structures Camera camera; camera_defaults(camera); GUIStates guiStates; init_gui_states(guiStates); float dummySlider = 0.f; // Load images and upload textures GLuint textures[2]; glGenTextures(2, textures); int x; int y; int comp; unsigned char * diffuse = stbi_load("textures/spnza_bricks_a_diff.tga", &x, &y, &comp, 3); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, diffuse); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); fprintf(stderr, "Diffuse %dx%d:%d\n", x, y, comp); unsigned char * spec = stbi_load("textures/spnza_bricks_a_spec.tga", &x, &y, &comp, 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, x, y, 0, GL_RED, GL_UNSIGNED_BYTE, spec); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); fprintf(stderr, "Spec %dx%d:%d\n", x, y, comp); glerr = glGetError(); if(glerr != GL_NO_ERROR) fprintf(stderr, "2nd OpenGL Error : %s\n", gluErrorString(glerr)); // Try to load and compile shader ShaderGLSL shader; const char * shaderFile = "001/3a.glsl"; //const char * shaderFile = "001/4a.glsl"; //const char * shaderFile = "001/5a.glsl"; //const char * shaderFile = "001/5ba.glsl"; //const char * shaderFile = "001/6a.glsl"; //const char * shaderFile = "001/7a.glsl"; //const char * shaderFile = "001/8a.glsl"; //int status = load_shader_from_file(shader, shaderFile, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER | ShaderGLSL::GEOMETRY_SHADER); int status = load_shader_from_file(shader, shaderFile, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER); if ( status == -1 ) { fprintf(stderr, "Error on loading %s\n", shaderFile); exit( EXIT_FAILURE ); } // Apply shader GLuint program = shader.program; glUseProgram(program); GLuint projectionLocation = glGetUniformLocation(program, "Projection"); GLuint viewLocation = glGetUniformLocation(program, "View"); GLuint objectLocation = glGetUniformLocation(program, "Object"); GLuint timeLocation = glGetUniformLocation(program, "Time"); GLuint diffuseLocation = glGetUniformLocation(program, "Diffuse"); GLuint specLocation = glGetUniformLocation(program, "Spec"); GLuint cameraPositionLocation = glGetUniformLocation(program, "CameraPosition"); glUniform1i(diffuseLocation, 0); glUniform1i(specLocation, 1); // Load geometry int cube_triangleCount = 12; int cube_triangleList[] = {0, 1, 2, 2, 1, 3, 4, 5, 6, 6, 5, 7, 8, 9, 10, 10, 9, 11, 12, 13, 14, 14, 13, 15, 16, 17, 18, 19, 17, 20, 21, 22, 23, 24, 25, 26, }; float cube_uvs[] = {0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f, }; float cube_vertices[] = {-0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5 }; float cube_normals[] = {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, }; int plane_triangleCount = 2; int plane_triangleList[] = {0, 1, 2, 2, 1, 3}; float plane_uvs[] = {0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f}; float plane_vertices[] = {-5.0, -1.0, 5.0, 5.0, -1.0, 5.0, -5.0, -1.0, -5.0, 5.0, -1.0, -5.0}; float plane_normals[] = {0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0}; // Vertex Array Object GLuint vao[2]; glGenVertexArrays(2, vao); // Vertex Buffer Objects GLuint vbo[8]; glGenBuffers(8, vbo); // Cube glBindVertexArray(vao[0]); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[0]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_triangleList), cube_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW); // Bind normals and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[2]); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_normals), cube_normals, GL_STATIC_DRAW); // Bind uv coords and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[3]); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_uvs), cube_uvs, GL_STATIC_DRAW); // Plane glBindVertexArray(vao[1]); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[4]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(plane_triangleList), plane_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[5]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_vertices), plane_vertices, GL_STATIC_DRAW); // Bind normals and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[6]); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_normals), plane_normals, GL_STATIC_DRAW); // Bind uv coords and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[7]); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_uvs), plane_uvs, GL_STATIC_DRAW); // Unbind everything. Potentially illegal on some implementations glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); // Viewport glViewport( 0, 0, width, height ); do { t = glfwGetTime(); // Mouse states int leftButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_LEFT ); int rightButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_RIGHT ); int middleButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_MIDDLE ); if( leftButton == GLFW_PRESS ) guiStates.turnLock = true; else guiStates.turnLock = false; if( rightButton == GLFW_PRESS ) guiStates.zoomLock = true; else guiStates.zoomLock = false; if( middleButton == GLFW_PRESS ) guiStates.panLock = true; else guiStates.panLock = false; // Camera movements int altPressed = glfwGetKey(GLFW_KEY_LSHIFT); if (!altPressed && (leftButton == GLFW_PRESS || rightButton == GLFW_PRESS || middleButton == GLFW_PRESS)) { int x; int y; glfwGetMousePos(&x, &y); guiStates.lockPositionX = x; guiStates.lockPositionY = y; } if (altPressed == GLFW_PRESS) { int mousex; int mousey; glfwGetMousePos(&mousex, &mousey); int diffLockPositionX = mousex - guiStates.lockPositionX; int diffLockPositionY = mousey - guiStates.lockPositionY; if (guiStates.zoomLock) { float zoomDir = 0.0; if (diffLockPositionX > 0) zoomDir = -1.f; else if (diffLockPositionX < 0 ) zoomDir = 1.f; camera_zoom(camera, zoomDir * GUIStates::MOUSE_ZOOM_SPEED); } else if (guiStates.turnLock) { camera_turn(camera, diffLockPositionY * GUIStates::MOUSE_TURN_SPEED, diffLockPositionX * GUIStates::MOUSE_TURN_SPEED); } else if (guiStates.panLock) { camera_pan(camera, diffLockPositionX * GUIStates::MOUSE_PAN_SPEED, diffLockPositionY * GUIStates::MOUSE_PAN_SPEED); } guiStates.lockPositionX = mousex; guiStates.lockPositionY = mousey; } // Default states glEnable(GL_DEPTH_TEST); // Clear the front buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Get camera matrices glm::mat4 projection = glm::perspective(45.0f, widthf / heightf, 0.1f, 100.f); glm::mat4 worldToView = glm::lookAt(camera.eye, camera.o, camera.up); glm::mat4 objectToWorld; // Select textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); // Select shader glUseProgram(program); // Upload uniforms glUniformMatrix4fv(projectionLocation, 1, 0, glm::value_ptr(projection)); glUniformMatrix4fv(viewLocation, 1, 0, glm::value_ptr(worldToView)); glUniformMatrix4fv(objectLocation, 1, 0, glm::value_ptr(objectToWorld)); glUniform1f(timeLocation, t); glUniform3fv(cameraPositionLocation, 1, glm::value_ptr(camera.eye)); // Render vaos glBindVertexArray(vao[0]); glDrawElementsInstanced(GL_TRIANGLES, cube_triangleCount * 3, GL_UNSIGNED_INT, (void*)0, 4); //glDrawElements(GL_TRIANGLES, cube_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); glBindVertexArray(vao[1]); glDrawElements(GL_TRIANGLES, plane_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); #if 1 // Draw UI glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0, 0, width, height); unsigned char mbut = 0; int mscroll = 0; int mousex; int mousey; glfwGetMousePos(&mousex, &mousey); mousey = height - mousey; if( leftButton == GLFW_PRESS ) mbut |= IMGUI_MBUT_LEFT; imguiBeginFrame(mousex, mousey, mbut, mscroll); int logScroll = 0; char lineBuffer[512]; imguiBeginScrollArea("001", width - 210, height - 310, 200, 300, &logScroll); sprintf(lineBuffer, "FPS %f", fps); imguiLabel(lineBuffer); imguiSlider("Dummy", &dummySlider, 0.0, 3.0, 0.1); imguiEndScrollArea(); imguiEndFrame(); imguiRenderGLDraw(width, height); glDisable(GL_BLEND); #endif // Check for errors GLenum err = glGetError(); if(err != GL_NO_ERROR) { fprintf(stderr, "OpenGL Error : %s\n", gluErrorString(err)); } // Swap buffers glfwSwapBuffers(); double newTime = glfwGetTime(); fps = 1.f/ (newTime - t); } // Check if the ESC key was pressed or the window was closed while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS && glfwGetWindowParam( GLFW_OPENED ) ); // Close OpenGL window and terminate GLFW glfwTerminate(); exit( EXIT_SUCCESS ); }
int main(int argc, char **argv) { wrt = (struct warp_runtime *)malloc(sizeof(struct warp_runtime)); assert(NULL != wrt); memset(wrt, 0, sizeof(struct warp_runtime)); create_warp_runtime(wrt); glViewport(0, 0, 500, 500); /* setup shader & program */ GLchar message[512]; GLint status; GLchar *source = NULL; GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); load_shader_from_file("shaders/es3_indexdraw_rect.vert", &source); glShaderSource(vertex_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(vertex_shader, 512, NULL, message); printf("%s\n", message); } GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); free(source); load_shader_from_file("shaders/es3_indexdraw_rect.frag", &source); glShaderSource(fragment_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(fragment_shader, 512, NULL, message); printf("%s\n", message); } GLuint prog = glCreateProgram(); glAttachShader(prog, vertex_shader); glAttachShader(prog, fragment_shader); glLinkProgram(prog); glGetProgramiv(prog, GL_LINK_STATUS, &status); if (!status) { glGetProgramInfoLog(prog, 512, NULL, message); printf("%s\n", message); } glUseProgram(prog); /* set up resource */ GLfloat pos_buf[] = { -0.25f, 0.25f, 0.0f, 0.25f, -0.25f, 0.0f, -0.25f, -0.25f, 0.0f, 0.25f, 0.25f, 0.0f }; GLfloat color_buf[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, }; GLushort index_buf[] = { 0, 1, 2, 0, 3, 1 }; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); /* setup array buffer for position and color */ GLuint vbo_pos; glGenBuffers(1, &vbo_pos); glBindBuffer(GL_ARRAY_BUFFER, vbo_pos); glBufferData(GL_ARRAY_BUFFER, sizeof(pos_buf), pos_buf, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0); GLuint vbo_color; glGenBuffers(1, &vbo_color); glBindBuffer(GL_ARRAY_BUFFER, vbo_color); glBufferData(GL_ARRAY_BUFFER, sizeof(color_buf), color_buf, GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid *)0); /* setup index buffer for index */ GLuint vbo_index; glGenBuffers(1, &vbo_index); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_index); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index_buf), index_buf, GL_STATIC_DRAW); /* game loop */ while (1) { XNextEvent(wrt->x11_display, &(wrt->event)); switch(wrt->event.type) { case Expose: /* do the render */ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)0); glBindVertexArray(0); eglSwapBuffers(wrt->egl_display, wrt->egl_surface); break; case ButtonPress: case KeyPress: goto finish; default: break; } } finish: glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); glDeleteProgram(prog); glDeleteBuffers(1, &vbo_pos); glDeleteBuffers(1, &vbo_color); glDeleteBuffers(1, &vbo_index); glDeleteVertexArrays(1, &vao); destroy_warp_runtime(wrt); return 0; }
CCube::CCube(int nNbInstance) : m_nNbInstance(nNbInstance) { m_nNbVertices = 12; m_fTime = 0.0f; glGenVertexArrays(1, &m_Vao); glGenBuffers(4, m_Vbo); int cube_triangleList[] = {0, 1, 2, 2, 1, 3, 4, 5, 6, 6, 5, 7, 8, 9, 10, 10, 9, 11, 12, 13, 14, 14, 13, 15, 16, 17, 18, 19, 17, 20, 21, 22, 23, 24, 25, 26, }; float cube_uvs[] = {0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f, }; float cube_vertices[] = {-0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5 }; float cube_normals[] = {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, }; float pfVertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f}; glBindVertexArray(m_Vao); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_Vbo[0]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_triangleList), cube_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, m_Vbo[1]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW); // Bind normals and upload data glBindBuffer(GL_ARRAY_BUFFER, m_Vbo[2]); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_normals), cube_normals, GL_STATIC_DRAW); // Bind uv coords and upload data glBindBuffer(GL_ARRAY_BUFFER, m_Vbo[3]); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_uvs), cube_uvs, GL_STATIC_DRAW); glGenTextures(1, m_pTextures); int x; int y; int comp; unsigned char * diffuse = stbi_load("../textures/jeanphe.tga", &x, &y, &comp, 3); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_pTextures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, diffuse); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); fprintf(stderr, "Diffuse %dx%d:%d\n", x, y, comp); const char * shaderFile = "../shaders/Diffuse.glsl"; int status = load_shader_from_file(m_Shader, shaderFile, SShaderGLSL::VERTEX_SHADER | SShaderGLSL::FRAGMENT_SHADER); if ( status == -1 ) { fprintf(stderr, "Error on loading %s\n", shaderFile); exit( EXIT_FAILURE ); } // Apply shader // GLuint program = shader.program; glUseProgram(m_Shader.program); projectionLocation = glGetUniformLocation(m_Shader.program, "Projection"); viewLocation = glGetUniformLocation(m_Shader.program, "View"); objectLocation = glGetUniformLocation(m_Shader.program, "Object"); timeLocation = glGetUniformLocation(m_Shader.program, "Time"); diffuseLocation = glGetUniformLocation(m_Shader.program, "Diffuse"); sqrtNbInstanceLocation = glGetUniformLocation(m_Shader.program, "nSqrtNbInstance"); }
int main( int argc, char **argv ) { int width = 1024, height=768; float widthf = (float) width, heightf = (float) height; double t; float fps = 0.f; // Initialise GLFW if( !glfwInit() ) { fprintf( stderr, "Failed to initialize GLFW\n" ); exit( EXIT_FAILURE ); } // Force core profile on Mac OSX #ifdef __APPLE__ glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #endif // Open a window and create its OpenGL context if( !glfwOpenWindow( width, height, 0,0,0,0, 24, 0, GLFW_WINDOW ) ) { fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); exit( EXIT_FAILURE ); } glfwSetWindowTitle( "002_forward_a" ); // Core profile is flagged as experimental in glew #ifdef __APPLE__ glewExperimental = GL_TRUE; #endif GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); exit( EXIT_FAILURE ); } // Ensure we can capture the escape key being pressed below glfwEnable( GLFW_STICKY_KEYS ); // Enable vertical sync (on cards that support it) glfwSwapInterval( 1 ); GLenum glerr = GL_NO_ERROR; glerr = glGetError(); if (!imguiRenderGLInit(DroidSans_ttf, DroidSans_ttf_len)) { fprintf(stderr, "Could not init GUI renderer.\n"); exit(EXIT_FAILURE); } // Init viewer structures Camera camera; camera_defaults(camera); GUIStates guiStates; init_gui_states(guiStates); // GUI float numLights = 10.f; // Load images and upload textures GLuint textures[3]; glGenTextures(3, textures); int x; int y; int comp; unsigned char * diffuse = stbi_load("textures/spnza_bricks_a_diff.tga", &x, &y, &comp, 3); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y, 0, GL_RGB, GL_UNSIGNED_BYTE, diffuse); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); fprintf(stderr, "Diffuse %dx%d:%d\n", x, y, comp); unsigned char * spec = stbi_load("textures/spnza_bricks_a_spec.tga", &x, &y, &comp, 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, x, y, 0, GL_RED, GL_UNSIGNED_BYTE, spec); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); fprintf(stderr, "Spec %dx%d:%d\n", x, y, comp); // Try to load and compile shader int status; ShaderGLSL gbuffer_shader; const char * shaderFileGBuffer = "002/2_gbuffera.glsl"; //int status = load_shader_from_file(gbuffer_shader, shaderFileGBuffer, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER | ShaderGLSL::GEOMETRY_SHADER); status = load_shader_from_file(gbuffer_shader, shaderFileGBuffer, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER); if ( status == -1 ) { fprintf(stderr, "Error on loading %s\n", shaderFileGBuffer); exit( EXIT_FAILURE ); } // Compute locations for gbuffer_shader GLuint gbuffer_projectionLocation = glGetUniformLocation(gbuffer_shader.program, "Projection"); GLuint gbuffer_viewLocation = glGetUniformLocation(gbuffer_shader.program, "View"); GLuint gbuffer_objectLocation = glGetUniformLocation(gbuffer_shader.program, "Object"); GLuint gbuffer_timeLocation = glGetUniformLocation(gbuffer_shader.program, "Time"); GLuint gbuffer_diffuseLocation = glGetUniformLocation(gbuffer_shader.program, "Diffuse"); GLuint gbuffer_specLocation = glGetUniformLocation(gbuffer_shader.program, "Spec"); // Load Blit shader ShaderGLSL blit_shader; const char * shaderFileBlit = "002/2_blita.glsl"; //int status = load_shader_from_file(blit_shader, shaderFileBlit, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER | ShaderGLSL::GEOMETRY_SHADER); status = load_shader_from_file(blit_shader, shaderFileBlit, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER); if ( status == -1 ) { fprintf(stderr, "Error on loading %s\n", shaderFileBlit); exit( EXIT_FAILURE ); } // Compute locations for blit_shader GLuint blit_tex1Location = glGetUniformLocation(blit_shader.program, "Texture1"); // Load light accumulation shader ShaderGLSL lighting_shader; const char * shaderFileLighting = "002/2_lighta.glsl"; //int status = load_shader_from_file(lighting_shader, shaderFileLighting, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER | ShaderGLSL::GEOMETRY_SHADER); status = load_shader_from_file(lighting_shader, shaderFileLighting, ShaderGLSL::VERTEX_SHADER | ShaderGLSL::FRAGMENT_SHADER); if ( status == -1 ) { fprintf(stderr, "Error on loading %s\n", shaderFileLighting); exit( EXIT_FAILURE ); } // Compute locations for lighting_shader GLuint lighting_materialLocation = glGetUniformLocation(lighting_shader.program, "Material"); GLuint lighting_normalLocation = glGetUniformLocation(lighting_shader.program, "Normal"); GLuint lighting_depthLocation = glGetUniformLocation(lighting_shader.program, "Depth"); GLuint lighting_inverseViewProjectionLocation = glGetUniformLocation(lighting_shader.program, "InverseViewProjection"); GLuint lighting_cameraPositionLocation = glGetUniformLocation(lighting_shader.program, "CameraPosition"); GLuint lighting_lightPositionLocation = glGetUniformLocation(lighting_shader.program, "LightPosition"); GLuint lighting_lightColorLocation = glGetUniformLocation(lighting_shader.program, "LightColor"); GLuint lighting_lightIntensityLocation = glGetUniformLocation(lighting_shader.program, "LightIntensity"); // Load geometry int cube_triangleCount = 12; int cube_triangleList[] = {0, 1, 2, 2, 1, 3, 4, 5, 6, 6, 5, 7, 8, 9, 10, 10, 9, 11, 12, 13, 14, 14, 13, 15, 16, 17, 18, 19, 17, 20, 21, 22, 23, 24, 25, 26, }; float cube_uvs[] = {0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 0.f, }; float cube_vertices[] = {-0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5 }; float cube_normals[] = {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, }; int plane_triangleCount = 2; int plane_triangleList[] = {0, 1, 2, 2, 1, 3}; float plane_uvs[] = {0.f, 0.f, 0.f, 10.f, 10.f, 0.f, 10.f, 10.f}; float plane_vertices[] = {-50.0, -1.0, 50.0, 50.0, -1.0, 50.0, -50.0, -1.0, -50.0, 50.0, -1.0, -50.0}; float plane_normals[] = {0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0}; int quad_triangleCount = 2; int quad_triangleList[] = {0, 1, 2, 2, 1, 3}; float quad_vertices[] = {-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0}; // Vertex Array Object GLuint vao[3]; glGenVertexArrays(3, vao); // Vertex Buffer Objects GLuint vbo[12]; glGenBuffers(12, vbo); // Cube glBindVertexArray(vao[0]); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[0]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_triangleList), cube_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW); // Bind normals and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[2]); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_normals), cube_normals, GL_STATIC_DRAW); // Bind uv coords and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[3]); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_uvs), cube_uvs, GL_STATIC_DRAW); // Plane glBindVertexArray(vao[1]); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[4]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(plane_triangleList), plane_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[5]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_vertices), plane_vertices, GL_STATIC_DRAW); // Bind normals and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[6]); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*3, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_normals), plane_normals, GL_STATIC_DRAW); // Bind uv coords and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[7]); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(plane_uvs), plane_uvs, GL_STATIC_DRAW); // Quad glBindVertexArray(vao[2]); // Bind indices and upload data glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[8]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quad_triangleList), quad_triangleList, GL_STATIC_DRAW); // Bind vertices and upload data glBindBuffer(GL_ARRAY_BUFFER, vbo[9]); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT)*2, (void*)0); glBufferData(GL_ARRAY_BUFFER, sizeof(quad_vertices), quad_vertices, GL_STATIC_DRAW); // Unbind everything. Potentially illegal on some implementations glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); // Init frame buffers GLuint gbufferFbo; GLuint gbufferTextures[3]; GLuint gbufferDrawBuffers[2]; glGenTextures(3, gbufferTextures); // Create color texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Create normal texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[1]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Create depth texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[2]); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Create Framebuffer Object glGenFramebuffers(1, &gbufferFbo); glBindFramebuffer(GL_FRAMEBUFFER, gbufferFbo); // Attach textures to framebuffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 , GL_TEXTURE_2D, gbufferTextures[0], 0); gbufferDrawBuffers[0] = GL_COLOR_ATTACHMENT0; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1 , GL_TEXTURE_2D, gbufferTextures[1], 0); gbufferDrawBuffers[1] = GL_COLOR_ATTACHMENT1; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gbufferTextures[2], 0); if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { fprintf(stderr, "Error on building framebuffer\n"); exit( EXIT_FAILURE ); } glBindFramebuffer(GL_FRAMEBUFFER, 0); do { t = glfwGetTime(); // Mouse states int leftButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_LEFT ); int rightButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_RIGHT ); int middleButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_MIDDLE ); if( leftButton == GLFW_PRESS ) guiStates.turnLock = true; else guiStates.turnLock = false; if( rightButton == GLFW_PRESS ) guiStates.zoomLock = true; else guiStates.zoomLock = false; if( middleButton == GLFW_PRESS ) guiStates.panLock = true; else guiStates.panLock = false; // Camera movements int altPressed = glfwGetKey(GLFW_KEY_LSHIFT); if (!altPressed && (leftButton == GLFW_PRESS || rightButton == GLFW_PRESS || middleButton == GLFW_PRESS)) { int x; int y; glfwGetMousePos(&x, &y); guiStates.lockPositionX = x; guiStates.lockPositionY = y; } if (altPressed == GLFW_PRESS) { int mousex; int mousey; glfwGetMousePos(&mousex, &mousey); int diffLockPositionX = mousex - guiStates.lockPositionX; int diffLockPositionY = mousey - guiStates.lockPositionY; if (guiStates.zoomLock) { float zoomDir = 0.0; if (diffLockPositionX > 0) zoomDir = -1.f; else if (diffLockPositionX < 0 ) zoomDir = 1.f; camera_zoom(camera, zoomDir * GUIStates::MOUSE_ZOOM_SPEED); } else if (guiStates.turnLock) { camera_turn(camera, diffLockPositionY * GUIStates::MOUSE_TURN_SPEED, diffLockPositionX * GUIStates::MOUSE_TURN_SPEED); } else if (guiStates.panLock) { camera_pan(camera, diffLockPositionX * GUIStates::MOUSE_PAN_SPEED, diffLockPositionY * GUIStates::MOUSE_PAN_SPEED); } guiStates.lockPositionX = mousex; guiStates.lockPositionY = mousey; } // Get camera matrices glm::mat4 projection = glm::perspective(45.0f, widthf / heightf, 0.1f, 100.f); glm::mat4 worldToView = glm::lookAt(camera.eye, camera.o, camera.up); glm::mat4 objectToWorld; glm::mat4 worldToScreen = projection * worldToView; glm::mat4 screenToWorld = glm::transpose(glm::inverse(worldToScreen)); glBindFramebuffer(GL_FRAMEBUFFER, gbufferFbo); glDrawBuffers(2, gbufferDrawBuffers); // Viewport glViewport( 0, 0, width, height ); // Default states glEnable(GL_DEPTH_TEST); // Clear the front buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Bind gbuffer shader glUseProgram(gbuffer_shader.program); // Upload uniforms glUniformMatrix4fv(gbuffer_projectionLocation, 1, 0, glm::value_ptr(projection)); glUniformMatrix4fv(gbuffer_viewLocation, 1, 0, glm::value_ptr(worldToView)); glUniformMatrix4fv(gbuffer_objectLocation, 1, 0, glm::value_ptr(objectToWorld)); glUniform1f(gbuffer_timeLocation, t); glUniform1i(gbuffer_diffuseLocation, 0); glUniform1i(gbuffer_specLocation, 1); // Bind textures glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures[0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, textures[1]); // Render vaos glBindVertexArray(vao[0]); glDrawElementsInstanced(GL_TRIANGLES, cube_triangleCount * 3, GL_UNSIGNED_INT, (void*)0, 4); glBindVertexArray(vao[1]); glDrawElements(GL_TRIANGLES, plane_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); // Unbind framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0); // Viewport glViewport( 0, 0, width, height ); // Clear the front buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Bind lighting shader glUseProgram(lighting_shader.program); // Upload uniforms glUniform1i(lighting_materialLocation, 0); glUniform1i(lighting_normalLocation, 1); glUniform1i(lighting_depthLocation, 2); glUniform3fv(lighting_cameraPositionLocation, 1, glm::value_ptr(camera.eye)); glUniformMatrix4fv(lighting_inverseViewProjectionLocation, 1, 0, glm::value_ptr(screenToWorld)); // Bind color to unit 0 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, gbufferTextures[0]); // Bind normal to unit 1 glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, gbufferTextures[1]); // Bind depth to unit 2 glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, gbufferTextures[2]); // Blit above the rest glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); for (int i = 0; i < (int) numLights; ++i) { float tl = t * i; //Update light uniforms float lightPosition[3] = { sinf(tl) * 10.f, -0.5f, cosf(tl) * 10.f}; float lightColor[3] = {sinf(tl) * 1.f, 1.f - cosf(tl), -sinf(tl)}; float lightIntensity = 10.0; glUniform3fv(lighting_lightPositionLocation, 1, lightPosition); glUniform3fv(lighting_lightColorLocation, 1, lightColor); glUniform1f(lighting_lightIntensityLocation, lightIntensity); // Draw quad glBindVertexArray(vao[2]); glDrawElements(GL_TRIANGLES, quad_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); } glDisable(GL_BLEND); // Bind blit shader glUseProgram(blit_shader.program); // Upload uniforms glUniform1i(blit_tex1Location, 0); // use only unit 0 glActiveTexture(GL_TEXTURE0); // Viewport glViewport( 0, 0, width/3, height/4 ); // Bind texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[0]); // Draw quad glBindVertexArray(vao[2]); glDrawElements(GL_TRIANGLES, quad_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); // Viewport glViewport( width/3, 0, width/3, height/4 ); // Bind texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[1]); // Draw quad glBindVertexArray(vao[2]); glDrawElements(GL_TRIANGLES, quad_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); // Viewport glViewport( width/3 * 2, 0, width/3, height/4 ); // Bind texture glBindTexture(GL_TEXTURE_2D, gbufferTextures[2]); // Draw quad glBindVertexArray(vao[2]); glDrawElements(GL_TRIANGLES, quad_triangleCount * 3, GL_UNSIGNED_INT, (void*)0); #if 1 // Draw UI glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0, 0, width, height); unsigned char mbut = 0; int mscroll = 0; int mousex; int mousey; glfwGetMousePos(&mousex, &mousey); mousey = height - mousey; if( leftButton == GLFW_PRESS ) mbut |= IMGUI_MBUT_LEFT; imguiBeginFrame(mousex, mousey, mbut, mscroll); int logScroll = 0; char lineBuffer[512]; imguiBeginScrollArea("001", width - 210, height - 310, 200, 300, &logScroll); sprintf(lineBuffer, "FPS %f", fps); imguiLabel(lineBuffer); imguiSlider("Lights", &numLights, 0.0, 100.0, 1.0); imguiEndScrollArea(); imguiEndFrame(); imguiRenderGLDraw(width, height); glDisable(GL_BLEND); #endif // Check for errors GLenum err = glGetError(); if(err != GL_NO_ERROR) { fprintf(stderr, "OpenGL Error : %s\n", gluErrorString(err)); } // Swap buffers glfwSwapBuffers(); } // Check if the ESC key was pressed or the window was closed while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS && glfwGetWindowParam( GLFW_OPENED ) ); // Clean UI imguiRenderGLDestroy(); // Close OpenGL window and terminate GLFW glfwTerminate(); exit( EXIT_SUCCESS ); }
int main(int argc, char **argv) { wrt = (struct warp_runtime *)malloc(sizeof(struct warp_runtime)); assert(NULL != wrt); memset(wrt, 0, sizeof(struct warp_runtime)); create_warp_runtime(wrt); glViewport(0, 0, 500, 500); /* setup shader & program */ GLchar message[512]; GLint status; GLchar *source = NULL; GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); load_shader_from_file("shaders/es3_ubo.vert", &source); glShaderSource(vertex_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(vertex_shader, 512, NULL, message); printf("%s\n", message); } GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); free(source); load_shader_from_file("shaders/es3_ubo.frag", &source); glShaderSource(fragment_shader, 1, (const GLchar * const*)&source, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderInfoLog(fragment_shader, 512, NULL, message); printf("%s\n", message); } GLuint prog = glCreateProgram(); glAttachShader(prog, vertex_shader); glAttachShader(prog, fragment_shader); glLinkProgram(prog); glGetProgramiv(prog, GL_LINK_STATUS, &status); if (!status) { glGetProgramInfoLog(prog, 512, NULL, message); printf("%s\n", message); } glUseProgram(prog); /* set up resource */ GLfloat pos_buf[] = { -0.25f, 0.25f, 0.0f, 0.25f, -0.25f, 0.0f, -0.25f, -0.25f, 0.0f, 0.25f, 0.25f, 0.0f }; GLfloat color_buf[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, }; GLushort index_buf[] = { 2, 0, 1, 3 }; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); /* setup array buffer for position and color */ GLuint vbo_pos; glGenBuffers(1, &vbo_pos); glBindBuffer(GL_ARRAY_BUFFER, vbo_pos); glBufferData(GL_ARRAY_BUFFER, sizeof(pos_buf), pos_buf, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0); GLuint vbo_color; glGenBuffers(1, &vbo_color); glBindBuffer(GL_ARRAY_BUFFER, vbo_color); glBufferData(GL_ARRAY_BUFFER, sizeof(color_buf), color_buf, GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid *)0); /* setup index buffer for index */ GLuint vbo_index; glGenBuffers(1, &vbo_index); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_index); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index_buf), index_buf, GL_STATIC_DRAW); /* updating uniform block */ glm::mat4 model_mat = glm::mat4(1.0f); glm::mat4 view_mat = glm::lookAt( glm::vec3(-2, 1, 2), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0) ); glm::mat4 proj_mat = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f); GLuint ubo_blk_idx = glGetUniformBlockIndex(prog, "MVP"); GLint ubo_sz; glGetActiveUniformBlockiv(prog, ubo_blk_idx, GL_UNIFORM_BLOCK_DATA_SIZE, &ubo_sz); const char *names[3] = {"uModel", "uView", "uProj"}; GLuint indices[3]; GLint size[3]; GLint offset[3]; GLint type[3]; glGetUniformIndices(prog, 3, names, indices); glGetActiveUniformsiv(prog, 3, indices, GL_UNIFORM_OFFSET, offset); glGetActiveUniformsiv(prog, 3, indices, GL_UNIFORM_SIZE, size); glGetActiveUniformsiv(prog, 3, indices, GL_UNIFORM_TYPE, type); /* mat4 here is 4x4=16 GLfloat */ GLubyte *buffer = (GLubyte *)malloc(ubo_sz); memcpy(buffer + offset[0], &model_mat[0][0], size[0] * sizeof(GLfloat) * 16); memcpy(buffer + offset[1], &view_mat[0][0], size[1] * sizeof(GLfloat) * 16); memcpy(buffer + offset[2], &proj_mat[0][0], size[2] * sizeof(GLfloat) * 16); GLuint ubo; glGenBuffers(1, &ubo); glBindBuffer(GL_UNIFORM_BUFFER, ubo); glBufferData(GL_UNIFORM_BUFFER, ubo_sz, buffer, GL_STATIC_DRAW); glBindBufferBase(GL_UNIFORM_BUFFER, ubo_blk_idx, ubo); /* game loop */ while (1) { XNextEvent(wrt->x11_display, &(wrt->event)); switch(wrt->event.type) { case Expose: /* do the render */ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0); glBindVertexArray(0); eglSwapBuffers(wrt->egl_display, wrt->egl_surface); break; case ButtonPress: case KeyPress: goto finish; default: break; } } finish: glDeleteBuffers(1, &vbo_pos); glDeleteBuffers(1, &vbo_color); glDeleteBuffers(1, &vbo_index); glDeleteBuffers(1, &ubo); glDeleteVertexArrays(1, &vao); glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); glDeleteProgram(prog); destroy_warp_runtime(wrt); return 0; }