private static bool setupFrameBuffer(ref int fbo, ref int fbo_tex, ref int texWidth, ref int texHeight) { for (int i = 0; i < 8; i++) { if (difftextures[i] != null) { texHeight = difftextures[i].height; texWidth = difftextures[i].width; break; } } if (texWidth == 0 || texHeight == 0) { //F*****G HG HAS F*****G EMPTY TEXTURES WTF AM I SUPPOSED TO MIX HERE return(false); } //Diffuse Output fbo_tex = Sampler.generate2DTexture(PixelInternalFormat.Rgba, texWidth, texHeight, PixelFormat.Rgba, PixelType.UnsignedByte, 1); Sampler.setupTextureParameters(TextureTarget.Texture2D, fbo_tex, (int)TextureWrapMode.Repeat, (int)TextureMagFilter.Linear, (int)TextureMinFilter.LinearMipmapLinear, 4.0f); //Create New RenderBuffer for the diffuse fbo = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, fbo); //Attach Textures to this FBO GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, fbo_tex, 0); //Check Debug.Assert(GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) == FramebufferErrorCode.FramebufferComplete); //Bind the FBO GL.BindFramebuffer(FramebufferTarget.Framebuffer, fbo); //Set Viewport GL.GetInteger(GetPName.Viewport, old_vp_size); GL.Viewport(0, 0, texWidth, texHeight); return(true); }
private static Texture mixNormalTextures(int texWidth, int texHeight) { //Upload Textures //BIND TEXTURES Texture tex; int loc; Texture dMask = Common.RenderState.activeResMgr.texMgr.getTexture("default_mask.dds"); Texture dDiff = Common.RenderState.activeResMgr.texMgr.getTexture("default.dds"); //USE PROGRAM int pass_program = Common.RenderState.activeResMgr.GLShaders[GLSLHelper.SHADER_TYPE.TEXTURE_MIX_SHADER].program_id; GL.UseProgram(pass_program); //Upload base Layers Used int baseLayerIndex = 0; loc = GL.GetUniformLocation(pass_program, "lbaseLayersUsed"); if (loc >= 0) { for (int i = 0; i < 8; i++) { if (normaltextures[i] != null) { GL.Uniform1(loc + i, 1.0f); baseLayerIndex = i; } else { GL.Uniform1(loc + i, 0.0f); } } } loc = GL.GetUniformLocation(pass_program, "baseLayerIndex"); GL.Uniform1(loc, baseLayerIndex); //No need for extra alpha tetuxres loc = GL.GetUniformLocation(pass_program, "use_alpha_textures"); GL.Uniform1(loc, 1.0f); //Upload DiffuseTextures as alphaTextures loc = GL.GetUniformLocation(pass_program, "alphaTex"); if (loc >= 0) { for (int i = 0; i < 8; i++) { if (difftextures[i] != null) { tex = difftextures[i]; } else { tex = dMask; } //Upload diffuse Texture GL.Uniform1(loc + i, i); // I need to upload the texture unit number int tex0Id = (int)TextureUnit.Texture0; GL.ActiveTexture((TextureUnit)(tex0Id + i)); GL.BindTexture(tex.target, tex.texID); } } //Upload maskTextures loc = GL.GetUniformLocation(pass_program, "mainTex"); if (loc >= 0) { for (int i = 0; i < 8; i++) { if (normaltextures[i] != null) { tex = normaltextures[i]; } else { tex = dMask; } //Upload diffuse Texture GL.Uniform1(loc + i, 8 + i); // I need to upload the texture unit number int tex0Id = (int)TextureUnit.Texture8; GL.ActiveTexture((TextureUnit)(tex0Id + i)); GL.BindTexture(tex.target, tex.texID); } } //Activate Recoloring loc = GL.GetUniformLocation(pass_program, "recolor_flag"); GL.Uniform1(loc, 0.0f); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.BindVertexArray(RenderState.activeResMgr.GLPrimitiveVaos["default_renderquad"].vao_id); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); GL.DrawElements(PrimitiveType.Triangles, 6, DrawElementsType.UnsignedInt, IntPtr.Zero); //Console.WriteLine("MixTextures5, Last GL Error: " + GL.GetError()); int out_tex_2darray_mask = Sampler.generateTexture2DArray(PixelInternalFormat.Rgba8, texWidth, texHeight, 1, PixelFormat.Rgba, PixelType.UnsignedByte, 11); Sampler.setupTextureParameters(TextureTarget.Texture2DArray, out_tex_2darray_mask, (int)TextureWrapMode.Repeat, (int)TextureMagFilter.Linear, (int)TextureMinFilter.LinearMipmapLinear, 4.0f); //Copy the read buffers to the GL.BindTexture(TextureTarget.Texture2DArray, out_tex_2darray_mask); GL.ReadBuffer(ReadBufferMode.ColorAttachment0); GL.CopyTexSubImage3D(TextureTarget.Texture2DArray, 0, 0, 0, 0, 0, 0, texWidth, texHeight); //Generate Mipmaps to the new textures from the base level Sampler.generateTexture2DArrayMipmaps(out_tex_2darray_mask); //Find name for textures //Store Diffuse Texture to material Texture new_tex = new Texture(); new_tex.texID = out_tex_2darray_mask; new_tex.target = TextureTarget.Texture2DArray; #if (DUMP_TEXTURES) GL.ReadBuffer(ReadBufferMode.ColorAttachment0); Sampler.dump_texture("normal", texWidth, texHeight); #endif return(new_tex); }