Графическая библиотека для игры - C#
Формулировка задачи:
Добрый день дорогие. Вдруг захотелось написать свою игру с нуля(в том числе и движок) и настал момент выбора графической библиотеки. Кроме чистых opengl и directx какие еще есть варианты? Может на их основе были написаны другие библиотеки. Предлагайте все варианты, а я уже выберут самый оптимальный вариант. Заранее спасибо.
Решение задачи: «Графическая библиотека для игры»
textual
Листинг программы
- using System.IO;
- using OpenTK.Graphics.OpenGL;
- using System;
- namespace PointWithCustomSizeAndColour
- {
- class ShaderLoader
- {
- private static string infoFileName = null;
- ///<summary>
- ///Create a program object and make current
- ///</summary>
- ///<param name="vShader">a vertex shader program</param>
- ///<param name="fShader">a fragment shader program</param>
- ///<param name="program">created program</param>
- ///<returns>
- ///return true, if the program object was created and successfully made current
- ///</returns>
- public static bool InitShaders(string vShader, string fShader, out int program)
- {
- program = CreateProgram(vShader, fShader);
- if (program == 0)
- {
- File.AppendAllText(infoFileName, "Failed to create program" + Environment.NewLine);
- return false;
- }
- GL.UseProgram(program);
- return true;
- }
- ///<summary>
- ///Load a shader from a file
- ///</summary>
- ///<param name="infoFileName">a file name for errors</param>
- ///<param name="fileName">a file name to a shader</param>
- ///<param name="shaderSource">a shader source string</param>
- public static void LoadShader(string infoFileName, string fileName, out string shaderSource)
- {
- ShaderLoader.infoFileName = infoFileName;
- if (File.Exists(infoFileName))
- {
- // Clear File
- File.WriteAllText(infoFileName, "");
- }
- shaderSource = null;
- using (StreamReader sr = new StreamReader(fileName))
- {
- shaderSource = sr.ReadToEnd();
- }
- }
- private static int CreateProgram(string vShader, string fShader)
- {
- // Create shader object
- int vertexShader = LoadShader(ShaderType.VertexShader, vShader);
- int fragmentShader = LoadShader(ShaderType.FragmentShader, fShader);
- if (vertexShader == 0 || fragmentShader == 0)
- {
- return 0;
- }
- // Create a program object
- int program = GL.CreateProgram();
- if (program == 0)
- {
- return 0;
- }
- // Attach the shader objects
- GL.AttachShader(program, vertexShader);
- GL.AttachShader(program, fragmentShader);
- // Link the program object
- GL.LinkProgram(program);
- // Check the result of linking
- int status;
- GL.GetProgram(program, GetProgramParameterName.LinkStatus, out status);
- if (status == 0)
- {
- string errorString = string.Format("Failed to link program: {0}" + Environment.NewLine, GL.GetProgramInfoLog(program));
- File.AppendAllText(infoFileName, errorString);
- GL.DeleteProgram(program);
- GL.DeleteShader(vertexShader);
- GL.DeleteShader(fragmentShader);
- return 0;
- }
- return program;
- }
- private static int LoadShader(ShaderType shaderType, string shaderSource)
- {
- // Create shader object
- int shader = GL.CreateShader(shaderType);
- if (shader == 0)
- {
- File.AppendAllText(infoFileName, "Unable to create shader" + Environment.NewLine);
- return 0;
- }
- // Set the shader program
- GL.ShaderSource(shader, shaderSource);
- // Compile the shader
- GL.CompileShader(shader);
- // Check the result of compilation
- int status;
- GL.GetShader(shader, ShaderParameter.CompileStatus, out status);
- if (status == 0)
- {
- string errorString = string.Format("Failed to compile {0} shader: {1}" + Environment.NewLine, shaderType.ToString(), GL.GetShaderInfoLog(shader));
- File.AppendAllText(infoFileName, errorString);
- GL.DeleteShader(shader);
- return 0;
- }
- return shader;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д