Advertisement
Guest User

Untitled

a guest
Aug 18th, 2016
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.18 KB | None | 0 0
  1.  
  2.  
  3. #include <windows.h>
  4. #include <gl/gl.h>
  5. #include "glext.h"
  6. #include "wglext.h"
  7. #include "libs\glm\glm\glm.hpp"
  8. #include "libs\glm\glm\gtc\matrix_transform.hpp"
  9. #include "libs\glm\glm\gtc\type_ptr.hpp"
  10.  
  11. #pragma comment(lib, "opengl32.lib")
  12.  
  13.  
  14. // Function Declarations
  15.  
  16. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  17. void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
  18. void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
  19.  
  20. //opengl Function Pointers
  21. PFNGLCLEARBUFFERFVPROC glClearBufferfv;
  22. PFNGLCREATESHADERPROC glCreateShader;
  23. PFNGLSHADERSOURCEPROC glShaderSource;
  24. PFNGLCOMPILESHADERPROC glCompileShader;
  25. PFNGLCREATEPROGRAMPROC glCreateProgram;
  26. PFNGLATTACHSHADERPROC glAttachShader;
  27. PFNGLLINKPROGRAMPROC glLinkProgram;
  28. PFNGLDELETESHADERPROC glDeleteShader;
  29. PFNGLDELETEVERTEXARRAYSPROC glCreateVertexArrays;
  30. PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
  31. PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
  32. PFNGLUSEPROGRAMPROC glUseProgram;
  33. PFNGLDELETEBUFFERSPROC glCreateBuffers;
  34. PFNGLBINDBUFFERPROC glBindBuffer;
  35. PFNGLBUFFERSTORAGEPROC glBufferStorage;
  36. PFNGLNAMEDBUFFERSTORAGEEXTPROC glNamedBufferStorage;
  37. PFNGLBUFFERSUBDATAPROC glBufferSubData;
  38. PFNGLNAMEDBUFFERSUBDATAEXTPROC glNamedBufferSubData;
  39. PFNGLMAPBUFFERPROC glMapBuffer;
  40. PFNGLMAPNAMEDBUFFEREXTPROC glMapNamedBuffer;
  41. PFNGLUNMAPBUFFERPROC glUnmapBuffer;
  42. PFNGLUNMAPNAMEDBUFFEREXTPROC glUnmapNamedBuffer;
  43. PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
  44. PFNGLMAPNAMEDBUFFERRANGEEXTPROC glMapNamedBufferRange;
  45. PFNGLCLEARBUFFERSUBDATAPROC glClearBufferSubData;
  46. PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glClearNamedBufferSubData;
  47. PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glVertexArrayAttribFormat;
  48. PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glVertexArrayVertexBuffer;
  49. PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
  50. PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glEnableVertexArrayAttrib;
  51. PFNGLCLEARBUFFERFIPROC glClearBufferfi;
  52. PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
  53. PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
  54. PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
  55. PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
  56. PFNGLGETSHADERIVPROC glGetShaderiv;
  57. PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
  58.  
  59. GLuint program;
  60. GLuint vertexShader;
  61. GLuint fragmentShader;
  62. GLuint buffer;
  63. GLuint vertexArrayObject;
  64.  
  65. GLint projectionMatrixLocation;
  66. GLint modelViewMatrixLocation;
  67. glm::mat4 projectionMatrix;
  68. glm::mat4 modelViewMatrix;
  69.  
  70.  
  71.  
  72.  
  73. // WinMain
  74.  
  75. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  76. LPSTR lpCmdLine, int iCmdShow)
  77. {
  78. WNDCLASS wc;
  79. HWND hWnd;
  80. HDC hDC;
  81. HGLRC hRC;
  82. MSG msg;
  83. BOOL quit = FALSE;
  84. float theta = 0.0f;
  85.  
  86. // register window class
  87. wc.style = CS_OWNDC;
  88. wc.lpfnWndProc = WndProc;
  89. wc.cbClsExtra = 0;
  90. wc.cbWndExtra = 0;
  91. wc.hInstance = hInstance;
  92. wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  93. wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  94. wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
  95. wc.lpszMenuName = NULL;
  96. wc.lpszClassName = "GLSample";
  97. RegisterClass( &wc );
  98.  
  99. // create main window
  100. hWnd = CreateWindow(
  101. "GLSample", "OpenGL Sample",
  102. WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
  103. 0, 0, 256, 256,
  104. NULL, NULL, hInstance, NULL );
  105.  
  106. // enable OpenGL for the window
  107. EnableOpenGL( hWnd, &hDC, &hRC );
  108.  
  109. // program main loop
  110. while ( !quit )
  111. {
  112.  
  113. // check for messages
  114. if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  115. {
  116.  
  117. // handle or dispatch messages
  118. if ( msg.message == WM_QUIT )
  119. {
  120. quit = TRUE;
  121. }
  122. else
  123. {
  124. TranslateMessage( &msg );
  125. DispatchMessage( &msg );
  126. }
  127.  
  128. }
  129. else
  130. {
  131.  
  132.  
  133.  
  134. }
  135.  
  136. }
  137.  
  138. // shutdown OpenGL
  139. DisableOpenGL( hWnd, hDC, hRC );
  140.  
  141. // destroy the window explicitly
  142. DestroyWindow( hWnd );
  143.  
  144. return msg.wParam;
  145.  
  146. }
  147.  
  148. // Window Procedure
  149.  
  150. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  151. {
  152.  
  153. switch (message)
  154. {
  155.  
  156. case WM_CREATE:
  157. return 0;
  158.  
  159. case WM_CLOSE:
  160. PostQuitMessage( 0 );
  161. return 0;
  162.  
  163. case WM_DESTROY:
  164. return 0;
  165.  
  166. case WM_KEYDOWN:
  167. switch ( wParam )
  168. {
  169.  
  170. case VK_ESCAPE:
  171. PostQuitMessage(0);
  172. return 0;
  173.  
  174. }
  175. return 0;
  176.  
  177. default:
  178. return DefWindowProc( hWnd, message, wParam, lParam );
  179.  
  180. }
  181.  
  182. }
  183.  
  184. // Enable OpenGL
  185.  
  186. void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)
  187. {
  188. PIXELFORMATDESCRIPTOR pfd;
  189. int format;
  190.  
  191. // get the device context (DC)
  192. *hDC = GetDC( hWnd );
  193.  
  194. // set the pixel format for the DC
  195. ZeroMemory( &pfd, sizeof( pfd ) );
  196. pfd.nSize = sizeof( pfd );
  197. pfd.nVersion = 1;
  198. pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  199. pfd.iPixelType = PFD_TYPE_RGBA;
  200. pfd.cColorBits = 24;
  201. pfd.cDepthBits = 16;
  202. pfd.iLayerType = PFD_MAIN_PLANE;
  203. format = ChoosePixelFormat( *hDC, &pfd );
  204. SetPixelFormat( *hDC, format, &pfd );
  205.  
  206. // create and enable the render context (RC)
  207. *hRC = wglCreateContext( *hDC );
  208. wglMakeCurrent( *hDC, *hRC );
  209.  
  210.  
  211. //load opengl Functions
  212. glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)wglGetProcAddress("glClearBufferfv");
  213. glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
  214. glShaderSource = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
  215. glCompileShader = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
  216. glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
  217. glAttachShader = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
  218. glLinkProgram = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
  219. glDeleteShader = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
  220. glCreateVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glCreateVertexArrays");
  221. glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray");
  222. glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress("glDeleteVertexArrays");
  223. glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
  224. glCreateBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress("glCreateBuffers");
  225. glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
  226. glBufferStorage = (PFNGLBUFFERSTORAGEPROC)wglGetProcAddress("glBufferStorage");
  227. glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)wglGetProcAddress("glNamedBufferStorage");
  228. glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");
  229. glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)wglGetProcAddress("glNamedBufferSubData");
  230. glMapBuffer = (PFNGLMAPBUFFERPROC)wglGetProcAddress("glMapBuffer");
  231. glMapNamedBuffer = (PFNGLMAPNAMEDBUFFEREXTPROC)wglGetProcAddress("glMapNamedBuffer");
  232. glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)wglGetProcAddress("glUnmapBuffer");
  233. glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFEREXTPROC)wglGetProcAddress("glUnmapNamedBuffer");
  234. glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)wglGetProcAddress("glMapBufferRange");
  235. glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)wglGetProcAddress("glMapNamedBufferRange");
  236. glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)wglGetProcAddress("glClearBufferSubData");
  237. glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)wglGetProcAddress("glClearNamedBufferSubData");
  238. glVertexArrayAttribFormat = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)wglGetProcAddress("glVertexArrayAttribFormat");
  239. glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)wglGetProcAddress("glVertexArrayVertexBuffer");
  240. glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress("glGenVertexArrays");
  241. glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)wglGetProcAddress("glEnableVertexArrayAttrib");
  242. glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)wglGetProcAddress("glClearBufferfi");
  243. glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)wglGetProcAddress("glUniformMatrix4fv");
  244. glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation");
  245. glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
  246. glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
  247. glGetShaderiv = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
  248. glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog");
  249.  
  250.  
  251. //creating program and shaders, compiling shaders, compiling program
  252. GLchar * v_Shader[] = {
  253.  
  254.  
  255. "#version 410 core \n"
  256. " \n"
  257. "in vec4 position; \n"
  258. " \n"
  259. " \n"
  260. "uniform mat4 mvmatrix; \n"
  261. "uniform mat4 projmatrix; \n"
  262. " \n"
  263. "void main(void) \n"
  264. "{ \n"
  265. " gl_Position = projmatrix * mvmatrix * position; \n"
  266. "} \n"
  267. };
  268.  
  269. GLchar * f_Shader[] = {
  270. "#version 410 core \n"
  271. " \n"
  272. "out vec4 color; \n"
  273. " \n"
  274. "in VS_OUT \n"
  275. "{ \n"
  276. " vec4 color; \n"
  277. "} fs_in; \n"
  278. " \n"
  279. "void main(void) \n"
  280. "{ \n"
  281. " color = vec4(1.0,1.0,1.0,1.0) \n"
  282. "} \n"
  283. };
  284.  
  285. //creating a opengl program
  286. program = glCreateProgram();
  287.  
  288. //creating the vertex shader and compiling it
  289. vertexShader = glCreateShader(GL_VERTEX_SHADER);
  290. glShaderSource(vertexShader, 1, v_Shader, NULL);
  291. glCompileShader(vertexShader);
  292.  
  293. //creating the fragment shader and compiling it
  294. fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  295. glShaderSource(fragmentShader, 1, f_Shader, NULL);
  296. glCompileShader(fragmentShader);
  297.  
  298. //attaching the shaders to the program and linking the program
  299. glAttachShader(program, vertexShader);
  300. glAttachShader(program, fragmentShader);
  301. glLinkProgram(program);
  302. glUseProgram(program);
  303. //getting the program's uniform locations
  304. modelViewMatrixLocation = glGetUniformLocation(program, "mvmatrix");
  305. projectionMatrixLocation = glGetUniformLocation(program, "projmatrix");
  306.  
  307.  
  308.  
  309.  
  310. }
  311.  
  312. // Disable OpenGL
  313.  
  314. void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
  315. {
  316. wglMakeCurrent( NULL, NULL );
  317. wglDeleteContext( hRC );
  318. ReleaseDC( hWnd, hDC );
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement