Advertisement
Guest User

Untitled

a guest
Apr 26th, 2014
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 4.76 KB | None | 0 0
  1. import std.stdio;
  2. import std.file;
  3. import std.math;
  4. import derelict.util.exception;
  5. import derelict.opengl3.gl3;
  6. import derelict.glfw3.glfw3;
  7.  
  8. const GLfloat[] g_vertex_buffer_data = [
  9.    -1.0f, -1.0f, 0.0f,
  10.    1.0f, -1.0f, 0.0f,
  11.    0.0f,  1.0f, 0.0f,
  12. ];
  13.  
  14. void main(string[] args) {
  15.     DerelictGL3.load();
  16.     DerelictGLFW3.load();
  17.     if(!glfwInit()) {
  18.         writefln("Could not initialize GLFW3.");
  19.     }
  20.     glfwInit();
  21.  
  22.     GLFWmonitor *monitor = glfwGetPrimaryMonitor();
  23.     GLFWwindow *window = glfwCreateWindow(640, 480, "Test", null, null);
  24.     glfwMakeContextCurrent(window);
  25.  
  26.     DerelictGL3.reload();
  27.  
  28.     GLuint VertexArrayID;
  29.     glGenVertexArrays(1, &VertexArrayID);
  30.     glBindVertexArray(VertexArrayID);
  31.  
  32.     glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
  33.  
  34.     GLuint programID = LoadShaders( "vertex_shader", "fragment_shader" );    
  35.  
  36.     while (!glfwWindowShouldClose(window)) {
  37.         int width, height;
  38.         glfwGetFramebufferSize(window, &width, &height);
  39.         float ratio = width / cast(float) height;
  40.         glViewport(0, 0, width, height);
  41.  
  42.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  43.  
  44.         glUseProgram(programID);
  45.  
  46.         // This will identify our vertex buffer
  47.         GLuint vertexbuffer;
  48.  
  49.         // Generate 1 buffer, put the resulting identifier in vertexbuffer
  50.         glGenBuffers(1, &vertexbuffer);
  51.  
  52.         // The following commands will talk about our 'vertexbuffer' buffer
  53.         glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  54.  
  55.         // Give our vertices to OpenGL.
  56.         glBufferData(GL_ARRAY_BUFFER, g_vertex_buffer_data.length, cast(const(void *))g_vertex_buffer_data, GL_STATIC_DRAW);
  57.  
  58.         // 1rst attribute buffer : vertices
  59.         glEnableVertexAttribArray(0);
  60.         glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  61.         glVertexAttribPointer(
  62.            0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
  63.            3,                  // size
  64.            GL_FLOAT,           // type
  65.            GL_FALSE,           // normalized?
  66.            0,                  // stride
  67.            cast(void *)0       // array buffer offset
  68.         );
  69.  
  70.         // Draw the triangle !
  71.         glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
  72.  
  73.         glDisableVertexAttribArray(0);
  74.  
  75.         glfwPollEvents();
  76.         glfwSwapBuffers(window);
  77.     }
  78. }
  79.  
  80. GLuint LoadShaders(string vertex_file_path, string fragment_file_path){
  81.  
  82.     // Create the shaders
  83.     GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
  84.     GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
  85.  
  86.     // Read the Vertex Shader code from the file
  87.     const(char *) VertexShaderCode = cast(const(char *))readText(vertex_file_path);
  88.  
  89.     // Read the Fragment Shader code from the file
  90.     const(char *) FragmentShaderCode = cast(const(char *))readText(fragment_file_path);
  91.  
  92.     GLint Result = GL_FALSE;
  93.     int InfoLogLength;
  94.  
  95.     // Compile Vertex Shader
  96.     writefln("Compiling shader : %s\n", vertex_file_path);
  97.     glShaderSource(VertexShaderID, 1, &VertexShaderCode , null);
  98.     glCompileShader(VertexShaderID);
  99.  
  100.     // Check Vertex Shader
  101.     glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
  102.     glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
  103.     char[] VertexShaderErrorMessage;
  104.     VertexShaderErrorMessage.length = InfoLogLength;
  105.     glGetShaderInfoLog(VertexShaderID, InfoLogLength, null, &VertexShaderErrorMessage[0]);
  106.     writefln("%s\n", &VertexShaderErrorMessage[0]);
  107.  
  108.     // Compile Fragment Shader
  109.     writefln("Compiling shader : %s\n", fragment_file_path);
  110.     glShaderSource(FragmentShaderID, 1, &FragmentShaderCode , null);
  111.     glCompileShader(FragmentShaderID);
  112.  
  113.     // Check Fragment Shader
  114.     glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
  115.     glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
  116.     char[] FragmentShaderErrorMessage;
  117.     FragmentShaderErrorMessage.length = InfoLogLength;
  118.     glGetShaderInfoLog(FragmentShaderID, InfoLogLength, null, &FragmentShaderErrorMessage[0]);
  119.     writefln("%s\n", &FragmentShaderErrorMessage[0]);
  120.  
  121.     // Link the program
  122.     writefln("Linking program\n");
  123.     GLuint ProgramID = glCreateProgram();
  124.     glAttachShader(ProgramID, VertexShaderID);
  125.     glAttachShader(ProgramID, FragmentShaderID);
  126.     glLinkProgram(ProgramID);
  127.  
  128.     // Check the program
  129.     glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
  130.     glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
  131.     char[] ProgramErrorMessage;
  132.     ProgramErrorMessage.length = cast(uint)fmax(InfoLogLength, 1);
  133.     glGetProgramInfoLog(ProgramID, InfoLogLength, null, &ProgramErrorMessage[0]);
  134.     writefln("%s\n", &ProgramErrorMessage[0]);
  135.  
  136.     glDeleteShader(VertexShaderID);
  137.     glDeleteShader(FragmentShaderID);
  138.  
  139.     return ProgramID;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement