Axiom.RenderSystems.OpenGL.GLTexture.createInternalResources C# (CSharp) Метод

createInternalResources() защищенный Метод

protected createInternalResources ( ) : void
Результат void
		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;
		}