Advertisement
Margoshinka

волны круги

Feb 14th, 2023
880
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <GL/glew.h>
  3. #include <GLFW/glfw3.h>
  4.  
  5. using namespace std;
  6.  
  7. GLFWwindow* g_window;
  8.  
  9. GLuint g_shaderProgram;
  10.  
  11. class Model
  12. {
  13. public:
  14.     GLuint vbo;
  15.     GLuint ibo;
  16.     GLuint vao;
  17.     GLsizei indexCount;
  18. };
  19.  
  20. Model g_model;
  21.  
  22. GLuint createShader(const GLchar* code, GLenum type)
  23. {
  24.     GLuint result = glCreateShader(type);
  25.  
  26.     glShaderSource(result, 1, &code, NULL);
  27.     glCompileShader(result);
  28.  
  29.     GLint compiled;
  30.     glGetShaderiv(result, GL_COMPILE_STATUS, &compiled);
  31.  
  32.     if (!compiled)
  33.     {
  34.         GLint infoLen = 0;
  35.         glGetShaderiv(result, GL_INFO_LOG_LENGTH, &infoLen);
  36.         if (infoLen > 0)
  37.         {
  38.             char* infoLog = (char*)alloca(infoLen);
  39.             glGetShaderInfoLog(result, infoLen, NULL, infoLog);
  40.             cout << "Shader compilation error" << endl << infoLog << endl;
  41.         }
  42.         glDeleteShader(result);
  43.         return 0;
  44.     }
  45.  
  46.     return result;
  47. }
  48.  
  49. GLuint createProgram(GLuint vsh, GLuint fsh)
  50. {
  51.     GLuint result = glCreateProgram();
  52.  
  53.     glAttachShader(result, vsh);
  54.     glAttachShader(result, fsh);
  55.  
  56.     glLinkProgram(result);
  57.  
  58.     GLint linked;
  59.     glGetProgramiv(result, GL_LINK_STATUS, &linked);
  60.  
  61.     if (!linked)
  62.     {
  63.         GLint infoLen = 0;
  64.         glGetProgramiv(result, GL_INFO_LOG_LENGTH, &infoLen);
  65.         if (infoLen > 0)
  66.         {
  67.             char* infoLog = (char*)alloca(infoLen);
  68.             glGetProgramInfoLog(result, infoLen, NULL, infoLog);
  69.             cout << "Shader program linking error" << endl << infoLog << endl;
  70.         }
  71.         glDeleteProgram(result);
  72.         return 0;
  73.     }
  74.  
  75.     return result;
  76. }
  77.  
  78. bool createShaderProgram()
  79. {
  80.     g_shaderProgram = 0;
  81.  
  82.    /* const GLchar vsh[] =
  83.         "#version 330\n"
  84.         ""
  85.         "layout(location = 0) in vec2 a_position;"
  86.         "layout(location = 1) in vec3 a_color;"
  87.         ""
  88.         "out vec3 v_color;"
  89.         ""
  90.         "void main()"
  91.         "{"
  92.         "    v_color = a_color;"
  93.         "    gl_Position = vec4(a_position, 0.0, 1.0);"
  94.         "}"
  95.         ;*/
  96.     const GLchar vsh[] =
  97.         "#version 330\n"
  98.         ""
  99.         "layout(location = 0) in vec2 a_position;"
  100.         "layout(location = 1) in vec3 a_color;"
  101.        
  102.         ""
  103.         "out vec2 v_position;"
  104.         "out vec3 v_color;"
  105.         ""
  106.         "void main()"
  107.         "{"
  108.         "    v_position = a_position;"
  109.         "    v_color = a_color;"
  110.         "    gl_Position = vec4(a_position, 0.0, 1.0);"
  111.         "}"
  112.         ;
  113.     const GLchar fsh[] =
  114.         "#version 330\n"
  115.         ""
  116.         "in vec2 v_position;"
  117.         "in vec3 v_color;"
  118.         ""
  119.         "layout(location = 0) out vec4 o_color;"
  120.         ""
  121.         "void main()"
  122.         "{"
  123.         // Много полос
  124.         /*"   float c = v_direction;"
  125.         "   const float n = 20 * 3.1415926;"
  126.         "   o_color = vec4(vec3(sin(c * n)), 1.0);"*/
  127.         // Волны
  128.         "   float n = 15.;"
  129.         "   float d = 60.;"
  130.         "   o_color = vec4(vec3(sin((sin(v_position[0] * n) / n - v_position[1]) * d)), 1.0);"
  131.         // Круги
  132.         /*"   float d = length( abs(v_position) );"
  133.         "     o_color = vec4(vec3(sin(d*100.)),1.0);"*/
  134.         "}"
  135.         ;
  136.  
  137.    /* const GLchar fsh[] =
  138.         "#version 330\n"
  139.         ""
  140.         "in vec3 v_color;"
  141.         ""
  142.         "layout(location = 0) out vec4 o_color;"
  143.         ""
  144.         "void main()"
  145.         "{"
  146.         "   o_color = vec4(v_color, 1.0);"
  147.         "}"
  148.         ;*/
  149.  
  150.     GLuint vertexShader, fragmentShader;
  151.  
  152.     vertexShader = createShader(vsh, GL_VERTEX_SHADER);
  153.     fragmentShader = createShader(fsh, GL_FRAGMENT_SHADER);
  154.  
  155.     g_shaderProgram = createProgram(vertexShader, fragmentShader);
  156.  
  157.     glDeleteShader(vertexShader);
  158.     glDeleteShader(fragmentShader);
  159.  
  160.     return g_shaderProgram != 0;
  161. }
  162.  
  163. bool createModel()
  164. {
  165.     const GLfloat vertices[] =
  166.     {
  167.         -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  168.          0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  169.          0.5f,  0.5f, 0.0f, 0.0f, 1.0f,
  170.          -0.5f,  0.5f, 1.0f, 1.0f, 0.0f,
  171.     };
  172.  
  173.     const GLuint indices[] =
  174.     {
  175.         0, 1, 3, 2
  176.     };
  177.  
  178.     glGenVertexArrays(1, &g_model.vao);
  179.     glBindVertexArray(g_model.vao);
  180.  
  181.     glGenBuffers(1, &g_model.vbo);
  182.     glBindBuffer(GL_ARRAY_BUFFER, g_model.vbo);
  183.     glBufferData(GL_ARRAY_BUFFER, 20 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
  184.  
  185.     glGenBuffers(1, &g_model.ibo);
  186.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_model.ibo);
  187.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * sizeof(GLuint), indices, GL_STATIC_DRAW);
  188.     g_model.indexCount = 4;
  189.  
  190.     glEnableVertexAttribArray(0);
  191.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (const GLvoid*)0);
  192.     glEnableVertexAttribArray(1);
  193.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (const GLvoid*)(2 * sizeof(GLfloat)));
  194.  
  195.     return g_model.vbo != 0 && g_model.ibo != 0 && g_model.vao != 0;
  196. }
  197.  
  198. bool init()
  199. {
  200.     // Set initial color of color buffer to white.
  201.     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  202.  
  203.     return createShaderProgram() && createModel();
  204. }
  205.  
  206. void reshape(GLFWwindow* window, int width, int height)
  207. {
  208.     glViewport(0, 0, width, height);
  209. }
  210.  
  211. void draw()
  212. {
  213.     // Clear color buffer.
  214.     glClear(GL_COLOR_BUFFER_BIT);
  215.  
  216.     glUseProgram(g_shaderProgram);
  217.     glBindVertexArray(g_model.vao);
  218.  
  219.     glDrawElements(GL_TRIANGLE_STRIP, g_model.indexCount, GL_UNSIGNED_INT, 0);
  220. }
  221.  
  222. void cleanup()
  223. {
  224.     if (g_shaderProgram != 0)
  225.         glDeleteProgram(g_shaderProgram);
  226.     if (g_model.vbo != 0)
  227.         glDeleteBuffers(1, &g_model.vbo);
  228.     if (g_model.ibo != 0)
  229.         glDeleteBuffers(1, &g_model.ibo);
  230.     if (g_model.vao != 0)
  231.         glDeleteVertexArrays(1, &g_model.vao);
  232. }
  233.  
  234. bool initOpenGL()
  235. {
  236.     // Initialize GLFW functions.
  237.     if (!glfwInit())
  238.     {
  239.         cout << "Failed to initialize GLFW" << endl;
  240.         return false;
  241.     }
  242.  
  243.     // Request OpenGL 3.3 without obsoleted functions.
  244.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  245.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  246.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  247.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  248.  
  249.     // Create window.
  250.     g_window = glfwCreateWindow(800, 600, "OpenGL Test", NULL, NULL);
  251.     if (g_window == NULL)
  252.     {
  253.         cout << "Failed to open GLFW window" << endl;
  254.         glfwTerminate();
  255.         return false;
  256.     }
  257.  
  258.     // Initialize OpenGL context with.
  259.     glfwMakeContextCurrent(g_window);
  260.  
  261.     // Set internal GLEW variable to activate OpenGL core profile.
  262.     glewExperimental = true;
  263.  
  264.     // Initialize GLEW functions.
  265.     if (glewInit() != GLEW_OK)
  266.     {
  267.         cout << "Failed to initialize GLEW" << endl;
  268.         return false;
  269.     }
  270.  
  271.     // Ensure we can capture the escape key being pressed.
  272.     glfwSetInputMode(g_window, GLFW_STICKY_KEYS, GL_TRUE);
  273.  
  274.     // Set callback for framebuffer resizing event.
  275.     glfwSetFramebufferSizeCallback(g_window, reshape);
  276.  
  277.     return true;
  278. }
  279.  
  280. void tearDownOpenGL()
  281. {
  282.     // Terminate GLFW.
  283.     glfwTerminate();
  284. }
  285.  
  286. int main()
  287. {
  288.     // Initialize OpenGL
  289.     if (!initOpenGL())
  290.         return -1;
  291.  
  292.     // Initialize graphical resources.
  293.     bool isOk = init();
  294.  
  295.     if (isOk)
  296.     {
  297.         // Main loop until window closed or escape pressed.
  298.         while (glfwGetKey(g_window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(g_window) == 0)
  299.         {
  300.             // Draw scene.
  301.             draw();
  302.  
  303.             // Swap buffers.
  304.             glfwSwapBuffers(g_window);
  305.             // Poll window events.
  306.             glfwPollEvents();
  307.         }
  308.     }
  309.  
  310.     // Cleanup graphical resources.
  311.     cleanup();
  312.  
  313.     // Tear down OpenGL.
  314.     tearDownOpenGL();
  315.  
  316.     return isOk ? 0 : -1;
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement