__attribute__((visibility("default"))) ovrTextureSwapChain *vrapi_CreateTextureSwapChain( ovrTextureType type, ovrTextureFormat format, int width, int height, int levels, bool buffered) { if(vrapi_hooks.vrapi_CreateTextureSwapChain_real == NULL || vrapi_hooks.vrapi_GetTextureSwapChainHandle_real == NULL || vrapi_hooks.vrapi_GetTextureSwapChainLength_real == NULL) { vrapi_hooks.SetupHooks(); } ovrTextureSwapChain *texture_swapchain = vrapi_hooks.vrapi_CreateTextureSwapChain_real(type, format, width, height, levels, buffered); if(m_GLDriver) { int tex_count = vrapi_hooks.vrapi_GetTextureSwapChainLength_real(texture_swapchain); SCOPED_LOCK(glLock); for(int i = 0; i < tex_count; ++i) { GLuint tex = vrapi_hooks.vrapi_GetTextureSwapChainHandle_real(texture_swapchain, i); GLenum internalformat = GetInternalFormat(format); GLenum textureType = GetTextureType(type); gl_CurChunk = GLChunk::vrapi_CreateTextureSwapChain; m_GLDriver->CreateVRAPITextureSwapChain(tex, textureType, internalformat, width, height, levels); } } return texture_swapchain; }
RenderTexturePtr RenderTexture::Create(int width, int height, Type type, Texture::Format textureFormat, bool compressed /*= false*/) { unsigned int tType = type; if (textureFormat == GL_DEPTH_COMPONENT || textureFormat == GL_DEPTH_STENCIL) { tType = GL_TEXTURE_2D; } GLuint texture; glGenTextures(1, &texture); glBindTexture(tType, texture); glTexParameteri(tType, GL_TEXTURE_MIN_FILTER, 0x2600); glTexParameteri(tType, GL_TEXTURE_MAG_FILTER, 0x2600); glTexParameterf(tType, GL_TEXTURE_WRAP_S, 0x812F); glTexParameterf(tType, GL_TEXTURE_WRAP_T, 0x812F); if (textureFormat == GL_DEPTH_COMPONENT || textureFormat == GL_DEPTH_STENCIL) { // This is to allow usage of shadow2DProj function in the shader glTexParameteri(tType, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); glTexParameteri(tType, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); } int texIntFrmt = textureFormat; int texFrmt = GL_RGB; GetInternalFormat(tType, textureFormat, &texIntFrmt, &texFrmt); glTexImage2D(tType, 0, textureFormat, width, height, 0, texIntFrmt, texFrmt, 0); glBindTexture(tType, 0); unsigned int bindingType; //get binding type switch (tType) { case GL_TEXTURE_1D: bindingType = GL_TEXTURE_BINDING_1D; break; case GL_TEXTURE_3D: bindingType = GL_TEXTURE_BINDING_3D; break; case GL_TEXTURE_2D: default: bindingType = GL_TEXTURE_BINDING_2D; break; } RenderTexturePtr tex = RenderTexturePtr(new RenderTexture(tType, bindingType)); tex->m_Width = width; tex->m_Height = height; tex->m_TextureId = texture; tex->m_Format = (Texture::Format)texIntFrmt; tex->m_Type = texFrmt; tex->m_InternalFormat = texIntFrmt; return tex; }
void glArchivItem_Bitmap::FillTexture() { int iformat = GetInternalFormat(), dformat = GL_BGRA; std::vector<unsigned char> buffer(tex_width_ * tex_height_ * 4); print(&buffer.front(), tex_width_, tex_height_, libsiedler2::FORMAT_RGBA, palette_, 0, 0, 0, 0, 0, 0); glTexImage2D(GL_TEXTURE_2D, 0, iformat, tex_width_, tex_height_, 0, dformat, GL_UNSIGNED_BYTE, &buffer.front()); }
void glArchivItem_Bitmap::FillTexture() { int iformat = GetInternalFormat(), dformat = GL_BGRA; const Extent texSize = GetTexSize(); libsiedler2::PixelBufferARGB buffer(texSize.x, texSize.y); print(buffer); glTexImage2D(GL_TEXTURE_2D, 0, iformat, texSize.x, texSize.y, 0, dformat, GL_UNSIGNED_BYTE, buffer.getPixelPtr()); }
void TextureData2D :: Upload ( int target ) { glTexImage2D ( target, 0, GetInternalFormat ( ), Width, Height, 0, GetPixelFormat ( ), GL_FLOAT, Pixels ); }
void glArchivItem_Bitmap_Player::FillTexture() { // Spezialpalette (blaue Spielerfarben sind Grau) verwenden, // damit man per OpenGL einfärben kann! setPalette(LOADER.GetPaletteN("colors")); int iformat = GetInternalFormat(), dformat = GL_BGRA; //GL_BGRA_EXT; std::vector<unsigned char> buffer(tex_width_ * 2 * tex_height_ * 4); print(&buffer.front(), tex_width_ * 2, tex_height_, libsiedler2::FORMAT_RGBA, palette_, 128, 0, 0, 0, 0, 0, 0, false); print(&buffer.front(), tex_width_ * 2, tex_height_, libsiedler2::FORMAT_RGBA, palette_, 128, tex_width_, 0, 0, 0, 0, 0, true); glTexImage2D(GL_TEXTURE_2D, 0, iformat, tex_width_ * 2, tex_height_, 0, dformat, GL_UNSIGNED_BYTE, &buffer.front()); }
void csGLRender2TextureFramebuf::GrabFramebuffer (const RTAttachment<>& target, InternalFormatClass fmtClass) { csGLBasicTextureHandle* tex_mm = static_cast<csGLBasicTextureHandle*> ((iTextureHandle*)target.texture); tex_mm->Precache (); // Texture is in tha cache, update texture directly. G3D->ActivateTexture (tex_mm); GLenum internalFormat = 0; /* Texture has a keycolor - so we need to deal specially with it * to make sure the keycolor gets transparent. */ if (tex_mm->GetKeyColor ()) { // @@@ Processing sucks, but how else to handle keycolor? const size_t numPix = txt_w * txt_h; pixelScratch.SetSize (numPix * 4); glReadPixels (0, 0, txt_w, txt_h, GL_RGBA, GL_UNSIGNED_BYTE, pixelScratch.GetArray()); csRGBpixel key; tex_mm->GetKeyColor (key.red, key.green, key.blue); csBakeKeyColor::RGBA2D (pixelScratch.GetArray(), pixelScratch.GetArray(), txt_w, txt_h, key); tex_mm->Blit (0, 0, txt_w, txt_h, pixelScratch.GetArray()); } else { GLenum textarget = tex_mm->GetGLTextureTarget(); if ((textarget != GL_TEXTURE_2D) && (textarget != GL_TEXTURE_3D) && (textarget != GL_TEXTURE_RECTANGLE_ARB) && (textarget != GL_TEXTURE_CUBE_MAP)) return; bool handle_subtexture = (textarget == GL_TEXTURE_CUBE_MAP); bool handle_3d = (textarget == GL_TEXTURE_3D); /* Reportedly, some drivers crash if using CopyTexImage on a texture * size larger than the framebuffer. Use CopyTexSubImage then. */ bool needSubImage = (txt_w > viewportHelper.GetVPWidth()) || (txt_h > viewportHelper.GetVPHeight()); // Texture was not used as a render target before. // Make some necessary adjustments. if (needSubImage) { if (!tex_mm->IsWasRenderTarget()) { internalFormat = GetInternalFormat (fmtClass, tex_mm); GLenum baseFormat = GetBaseFormat (fmtClass, tex_mm); tex_mm->SetupAutoMipping(); tex_mm->SetWasRenderTarget (true); tex_mm->texFormat = iTextureHandle::RGBA8888; // Gah. Turn target texture to required storage. if (handle_subtexture) { for (int i = 0; i < 6; i++) glTexImage2D ( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + i, 0, internalFormat, txt_w, txt_h,0, baseFormat, GL_UNSIGNED_BYTE, 0); } else if (handle_3d) { G3D->ext->glTexImage3D (textarget, 0, internalFormat, txt_w, txt_h, txt_d, 0, baseFormat, GL_UNSIGNED_BYTE, 0); } else glTexImage2D (textarget, 0, internalFormat, txt_w, txt_h, 0, baseFormat, GL_UNSIGNED_BYTE, 0); } int orgX = viewportHelper.GetVPOfsX(); int orgY = viewportHelper.GetOriginalFramebufferHeight() - (viewportHelper.GetVPOfsY() + csMin (txt_h, viewportHelper.GetVPHeight())); if (handle_subtexture) glCopyTexSubImage2D ( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + target.subtexture, 0, 0, 0, orgX, orgY, csMin (txt_w, viewportHelper.GetVPWidth()), csMin (txt_h, viewportHelper.GetVPHeight())); else if (handle_3d) G3D->ext->glCopyTexSubImage3D (textarget, 0, 0, 0, orgX, orgY, target.subtexture, csMin (txt_w, viewportHelper.GetVPWidth()), csMin (txt_h, viewportHelper.GetVPHeight())); else glCopyTexSubImage2D (textarget, 0, 0, 0, orgX, orgY, csMin (txt_w, viewportHelper.GetVPWidth()), csMin (txt_h, viewportHelper.GetVPHeight())); } else { int orgX = viewportHelper.GetVPOfsX(); int orgY = viewportHelper.GetOriginalFramebufferHeight() - (viewportHelper.GetVPOfsY() + txt_h); if (!tex_mm->IsWasRenderTarget()) { internalFormat = GetInternalFormat (fmtClass, tex_mm); tex_mm->SetupAutoMipping(); tex_mm->SetWasRenderTarget (true); tex_mm->texFormat = iTextureHandle::RGBA8888; if (handle_subtexture) glCopyTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + target.subtexture, 0, internalFormat, orgX, orgY, txt_w, txt_h, 0); else if (handle_3d) { // Gah. Turn target texture to required storage. GLenum baseFormat = GetBaseFormat (fmtClass, tex_mm); G3D->ext->glTexImage3D (textarget, 0, internalFormat, txt_w, txt_h, txt_d, 0, baseFormat, GL_UNSIGNED_BYTE, 0); G3D->ext->glCopyTexSubImage3D (textarget, 0, 0, 0, orgX, orgY, target.subtexture, txt_w, txt_h); } else glCopyTexImage2D (textarget, 0, internalFormat, orgX, orgY, txt_w, txt_h, 0); } else { glGetTexLevelParameteriv ((textarget == GL_TEXTURE_CUBE_MAP) ? GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB : textarget, 0, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&internalFormat); if (handle_subtexture) glCopyTexSubImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + target.subtexture, 0, 0, 0, orgX, orgY, txt_w, txt_h); else if (handle_3d) G3D->ext->glCopyTexSubImage3D (textarget, 0, 0, 0, orgX, orgY, target.subtexture, txt_w, txt_h); else glCopyTexSubImage2D (textarget, 0, 0, 0, orgX, orgY, txt_w, txt_h); } } tex_mm->RegenerateMipmaps(); } }