Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.71 KB | None | 0 0
  1.  
  2. #include <GL/glew.h>
  3. #include <GL/gl.h>
  4. #include <GL/glut.h>
  5.  
  6. #include <stdio.h>
  7.  
  8. // Global options: I need to put them in to a nicer place obv.
  9. int width = 128;
  10. int height = 128;
  11.  
  12. GLuint vao = 0;
  13. GLuint vba = 0;
  14. GLuint vbo = 0;
  15. GLuint textureID = 0;
  16.  
  17. float* textureData = 0;
  18.  
  19. const unsigned int shaderAttribute = 0;
  20.  
  21. const char* vertexShaderSource =
  22.     "#version 400\n"
  23.     "in vec4 vertexPosition;\n"
  24.     "out vec2 uv;\n"
  25.     "void main() {\n"
  26.     "  gl_Position = vertexPosition;\n"
  27.     "  uv.x = (vertexPosition.x + 1.0) / 2;\n"
  28.     "  uv.y = (vertexPosition.y + 1.0) / 2;\n"
  29.     "}\n"
  30. ;
  31.  
  32. const char* fragmentShaderSource =
  33.     "#version 400\n"
  34.     "uniform sampler2D myTex;\n"
  35.     "uniform vec4 baseColor;\n"
  36.     "in vec2 uv;\n"
  37.     "out vec4 fragColor;\n"
  38.     "void main() {\n"
  39.     "  fragColor = texture(myTex, uv);\n"
  40.     "  fragColor += baseColor;\n"
  41.     //  "  fragColor += vec4(uv.x, uv.y, 0, 1);\n"
  42.     "}\n"
  43. ;
  44.  
  45. GLuint shaderProgram = 0;
  46.  
  47. void
  48. draw()
  49. {
  50.     glClearColor(0, 0, 0, 0);
  51.     glClear(GL_COLOR_BUFFER_BIT);
  52.  
  53.     glUseProgram(shaderProgram);
  54.     glBindVertexArray(vao);
  55.  
  56.     // Setting up the texture sampler
  57.     glEnable(GL_TEXTURE_2D);
  58.     glActiveTexture(GL_TEXTURE0);
  59.     glBindTexture(GL_TEXTURE_2D, textureID);
  60.     glUniform1i(glGetUniformLocation(shaderProgram, "myTex"), 0);
  61.  
  62.     glUniform4f(glGetUniformLocation(shaderProgram, "baseColor"), 0.5, 0.3, 0.8, 1.0);
  63.    
  64.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  65.  
  66.     glFlush();
  67. }
  68.  
  69. void
  70. setupGeometry()
  71. {  
  72.     static GLfloat vertices[4][4] = {
  73.         { -1.0, 1.0, 0.0, 1.0 },
  74.         { -1.0, -1.0, 0.0, 1.0 },
  75.         { 1.0, 1.0, 0.0, 1.0 },
  76.         { 1.0, -1.0, 0.0, 1.0 },
  77.     };
  78.  
  79.     glGenVertexArrays(1, &vao);
  80.     glBindVertexArray(vao);
  81.  
  82.     glGenBuffers(1, &vbo);
  83.     glBindBuffer(GL_ARRAY_BUFFER, vbo);
  84.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  85.     glVertexAttribPointer(shaderAttribute, 4, GL_FLOAT, GL_FALSE, 0, 0);
  86.  
  87.     glEnableVertexAttribArray(shaderAttribute);
  88. }
  89.  
  90. void
  91. initGLUT()
  92. {
  93.     glutInitDisplayMode(GLUT_RGB);
  94.     glutInitWindowSize(1920, 1080);
  95.     glutCreateWindow("gl-view");
  96.     glutDisplayFunc(draw);
  97.  
  98.     glewInit();
  99.  
  100.     setupGeometry();
  101.  
  102.     GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
  103.     GLint shaderLength = strlen(vertexShaderSource);
  104.     glShaderSource(vertexShaderId, 1, &vertexShaderSource, &shaderLength);
  105.     glCompileShader(vertexShaderId);
  106.  
  107.     GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
  108.     shaderLength = strlen(fragmentShaderSource);
  109.     glShaderSource(fragmentShaderId, 1, &fragmentShaderSource, &shaderLength);
  110.     glCompileShader(fragmentShaderId);
  111.  
  112.     shaderProgram = glCreateProgram();
  113.     glAttachShader(shaderProgram, vertexShaderId);
  114.     glAttachShader(shaderProgram, fragmentShaderId);
  115.     glLinkProgram(shaderProgram);
  116.  
  117.     glEnable(GL_TEXTURE_2D);
  118.     glGenTextures(1, &textureID);
  119.     glBindTexture(GL_TEXTURE_2D, textureID);
  120.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, textureData);
  121. }
  122.  
  123. float*
  124. allocateTexture( size_t* expectedSize )
  125. {
  126.   *expectedSize = width * height * 4 * sizeof(float);
  127.     float* res = malloc(*expectedSize);
  128.     if (res == 0)
  129.     {
  130.         fprintf(stderr, "not enough memory to load file");
  131.         return 0;
  132.     }
  133.  
  134.     return res;
  135. }
  136.  
  137. int
  138. generateTexture(float** target)
  139. {
  140.     size_t expectedSize = 0;
  141.     *target = allocateTexture(&expectedSize);
  142.     if (*target == 0)
  143.         return 0;
  144.  
  145.   float* textureValue = *target;
  146.     for (int row = 0; row < height; ++row)
  147.     {
  148.         for (int column = 0; column < width; ++column, textureValue += 4)
  149.         {
  150.             textureValue[0] = (float)column / (float)width;
  151.             textureValue[1] = (float)row / (float)height;
  152.             textureValue[2] = 0;
  153.             textureValue[3] = 1.0;
  154.         }
  155.     }
  156.  
  157.     return 1;
  158. }
  159.  
  160. int
  161. main(int argc, char** argv)
  162. {
  163.   generateTexture(&textureData);
  164.     initGLUT();
  165.     glutMainLoop();
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement