示例#1
0
__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;
}
示例#2
0
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;
}
示例#3
0
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());
}
示例#5
0
	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());
}
示例#7
0
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();
  }
}