Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.05 KB | None | 0 0
  1. // template.cpp: define el punto de entrada de la aplicación de consola.
  2. //
  3.  
  4.  
  5. #include "stdafx.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. // El orden importa, primero es Glew y luego glfw
  10.  
  11. //GLEW
  12. #define GLEW_STATIC // vamos a usar las cosas experimentales, o sea todo lo que tiene que ver con shaders
  13. #include "GL\glew.h"
  14.  
  15. //GLFW
  16. #include "GLFW\glfw3.h"
  17.  
  18. //GLM
  19. #include "glm\glm.hpp"
  20. #include "glm\gtc\matrix_transform.hpp"
  21.  
  22.  
  23.  
  24. using namespace std;
  25. using namespace glm;
  26.  
  27. //Nuestro codigo de shader
  28. #include "shader.hpp"
  29. #include "cargarbmp.hpp"
  30.  
  31. GLFWwindow * window; // Apuntador llamado window de tipo GLFWwin
  32. GLuint vertexArrayID; // después le meteremos valores para hacer un triangulo
  33. GLuint programaID;
  34. GLuint MatrizID;
  35.  
  36. GLuint vertexBufferID;
  37. GLuint uvBufferID;
  38.  
  39. GLfloat textura;
  40. GLuint texturaShaderID;
  41.  
  42. glm::mat4 mvp;
  43. // en ese orden se deben multiplicar
  44. glm::mat4 proyeccion;
  45. glm::mat4 vista;
  46. glm::mat4 modelo;
  47. glm::vec3 posicionCamara = glm::vec3(4, 4, 4); // le ponemos glm para saber que viene de la libreria glm
  48. glm::vec3 direccionCamara = glm::vec3(0, 0, 0);
  49. glm::vec3 rotacionModelo = glm::vec3(0, 0, 0);
  50.  
  51.  
  52. // declarar funciones globales
  53. void moverCamara();
  54. void dibujar();
  55. void moverModelo();
  56.  
  57. void moverModelo(){
  58.  
  59. if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS){
  60. const glm::vec3 ejeY = glm::vec3(1, 1, 0); // afecta nada al eje X, todo al Y and nada al Z
  61. modelo = glm::rotate(modelo, 0.001f, ejeY);
  62. mvp = proyeccion * vista * modelo;
  63. }
  64. }
  65.  
  66. void moverCamara(){
  67.  
  68. if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
  69.  
  70. direccionCamara.y += 0.01f;
  71. }
  72.  
  73. if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
  74.  
  75. direccionCamara.y -= 0.01f;
  76.  
  77. }
  78.  
  79. if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
  80.  
  81. direccionCamara.x += 0.01f;
  82.  
  83. }
  84.  
  85. if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
  86.  
  87. direccionCamara.x -= 0.01f;
  88.  
  89. }
  90.  
  91. if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS){
  92.  
  93. posicionCamara.x += 0.01f;
  94.  
  95. }
  96.  
  97. if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS){
  98.  
  99. posicionCamara.x -= 0.01f;
  100.  
  101. }
  102.  
  103. if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS){
  104.  
  105. posicionCamara.y += 0.01f;
  106. }
  107.  
  108. if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS){
  109.  
  110. posicionCamara.y -= 0.01f;
  111. }
  112.  
  113. vista = glm::lookAt(
  114. posicionCamara, // donde esta
  115. direccionCamara, // a donde mira
  116. glm::vec3(0, 1, 0));
  117.  
  118. mvp = proyeccion * vista * modelo;
  119.  
  120. }
  121.  
  122. void dibujar(){
  123.  
  124. moverCamara();
  125.  
  126. moverModelo();
  127.  
  128. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  129.  
  130. glUseProgram(programaID);
  131. // donde encontrar al parametro que queremos usar en los shaders,
  132. glUniformMatrix4fv(MatrizID, 1, GL_FALSE, &mvp[0][0]);
  133.  
  134. //Activando la primera textura de OpenGL
  135. glActiveTexture(GL_TEXTURE0);
  136. glBindTexture(GL_TEXTURE_2D, textura);
  137. //Mapeo con el shader
  138. glUniform1i(texturaShaderID, 0);
  139.  
  140. // vamos a trabajar en la primer variable del shader del vertice (o sea posicionVertice)
  141. glEnableVertexAttribArray(0);
  142. //Estamos diciendo a OpenGl que vamos a usar este buffer de aqui en adelante
  143. glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
  144. // el primero el indice del atributo (location = 0 ), y luego el numero de vertices...GL_FLOAT...GL_FALSE..
  145. // el cuarto (strike) valor es de donde empieza a tomar valores, si pones 3, toma los ultimos 3 valores...
  146. // el quinto es el espacio de memoria de cada uno de los elementos que te saltas en el Strike
  147. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
  148.  
  149. //Vamos a trabajar con verticeUV (por eso le indicamos el 1
  150. glEnableVertexAttribArray(1);
  151. glBindBuffer(GL_ARRAY_BUFFER, uvBufferID);
  152. glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); //porque es el atributo numero 1 osea vertice uv
  153. //el 2 hace referencia al numero de cordenadas que quieres mandar (en este caso U y V)
  154.  
  155.  
  156.  
  157.  
  158. // el tres del segundo parametro de abajo indica que cada 3 valores van a ser un vec 3 (hablando de los 36 valores de color)
  159. // el void del final significa que se va a usar todo el arreglo completo.
  160. glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
  161.  
  162. // el cero es de donde empiezas a trabajar y el 3 el final
  163. glDrawArrays(GL_TRIANGLES, 0, 36);
  164. glDisableVertexAttribArray(0); // ya no vamos a trabajar con el atributo posicionVertice (localizado en 0)
  165.  
  166. //tenemos dos buffers, cambio de buffer
  167. // Al crear un contexto, en ese moment se establecen los buffers
  168. // pero nosotros no creamos los buffers que se estan cambiando
  169. // Por default tenemos dos buffers
  170.  
  171. glfwSwapBuffers(window);
  172. glfwPollEvents();
  173. }
  174.  
  175.  
  176.  
  177. //vamos a hacer una matriz de transformacion con glm
  178.  
  179. int _tmain(int argc, _TCHAR* argv[])
  180. {
  181. //verificar que se inició bien
  182. if (!glfwInit()){
  183. printf("No se pude inicializar GLFW");
  184. getchar();
  185. return -1;
  186.  
  187. }
  188.  
  189. // Validaciones de compatibilidad con la version de opengl que corre la maquina
  190. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //nuestra version de openGL es la 3
  191. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  192.  
  193. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //No queremos OpenGL viejos, va a marcar error
  194.  
  195. //HORA DE CREAR LA VENTANA
  196. int ancho = 1024;
  197. int alto = 768;
  198.  
  199. window = glfwCreateWindow(ancho, alto, "Título", NULL, NULL); // Crear ventana
  200.  
  201. //Poner en contexto la ventana, o sea, todo lo que haga OpenGL va a ser dentro de esta ventana.
  202. //window es una direccion de memoria que lleva a un espacio de memoria que tiene una ventana.
  203. //Por eso no le pusimos AMPERSON, porque lo declaramos como un apuntador.
  204. glfwMakeContextCurrent(window);
  205.  
  206. glewExperimental = true; //las funciones experimentales nos permiten cargar los shaders
  207.  
  208. if (glewInit() != GLEW_OK){
  209.  
  210. printf("No se pudo inicializar GLEW");
  211. getchar();
  212. return -1;
  213. }
  214.  
  215.  
  216.  
  217. glGenVertexArrays(1, &vertexArrayID);
  218. glBindVertexArray(vertexArrayID); //le dice a openGL que vamos a utilizar este vertex array
  219.  
  220. // aqui tenemos la direccion de memoria de nuestro programa de3 shaderes
  221. programaID = CargarShaders("textura.vertexshader", "textura.fragmentshader");
  222.  
  223. // matrizID es la direccion de memoria de la matriz mvp que es la combinacion de la matriz vista * proyection * modelo..etc.
  224. MatrizID = glGetUniformLocation(programaID, "MVP"); // va a representar a MVP
  225. //yo quiero una matriz que se localiza en programaID
  226.  
  227. proyeccion = glm::perspective(glm::radians(45.0f), (float)ancho / alto, 0.1f, 100.0f); // ya tengo una matriz
  228. // de proyeccion que va a emular una vision acorde a los parametros de aqui arriba
  229.  
  230. vista = glm::lookAt(//matriz de vista
  231.  
  232. posicionCamara, //donde está la cam
  233. direccionCamara,//hacia donde apunta la camara
  234. glm::vec3(0, 1, 0)//cual es tu vector de arriba
  235.  
  236. );
  237.  
  238. // multiplicar matriz projection por la de la vista por la del modelo
  239.  
  240. modelo = glm::mat4(1.0f); // es una matriz identidad
  241.  
  242. mvp = proyeccion * vista * modelo;
  243.  
  244. textura = cargarBmp("uvtemplate.bmp"); // cargar bmp
  245. texturaShaderID = glGetUniformLocation(programaID, "textura"); // texturashader id representa
  246. //el espacio de memoria que representa a sampler2D (que es el tipo de dato que usa el shader para las imagenes)
  247.  
  248.  
  249.  
  250. // CONCEPTO: buffer es un espacio de memoria que se manda completo al GPU
  251.  
  252. GLfloat vertex_buffer_data[] = { // esta cura ya sabe que hará un triangulo porque aqui se lo indicamos: glDrawArrays(GL_TRIANGLES, 0, 3);
  253. // el tres indica que son tres vertices (cada uno con x, y and z)
  254. /*
  255. -1.0f, -1.0f, 0.0f, // posiciones x, y and z de el punto 1
  256. 1.0f, -1.0f, 0.0f, //posiciones x, y and z de el punto 2
  257. 0.0f, 1.0f, 0.0f //posiciones x, y and z de el punto 3
  258. */
  259.  
  260. // Lo siguiente es un cubo hecho de triangulos
  261.  
  262. -1.0f, -1.0f, -1.0f,
  263. -1.0f, -1.0f, 1.0f,
  264. -1.0f, 1.0f, 1.0f,
  265. 1.0f, 1.0f, -1.0f,
  266. -1.0f, -1.0f, -1.0f,
  267. -1.0f, 1.0f, -1.0f,
  268. 1.0f, -1.0f, 1.0f,
  269. -1.0f, -1.0f, -1.0f,
  270. 1.0f, -1.0f, -1.0f,
  271. 1.0f, 1.0f, -1.0f,
  272. 1.0f, -1.0f, -1.0f,
  273. -1.0f, -1.0f, -1.0f,
  274. -1.0f, -1.0f, -1.0f,
  275. -1.0f, 1.0f, 1.0f,
  276. -1.0f, 1.0f, -1.0f,
  277. 1.0f, -1.0f, 1.0f,
  278. -1.0f, -1.0f, 1.0f,
  279. -1.0f, -1.0f, -1.0f,
  280. -1.0f, 1.0f, 1.0f,
  281. -1.0f, -1.0f, 1.0f,
  282. 1.0f, -1.0f, 1.0f,
  283. 1.0f, 1.0f, 1.0f,
  284. 1.0f, -1.0f, -1.0f,
  285. 1.0f, 1.0f, -1.0f,
  286. 1.0f, -1.0f, -1.0f,
  287. 1.0f, 1.0f, 1.0f,
  288. 1.0f, -1.0f, 1.0f,
  289. 1.0f, 1.0f, 1.0f,
  290. 1.0f, 1.0f, -1.0f,
  291. -1.0f, 1.0f, -1.0f,
  292. 1.0f, 1.0f, 1.0f,
  293. -1.0f, 1.0f, -1.0f,
  294. -1.0f, 1.0f, 1.0f,
  295. 1.0f, 1.0f, 1.0f,
  296. -1.0f, 1.0f, 1.0f,
  297. 1.0f, -1.0f, 1.0f
  298. };
  299.  
  300. static const GLfloat uv_buffer_data[] = { // Cordenadas UV
  301. 0.000059f, 1.0f - 0.000004f,
  302. 0.000103f, 1.0f - 0.336048f,
  303. 0.335973f, 1.0f - 0.335903f,
  304. 1.000023f, 1.0f - 0.000013f,
  305. 0.667979f, 1.0f - 0.335851f,
  306. 0.999958f, 1.0f - 0.336064f,
  307. 0.667979f, 1.0f - 0.335851f,
  308. 0.336024f, 1.0f - 0.671877f,
  309. 0.667969f, 1.0f - 0.671889f,
  310. 1.000023f, 1.0f - 0.000013f,
  311. 0.668104f, 1.0f - 0.000013f,
  312. 0.667979f, 1.0f - 0.335851f,
  313. 0.000059f, 1.0f - 0.000004f,
  314. 0.335973f, 1.0f - 0.335903f,
  315. 0.336098f, 1.0f - 0.000071f,
  316. 0.667979f, 1.0f - 0.335851f,
  317. 0.335973f, 1.0f - 0.335903f,
  318. 0.336024f, 1.0f - 0.671877f,
  319. 1.000004f, 1.0f - 0.671847f,
  320. 0.999958f, 1.0f - 0.336064f,
  321. 0.667979f, 1.0f - 0.335851f,
  322. 0.668104f, 1.0f - 0.000013f,
  323. 0.335973f, 1.0f - 0.335903f,
  324. 0.667979f, 1.0f - 0.335851f,
  325. 0.335973f, 1.0f - 0.335903f,
  326. 0.668104f, 1.0f - 0.000013f,
  327. 0.336098f, 1.0f - 0.000071f,
  328. 0.000103f, 1.0f - 0.336048f,
  329. 0.000004f, 1.0f - 0.671870f,
  330. 0.336024f, 1.0f - 0.671877f,
  331. 0.000103f, 1.0f - 0.336048f,
  332. 0.336024f, 1.0f - 0.671877f,
  333. 0.335973f, 1.0f - 0.335903f,
  334. 0.667969f, 1.0f - 0.671889f,
  335. 1.000004f, 1.0f - 0.671847f,
  336. 0.667979f, 1.0f - 0.335851f
  337. };
  338.  
  339.  
  340.  
  341. vertexBufferID;
  342. // qué tantos buffers, y donde quiero guardarlo
  343. glGenBuffers(1, &vertexBufferID);
  344. glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
  345. // GLarraybuffer indica que será un buffer que contiene un arreglo
  346. glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW);
  347.  
  348. glGenBuffers(1, &uvBufferID);
  349. glBindBuffer(GL_ARRAY_BUFFER, uvBufferID);
  350. // GLarraybuffer indica que será un buffer que contiene un arreglo
  351. glBufferData(GL_ARRAY_BUFFER, sizeof(uv_buffer_data), uv_buffer_data, GL_STATIC_DRAW);
  352.  
  353. glClearColor(0.5, 0.5, 0.5, 1.0); // Cambia el color de fondo
  354. glfwPollEvents(); //checa si hay eventos
  355.  
  356. // Activar funciones de profundidad
  357. glEnable(GL_DEPTH_TEST);
  358. glDepthFunc(GL_LESS); // Solo rendereamelo si está más adelante de lo que ya está rendereado
  359.  
  360. //Ciclo de dibujo
  361. while (glfwGetKey(window, GLFW_KEY_ESCAPE) !=GLFW_PRESS && !glfwWindowShouldClose(window)){ // si la ventana no está cerrada y no se presiona escape continúa con el ciclo
  362.  
  363. dibujar();
  364.  
  365. }
  366.  
  367. // El siguiente buffer manda cosas al buffer que se "swapea"
  368. glDeleteBuffers(1, &vertexBufferID); // primero, cuantos buffers queremos borrar, y luego la direccion de memoria de donde lo queremos borrar
  369. glDeleteShader(programaID); // Recuerda que programaID es la combinación del fragment y vertex Shader
  370. glDeleteVertexArrays(1, &vertexArrayID);
  371. glfwTerminate();
  372.  
  373. return 0;
  374. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement