opengl3_2.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include <iostream>
  2. #include <epoxy/gl.h>
  3. #ifdef _WIN32
  4. #define WIN32_LEAN_AND_MEAN 1
  5. #define NOMINMAX 1
  6. #include <windows.h>
  7. #endif
  8. #if defined(__APPLE__)
  9. #include <OpenGL/gl.h>
  10. #include <OpenGL/glu.h>
  11. #else
  12. #include <GL/gl.h>
  13. #include <GL/glu.h>
  14. #endif
  15. #include "opencv2/core.hpp"
  16. #include "opencv2/core/opengl.hpp"
  17. #include "opencv2/core/cuda.hpp"
  18. #include "opencv2/highgui.hpp"
  19. using namespace std;
  20. using namespace cv;
  21. using namespace cv::cuda;
  22. const int win_width = 800;
  23. const int win_height = 640;
  24. struct DrawData
  25. {
  26. GLuint vao, vbo, program, textureID;
  27. };
  28. static cv::Mat rot(float angle)
  29. {
  30. cv::Mat R_y = (cv::Mat_<float>(4,4) <<
  31. cos(angle), 0, sin(angle), 0,
  32. 0, 1, 0, 0,
  33. -sin(angle), 0, cos(angle), 0,
  34. 0, 0, 0, 1);
  35. return R_y;
  36. }
  37. static GLuint create_shader(const char* source, GLenum type) {
  38. GLuint shader = glCreateShader(type);
  39. glShaderSource(shader, 1, &source, NULL);
  40. glCompileShader(shader);
  41. return shader;
  42. }
  43. static void draw(void* userdata) {
  44. DrawData* data = static_cast<DrawData*>(userdata);
  45. static float angle = 0.0f;
  46. angle += 1.f;
  47. cv::Mat trans = rot(CV_PI * angle / 360.f);
  48. glClearColor(0.0, 0.0, 0.0, 1.0);
  49. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  50. glUseProgram(data->program);
  51. glUniformMatrix4fv(glGetUniformLocation(data->program, "transform"), 1, GL_FALSE, trans.ptr<float>());
  52. glBindTexture(GL_TEXTURE_2D, data->textureID);
  53. glBindVertexArray(data->vao);
  54. glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  55. glBindVertexArray(0);
  56. }
  57. int main(int argc, char* argv[])
  58. {
  59. string filename;
  60. if (argc < 2)
  61. {
  62. cout << "Usage: " << argv[0] << " image" << endl;
  63. filename = "baboon.jpg";
  64. }
  65. else
  66. filename = argv[1];
  67. Mat img = imread(samples::findFile(filename));
  68. if (img.empty())
  69. {
  70. cerr << "Can't open image " << filename << endl;
  71. return -1;
  72. }
  73. flip(img, img, 0);
  74. namedWindow("OpenGL", WINDOW_OPENGL);
  75. resizeWindow("OpenGL", win_width, win_height);
  76. DrawData data;
  77. glEnable(GL_DEPTH_TEST);
  78. const char *vertex_shader_source =
  79. "#version 330 core\n"
  80. "layout (location = 0) in vec3 position;\n"
  81. "layout (location = 1) in vec2 texCoord;\n"
  82. "out vec2 TexCoord;\n"
  83. "uniform mat4 transform;\n"
  84. "void main() {\n"
  85. " gl_Position = transform * vec4(position, 1.0);\n"
  86. " TexCoord = texCoord;\n"
  87. "}\n";
  88. const char *fragment_shader_source =
  89. "#version 330 core\n"
  90. "in vec2 TexCoord;\n"
  91. "out vec4 color;\n"
  92. "uniform sampler2D ourTexture;\n"
  93. "void main() {\n"
  94. " color = texture(ourTexture, TexCoord);\n"
  95. "}\n";
  96. data.program = glCreateProgram();
  97. GLuint vertex_shader = create_shader(vertex_shader_source, GL_VERTEX_SHADER);
  98. GLuint fragment_shader = create_shader(fragment_shader_source, GL_FRAGMENT_SHADER);
  99. glAttachShader(data.program, vertex_shader);
  100. glAttachShader(data.program, fragment_shader);
  101. glLinkProgram(data.program);
  102. glUseProgram(data.program);
  103. GLfloat vertices[] = {
  104. // Positions // Texture Coords
  105. 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, // Top Right
  106. 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, // Bottom Right
  107. -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Top Left
  108. -1.0f, -1.0f, 0.0f, 0.0f, 0.0f // Bottom Left
  109. };
  110. glGenVertexArrays(1, &data.vao);
  111. glGenBuffers(1, &data.vbo);
  112. glBindVertexArray(data.vao);
  113. glBindBuffer(GL_ARRAY_BUFFER, data.vbo);
  114. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  115. // Position attribute
  116. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);
  117. glEnableVertexAttribArray(0);
  118. // Texture Coord attribute
  119. glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
  120. glEnableVertexAttribArray(1);
  121. glBindVertexArray(0); // Unbind VAO
  122. // Image to texture
  123. glGenTextures(1, &data.textureID);
  124. glBindTexture(GL_TEXTURE_2D, data.textureID);
  125. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.cols, img.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, img.data);
  126. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  127. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  128. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  129. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  130. glBindTexture(GL_TEXTURE_2D, 0);
  131. setOpenGlDrawCallback("OpenGL", draw, &data);
  132. for (;;)
  133. {
  134. updateWindow("OpenGL");
  135. char key = (char)waitKey(40);
  136. if (key == 27)
  137. break;
  138. }
  139. setOpenGlDrawCallback("OpenGL", 0, 0);
  140. destroyAllWindows();
  141. return 0;
  142. }