protected override void createInternalResources()
{
// Convert to nearest power-of-two size if required
Width = GLPixelUtil.OptionalPO2( Width );
Height = GLPixelUtil.OptionalPO2( Height );
Depth = GLPixelUtil.OptionalPO2( Depth );
// Adjust format if required
Format = TextureManager.Instance.GetNativeFormat( TextureType, Format, Usage );
// Check requested number of mipmaps
int maxMips = GLPixelUtil.GetMaxMipmaps( Width, Height, Depth, Format );
MipmapCount = RequestedMipmapCount;
if ( MipmapCount > maxMips )
MipmapCount = maxMips;
// Generate texture name
Gl.glGenTextures( 1, out _glTextureID );
// Set texture type
Gl.glBindTexture( GLTextureType, _glTextureID );
// This needs to be set otherwise the texture doesn't get rendered
Gl.glTexParameteri( GLTextureType, Gl.GL_TEXTURE_MAX_LEVEL, MipmapCount );
// Set some misc default parameters so NVidia won't complain, these can of course be changed later
Gl.glTexParameteri( GLTextureType, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST );
Gl.glTexParameteri( GLTextureType, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST );
Gl.glTexParameteri( GLTextureType, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE );
Gl.glTexParameteri( GLTextureType, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE );
// If we can do automip generation and the user desires this, do so
MipmapsHardwareGenerated = Root.Instance.RenderSystem.Capabilities.HasCapability( Capabilities.HardwareMipMaps );
if ( ( ( Usage & TextureUsage.AutoMipMap ) == TextureUsage.AutoMipMap ) &&
RequestedMipmapCount != 0 && MipmapsHardwareGenerated )
{
Gl.glTexParameteri( GLTextureType, Gl.GL_GENERATE_MIPMAP, Gl.GL_TRUE );
}
// Allocate internal buffer so that glTexSubImageXD can be used
// Internal format
int format = GLPixelUtil.GetClosestGLInternalFormat( Format );
int width = Width;
int height = Height;
int depth = Depth;
{
// Run through this process to pregenerate mipmap pyramid
for ( int mip = 0; mip <= MipmapCount; mip++ )
{
// Normal formats
switch ( TextureType )
{
case TextureType.OneD:
Gl.glTexImage1D( Gl.GL_TEXTURE_1D, mip, format, width, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, IntPtr.Zero );
break;
case TextureType.TwoD:
Gl.glTexImage2D( Gl.GL_TEXTURE_2D, mip, format, width, height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, IntPtr.Zero );
break;
case TextureType.ThreeD:
Gl.glTexImage3D( Gl.GL_TEXTURE_3D, mip, format, width, height, depth, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, IntPtr.Zero );
break;
case TextureType.CubeMap:
for ( int face = 0; face < 6; face++ )
{
Gl.glTexImage2D( Gl.GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mip, format, width, height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, IntPtr.Zero );
}
break;
};
if ( width > 1 )
width = width / 2;
if ( height > 1 )
height = height / 2;
if ( depth > 1 )
depth = depth / 2;
}
}
_createSurfaceList();
// Get final internal format
Format = GetBuffer( 0, 0 ).Format;
}