初始化

  1. GLFWwindow* initGL(void) {
  2. //初始化
  3. glfwInit();
  4. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
  5. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  6. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  7. GLFWwindow* window = glfwCreateWindow(600, 600, "OSC_XY", NULL, NULL);
  8. if (window == NULL)
  9. {
  10. std::cout << "Failed to create GLFW window" << std::endl;
  11. glfwTerminate();
  12. return NULL;
  13. }
  14. //绑定上下文
  15. glfwMakeContextCurrent(window);
  16. //根据窗口动态调整视口的大小
  17. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  18. if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  19. {
  20. std::cout << "Failed to initialize GLAD" << std::endl;
  21. return NULL;
  22. }
  23. //允许Debug调试信息查看
  24. glEnable(GL_DEBUG_OUTPUT);
  25. glDebugMessageCallback(MessageCallback, 0);
  26. return window;
  27. }
  28. //视口跟随窗口调整回调函数
  29. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  30. {
  31. glViewport(0, 0, width, height);
  32. }

参数设置

每帧采样数据量(点)nSamples
采样间隔sampleRate
XY数据数组 x_data[nSamples] y_data[nSamples]
XY总数据量 scratchBuffer[4nSamples+4nSamples]:一个坐标点横纵轴共分裂为4个点,组成一个正方形

  1. Render::Render(int sampleRate, int nSamples, int lineSize, int width, int height) {
  2. this->nSamples = nSamples;
  3. this->lineSize = lineSize;
  4. this->sampleRate = sampleRate;
  5. this->width = width;
  6. this->height = height;
  7. this->x_data = new float[nSamples];
  8. this->y_data = new float[nSamples];
  9. this->scratchBuffer = new float[nSamples * 8]();
  10. this->quadIndex = makeQuadIndex();
  11. this->vertexIndex = makeVertexIndex(); //顶点索引
  12. //绘制纹理,暂时不用
  13. this->outQuadArray = makeOutQuad();
  14. //暂时没用
  15. if (makeFrameBuffer() != 0) {
  16. io.Err("Can Not Make FrameBuffers");
  17. return;
  18. }
  19. else {
  20. io.Log("FrameBuffers Generated!!!");
  21. }
  22. if (this->lineVao == 0 || this->textureVao == 0 ) {
  23. glGenVertexArrays(1, &this->lineVao);
  24. glGenVertexArrays(1, &this->textureVao);
  25. }
  26. return;
  27. }

正方形顶点索引 quadIndex :每一个Y轴坐标被拆分成4个顶点,顶点坐标索引nSamples*4 VBO

  1. unsigned int Render::makeQuadIndex() {
  2. int len = this->nSamples * 4;
  3. if (len < 0) {
  4. return -1;
  5. }
  6. short* index = new short[len];
  7. for (int i = len; i--;) {
  8. index[i] = i;
  9. }
  10. unsigned int vbo;
  11. glGenBuffers(1, &vbo);
  12. glBindBuffer(GL_ARRAY_BUFFER, vbo);
  13. glBufferData(GL_ARRAY_BUFFER, sizeof(short)* len, index, GL_STATIC_DRAW);
  14. glBindBuffer(GL_ARRAY_BUFFER, NULL);
  15. return vbo;
  16. }

正方形绘制索引 vertexIndex: 每一个Y轴坐标被拆分成4个顶点,组成一个正方形,一个正方形被分隔为两个三角形,总共EBO的索引为nSamples*6 EBO

  1. unsigned int Render::makeVertexIndex() {
  2. //-1是因为WebGL中会闪屏,最后一个点
  3. int len = (this->nSamples-1) * 2 * 3;
  4. if (len < 6) {
  5. return -1;
  6. }
  7. unsigned short* index = new unsigned short[len];
  8. for (int i = 0, pos = 0; i < len;) {
  9. index[i++] = pos;
  10. index[i++] = pos + 2;
  11. index[i++] = pos + 1;
  12. index[i++] = pos + 1;
  13. index[i++] = pos + 2;
  14. index[i++] = pos + 3;
  15. pos += 4;
  16. }
  17. unsigned int ebo;
  18. glGenBuffers(1, &ebo);
  19. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
  20. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short)*len, index, GL_STATIC_DRAW);
  21. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);
  22. return ebo;
  23. }

生成正弦波数据

  1. float* IO::genDatas(string anxi, int len) {
  2. if (len <= 0)
  3. {
  4. return new float[1]{-1};
  5. }
  6. float* wfm = new float[len];
  7. if (anxi.compare("x"))
  8. {
  9. for (int i = 0; i < len; i++) {
  10. wfm[i] = sin(i / 200.0);
  11. }
  12. }
  13. else {
  14. for (int i = 0; i < len; i++) {
  15. wfm[i] = cos(i / 1000.0);
  16. }
  17. }
  18. return wfm;
  19. }