void RenderTarget::draw(Shader* shader, const glm::vec2& pos, const glm::vec2& size){ glm::mat4 model(1.f); model = glm::translate(model, glm::vec3(pos.x, pos.y, 0.0f)); model = glm::scale(model, glm::vec3(size.x, size.y, 1.0f)); Shader::upload_model_matrix(model); shader->bind(); texture_bind(Shader::TEXTURE_2D_0); depth_bind(Shader::TEXTURE_2D_1); glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]); glVertexAttribPointer(Shader::ATTR_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, pos)); glVertexAttribPointer(Shader::ATTR_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, uv)); glVertexAttribPointer(Shader::ATTR_NORMAL, 3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, normal)); glVertexAttribPointer(Shader::ATTR_TANGENT, 3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, tangent)); glVertexAttribPointer(Shader::ATTR_BITANGENT, 3, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, bitangent)); glVertexAttribPointer(Shader::ATTR_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Shader::vertex_t), (const GLvoid*)offsetof(Shader::vertex_t, color)); glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, 0); }
void derp (void) { const struct aiScene *csc; struct aiScene *sc; struct aiMesh *me; GLuint vb, nb, tb; GLuint ctex; GLuint dtex; GLuint fbo; GLuint dpp; GLint dpp_cat0_loc; csc = aiImportFile ("../data/n1.dae", aiProcess_Triangulate | aiProcess_PreTransformVertices); sc = (struct aiScene *)csc; g_xassert (sc); g_xassert (sc->mNumMeshes >= 1); g_xassert (sc->mNumMaterials >= 1); me = sc->mMeshes[0]; g_xassert (aiPrimitiveType_TRIANGLE == me->mPrimitiveTypes); mesh_buffers_extract (me, &vb, &nb, &tb); /* Save Viewport, Modelview, Projection. * Then set them to sane defaults. * * Empirical test indicates projection set to Ortho, * Modelview set to Identity, Viewport set to 0,0,w,h. * * ModelView and Viewport are fine but Projection has to go, * as I plan setting it myself. */ allegro_ffp_restore (RESTORE_MODE_SAVE, RESTORE_SUB_ALLEGRO); /* * Do not do this... * While it is useful to play it safe and save & restore viewport/mst, * I am not actually supposed to set over allegro's stuff, right? * Actually: * Need to use allegro's original settings when using the * drawing routines targeting framebuffer 0. (eg debug_draw_tex_quad) * It is correct to LoadIdentity the projection stack, * but fix said routines to use allegro state. */ glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); /* Clear the default framebuffer (Optional) */ glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0); glClearColor (0, 0, 1, 1); glClear (GL_COLOR_BUFFER_BIT); /* Create two textures, a color and a depth. */ glGenTextures (1, &ctex); glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, ctex); glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glGenTextures (1, &dtex); glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, dtex); glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24_ARB, 640, 480, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); check_gl_error (); /* Create a FBO and attach the newly created textures */ glGenFramebuffersEXT (1, &fbo); glBindFramebufferEXT (GL_FRAMEBUFFER, fbo); glFramebufferTexture2DEXT (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ctex, 0); glFramebufferTexture2DEXT (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, dtex, 0); g_xassert (GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatusEXT (GL_FRAMEBUFFER)); check_gl_error (); /* Create the depth pass program. (Vertex shader only, do nothing) */ dpp = depth_pass_program (); check_gl_error (); struct DepthData ds; ds.fbo = fbo; ds.ab = vb; ds.dpp = dpp; depth_bind (&ds); { glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); //glOrtho (-2.5, 2.5, -2.5, 2.5, -5, 5); gluPerspective (90.0f, 1.0f, 1.0f, 5.0f); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glTranslatef (0.0f, 0.0f, -2.5f); glDrawBuffer (GL_COLOR_ATTACHMENT0); glClear (GL_DEPTH_BUFFER_BIT); glBindBuffer (GL_ARRAY_BUFFER, ds.ab); glVertexAttribPointer (ds._cat0_loc, 3, GL_FLOAT, GL_FALSE, 0, 0); glUseProgram (ds.dpp); glDrawArrays (GL_TRIANGLES, 0, me->mNumFaces * 3); glUseProgram (0); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); } depth_unbind (&ds); debug_draw_tex_quad (ctex, 100, 0, 100, 100); debug_draw_tex_quad (dtex, 100, 150, 100, 100); /** * Material stuff, move elsewhere or something. */ struct aiMaterial *mat; struct aiColor4D col_diff; struct aiColor4D col_spec; g_xassert (sc->mNumMaterials >= 1); mat = sc->mMaterials[me->mMaterialIndex]; g_xassert (AI_SUCCESS == aiGetMaterialColor (mat, AI_MATKEY_COLOR_DIFFUSE, &col_diff)); g_xassert (AI_SUCCESS == aiGetMaterialColor (mat, AI_MATKEY_COLOR_SPECULAR, &col_spec)); struct MaterialFbo mf = {0}; mf.tdep = dtex; material_create_fbo (&mf); /** * Warning: * Remember to unbind the depth texture (dtex) from depth_stage fbo, * Rebind it as texture for rendering. (Don't need to unbind?) * (4.4.2) ""A single framebuffer-attachable image may be attached * to multiple framebuffer objects"" * Not sure about whether unbind required. * (4.4.3) Warns about Feedback loops, which do apply. */ struct MaterialData ms = {0}; ms.fbo = mf._fbo; ms.ctex = blender_tex; ms.dtex = dtex; ms.mpp = material_pass_program (); ms.vb = vb; ms.nb = nb; ms.tb = tb; material_bind (&ms); { glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); //glOrtho (-2.5, 2.5, -2.5, 2.5, -5, 5); gluPerspective (90.0f, 1.0f, 1.0f, 5.0f); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glTranslatef (0.0f, 0.0f, -2.5f); GLenum material_draw_buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; glDrawBuffers (3, material_draw_buffers); glBindBuffer (GL_ARRAY_BUFFER, ms.vb); glVertexAttribPointer (ms._cat0_loc, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer (GL_ARRAY_BUFFER, ms.nb); glVertexAttribPointer (ms._cat1_nor, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer (GL_ARRAY_BUFFER, ms.tb); glVertexAttribPointer (ms._cat2_tex, 3, GL_FLOAT, GL_FALSE, 0, 0); /* Program needs to be active to load Uniforms */ glUseProgram (ms.mpp); /** * Texture unit 0, * make sure diffuse / color texture is glBindTexture'd * while glActiveTexture is zero. */ glUniform1i (ms._tex0, 0); /* Also go load diffuse, specular out of the aiColor4Ds */ glUniform4f (ms._diffuse, col_diff.r, col_diff.g, col_diff.b, col_diff.a); glUniform4f (ms._specular, col_spec.r, col_spec.g, col_spec.b, col_spec.a); glActiveTexture (GL_TEXTURE0); glEnable (GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, ms.ctex); glDrawArrays (GL_TRIANGLES, 0, me->mNumFaces * 3); glUseProgram (0); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); } material_unbind (&ms); /** * I believe I don't have the right COLOR_ATTACHMENTs during material stage. * In any case ctex probably ends up as normals. * Creating a new FBO for the material stage is probably ok. * * Warning: * For unknown reason the model, automaticall unwrapped by Blender * (Select all faces -> U -> Unwrap) had its UV coordinates screwed up. * Re-exporting with a proper UV map somehow fixed the problem. * * Blender settings: (Texure Properties) * Image/Source: Single Image * Mapping/Coordinates: UV * Mapping Layer: (Empty) * Mapping/Projection: Flat */ //debug_draw_tex_quad (ctex, 200, 0, 100, 100); debug_draw_tex_quad (mf._tnor, 200, 0, 100, 100); debug_draw_tex_quad (mf._tdiff, 200, 110, 100, 100); debug_draw_tex_quad (mf._tspec, 200, 220, 100, 100); /* 3.4 Lighting Stage */ struct LightingFbo lf = {0}; lf.tdep = dtex; lighting_create_fbo (&lf); struct LightingData ls = {0}; ls.fbo = lf._fbo; ls.lpp = lighting_ambient_pass_program (); ls.dtex = dtex; ls.tnor = mf._tnor; ls.tdiff = mf._tdiff; ls.tspec = mf._tspec; lighting_bind (&ls); { } lighting_unbind (&ls); /* Restore the saved allegro settings */ allegro_ffp_restore (RESTORE_MODE_RESTORE, RESTORE_SUB_ALLEGRO); }