1. projection 里的角度,角度越大,物体离摄像机越远;角度越小,物体离摄像机越近,这个角度表示视野(fov),视野越大,看到的物体就越小

头文件

  1. #ifndef SHADER_H_INCLUDE
  2. #define SHADER_H_INCLUDE
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <sstream>
  7. #include <fstream>
  8.  
  9. #include <GL/glew.h>
  10. #include <GLFW/glfw3.h>
  11. #include <glm/glm.hpp>
  12. #include <glm/gtc/matrix_transform.hpp>
  13. #include <glm/gtc/type_ptr.hpp>
  14. #include <typeinfo>
  15. class Shader {
  16. public:
  17. unsigned int ID;
  18.  
  19. Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
  20. {
  21. std::string vertexCode;
  22. std::string fragmentCode;
  23. std::ifstream vShaderFile;
  24. std::ifstream fShaderFile;
  25.  
  26. vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  27. fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
  28.  
  29. try {
  30. //open files
  31. vShaderFile.open(vertexPath);
  32. fShaderFile.open(fragmentPath);
  33.  
  34. std::stringstream vShaderStream, fShaderStream;
  35.  
  36. //read file's buffer contents into streams
  37. vShaderStream << vShaderFile.rdbuf();
  38. fShaderStream << fShaderFile.rdbuf();
  39.  
  40. //close file handlers
  41. vShaderFile.close();
  42. fShaderFile.close();
  43.  
  44. //convert stream into string
  45. vertexCode = vShaderStream.str();
  46. fragmentCode = fShaderStream.str();
  47. }
  48. catch (std::ifstream::failure e)
  49. {
  50. std::cout << "ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ" << std::endl;
  51. }
  52. const char* vShaderCode = vertexCode.c_str();
  53. const char* fShaderCode = fragmentCode.c_str();
  54.  
  55. //2.compile shaders
  56. unsigned int vertex, fragment;
  57. int success;
  58. char infoLog[];
  59.  
  60. //vertex shader
  61. vertex = glCreateShader(GL_VERTEX_SHADER);
  62. glShaderSource(vertex, , &vShaderCode, NULL);
  63. glCompileShader(vertex);
  64. glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
  65. if (!success)
  66. {
  67. glGetShaderInfoLog(vertex, , NULL, infoLog);
  68. std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED!" << std::endl;
  69. }
  70.  
  71. fragment = glCreateShader(GL_FRAGMENT_SHADER);
  72. glShaderSource(fragment, , &fShaderCode, NULL);
  73. glCompileShader(fragment);
  74. glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
  75. if (!success)
  76. {
  77. glGetShaderInfoLog(fragment, , NULL, infoLog);
  78. std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED!" << std::endl;
  79. }
  80.  
  81. ID = glCreateProgram();
  82. glAttachShader(ID, vertex);
  83. glAttachShader(ID, fragment);
  84. glLinkProgram(ID);
  85. glGetProgramiv(ID, GL_LINK_STATUS, &success);
  86. if (!success)
  87. {
  88. glGetProgramInfoLog(ID, , NULL, infoLog);
  89. std::cout << "ERROR::SHADER::PROGRAM::LINKTING_FAILED!" << std::endl;
  90. }
  91.  
  92. //delete the shaders sa they are linked into our program now and no long necessary
  93. glDeleteShader(vertex);
  94. glDeleteShader(fragment);
  95. }
  96.  
  97. //activate the shader
  98. void use()
  99. {
  100. glUseProgram(ID);
  101. }
  102.  
  103. //utility uniform functions
  104. void setBool(const std::string &name, bool value) const
  105. {
  106. glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
  107. }
  108.  
  109. void setInt(const std::string &name, int value) const
  110. {
  111. glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
  112. }
  113.  
  114. void setFloat(const std::string &name, float value) const
  115. {
  116. glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
  117. }
  118.  
  119. void setMat4(const std::string &name, glm::mat4 &trans) const
  120. {
  121.  
  122. glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), , GL_FALSE, &trans[][]);
  123. }
  124.  
  125. /*void setMat4(const std::string &name, glm::mat4 trans) const
  126. {
  127.  
  128. //'trans': formal parameter with requested alignment of 16 won't be aligned,请求对齐的16的形式参数不会对齐
  129. glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, glm::value_ptr(trans));
  130. }*/
  131.  
  132. };
  133.  
  134. #endif

.cpp源文件

  1. //projection 里的角度,角度越大,物体离摄像机越远;角度越小,物体离摄像机越近,这个角度表示视野(fov)
  2. //视野越大,看到的物体就越小
  3. #include <iostream>
  4. using namespace std;
  5. #define GLEW_STATIC
  6. #include <GL/glew.h>
  7. #include <GLFW/glfw3.h>
  8. #define STB_IMAGE_IMPLEMENTATION
  9. #include "stb_image.h"
  10. #include "Shader.h"
  11. #include <glm/glm.hpp>
  12. #include <glm/gtc/matrix_transform.hpp>
  13. #include <glm/gtc/type_ptr.hpp>
  14.  
  15. void framebuffer_size_callback(GLFWwindow* window, int width, int height);
  16. void mouse_callback(GLFWwindow* window, GLdouble xpos, GLdouble ypos);
  17. void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
  18. //void scroll_callback(GLFWwindow* window, GLdouble xoffset, GLdouble yoffset);
  19. void processInput(GLFWwindow *window);
  20.  
  21. glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
  22. glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
  23. glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
  24.  
  25. float deltaTime = 0.0f;
  26. float lastFrame = 0.0f;
  27. float mixValue = 0.3f;
  28. float SCR_WIDTH = ;
  29. float SCR_HEIGHT = ;
  30. float Left = 0.0f;
  31. float Up = 0.0f;
  32. float lastX = , lastY = ;
  33. float yaw = -90.0f, pitch = 0.0f;//yaw是偏航角,pitch是俯仰角
  34. GLboolean firstMouse = true;
  35. float fov = 45.0f;
  36.  
  37. int main()
  38. {
  39. glfwInit();
  40. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, );
  41. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, );
  42. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  43. GLFWwindow* window = glfwCreateWindow(, , "LearnOpenGL", NULL, NULL);
  44. if (!window)
  45. {
  46. cout << "Failed to create window!\n" << endl;
  47. glfwTerminate();
  48. return -;
  49. }
  50. glfwMakeContextCurrent(window);
  51.  
  52. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  53. glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //隐藏并捕捉光标
  54. glfwSetCursorPosCallback(window, mouse_callback); //回调鼠标事件
  55. glfwSetScrollCallback(window, scroll_callback); //滚轮回调事件
  56.  
  57. glewExperimental = GL_TRUE;
  58. if (glewInit() != GLEW_OK)
  59. {
  60. cout << "Failed to initialize GLEW!" << endl;
  61. return -;
  62. }
  63.  
  64. //glfwSetCursorPosCallback(window, mouse_callback);
  65. //glfwSetScrollCallback(window, scroll_callback);
  66.  
  67. //tell GLFW to capture our mouse
  68. //glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
  69.  
  70. //configure global opengl state, z buffer
  71. glEnable(GL_DEPTH_TEST);//Z缓冲,深度缓冲
  72.  
  73. //build and compile our shader program
  74. Shader ourShader("E:\\C++\\3.txt", "E:\\C++\\4.txt");
  75.  
  76. float vertices[] = {
  77. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
  78. 0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
  79. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
  80. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
  81. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
  82. -0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
  83.  
  84. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
  85. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
  86. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
  87. 0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
  88. -0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
  89. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
  90.  
  91. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  92. -0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
  93. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  94. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  95. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
  96. -0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  97.  
  98. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  99. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
  100. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  101. 0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  102. 0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
  103. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  104.  
  105. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  106. 0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
  107. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
  108. 0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
  109. -0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
  110. -0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
  111.  
  112. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
  113. 0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
  114. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  115. 0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
  116. -0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
  117. -0.5f, 0.5f, -0.5f, 0.0f, 1.0f
  118. };
  119.  
  120. glm::vec3 cubePositions[] = {
  121. glm::vec3(0.0f, 0.0f, 0.0f),
  122. glm::vec3(2.0f, 5.0f, -15.0f),
  123. glm::vec3(-1.5f, -2.2f, -2.5f),
  124. glm::vec3(-3.8f, -2.0f, -12.3f),
  125. glm::vec3(2.4f, -0.4f, -3.5f),
  126. glm::vec3(-1.7f, 3.0f, -7.5f),
  127. glm::vec3(1.3f, -2.0f, -2.5f),
  128. glm::vec3(1.5f, 2.0f, -2.5f),
  129. glm::vec3(1.5f, 0.2f, -1.5f),
  130. glm::vec3(-1.3f, 1.0f, -1.5f)
  131. };
  132.  
  133. unsigned int indeices[] = {
  134. , , ,
  135. , ,
  136. };
  137. unsigned int VBO, VAO, EBO;
  138. glGenVertexArrays(, &VAO);
  139. glGenBuffers(, &VBO);
  140. glGenBuffers(, &EBO);
  141.  
  142. glBindVertexArray(VAO);
  143. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  144. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  145.  
  146. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  147. //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indeices), indeices, GL_STATIC_DRAW);
  148.  
  149. glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(float), (void*));
  150. glEnableVertexAttribArray();
  151.  
  152. glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(float), (void*)( * sizeof(float)));
  153. glEnableVertexAttribArray();
  154.  
  155. //glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
  156. //glEnableVertexAttribArray(2);
  157.  
  158. unsigned int texture1, texture2;
  159. glGenTextures(, &texture1);
  160. glBindTexture(GL_TEXTURE_2D, texture1);
  161.  
  162. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  163. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  164.  
  165. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  166. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  167.  
  168. int width, height, nrChannels;//Channels通道
  169. stbi_set_flip_vertically_on_load(true); //tell stb_image.h to flip load texture's on the y-axis //flip翻转
  170. unsigned char *data = stbi_load("wall.jpg", &width, &height, &nrChannels, ); //加载图像
  171. if (data)
  172. {
  173. glTexImage2D(GL_TEXTURE_2D, , GL_RGB, width, height, , GL_RGB, GL_UNSIGNED_BYTE, data); //创建一个纹理
  174. glGenerateMipmap(GL_TEXTURE_2D); //承担创建一个纹理后接下来的全部工作,为当前绑定的纹理自动生成所有需要的多级渐远纹理
  175. }
  176. else
  177. {
  178. cout << "Failed to load texture1!" << endl;
  179. }
  180. stbi_image_free(data); //为绑定的纹理生辰多级渐远纹理之后释放图像的内存
  181.  
  182. //texture2
  183. glGenTextures(, &texture2);
  184. glBindTexture(GL_TEXTURE_2D, texture2);
  185.  
  186. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
  187. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
  188.  
  189. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  190. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  191.  
  192. data = stbi_load("timg.jpg", &width, &height, &nrChannels, );
  193. if (data)
  194. {
  195. glTexImage2D(GL_TEXTURE_2D, , GL_RGB, width, height, , GL_RGB, GL_UNSIGNED_BYTE, data);
  196. glGenerateMipmap(GL_TEXTURE_2D);
  197. }
  198. else
  199. {
  200. cout << "Failed to load texture2!" << endl;
  201. }
  202. stbi_image_free(data);
  203.  
  204. ourShader.use();
  205. glUniform1i(glGetUniformLocation(ourShader.ID, "texture1"), );
  206. glUniform1i(glGetUniformLocation(ourShader.ID, "texture2"), );
  207.  
  208. //trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
  209. //trans = glm::scale(trans, glm::vec3(0.5f, -0.5f, 1.0f));
  210. //第二个参数是传递的矩阵的数量,第三个是是否希望矩阵被置换(行与列交换),第四个是要传递的矩阵
  211.  
  212. float axis;
  213.  
  214. //render loop
  215. while (!glfwWindowShouldClose(window))
  216. {
  217. //per-frame time logic 每帧的时间增量
  218. GLfloat currentFrame = glfwGetTime();
  219. deltaTime = currentFrame - lastFrame;
  220. lastFrame = currentFrame;
  221.  
  222. processInput(window);
  223.  
  224. glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  225. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  226.  
  227. glActiveTexture(GL_TEXTURE0);
  228. glBindTexture(GL_TEXTURE_2D, texture1);
  229. glActiveTexture(GL_TEXTURE1);
  230. glBindTexture(GL_TEXTURE_2D, texture2);
  231.  
  232. ourShader.setFloat("mixValue", mixValue);
  233.  
  234. glm::mat4 trans;
  235.  
  236. //trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
  237. //trans = glm::rotate(trans, glm::radians(15.0f), glm::vec3(1.0f, 0.0f, 0.0f));
  238. //trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
  239. glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "transform"), , GL_FALSE, glm::value_ptr(trans));
  240.  
  241. glUseProgram(ourShader.ID);
  242. glm::mat4 transform;
  243. transform = glm::translate(trans, glm::vec3(Left, Up, 0.0f));
  244. ourShader.setMat4("transform", transform);
  245.  
  246. //glm::mat4 model;
  247. glm::mat4 view;
  248. glm::mat4 projection;
  249. //model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f));
  250. //model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));
  251. //view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
  252. view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
  253.  
  254. //摄像机的lookAt矩阵就是观察矩阵
  255. //glm::mat4 view;
  256. float radius = 10.0f;
  257. float camX = sin(glfwGetTime()) * radius;
  258. float camZ = cos(glfwGetTime()) * radius;
  259. //view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
  260.  
  261. //projection = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
  262. projection = glm::perspective(glm::radians(fov), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); //
  263. //glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "model"), 1, GL_FALSE, glm::value_ptr(model));
  264. glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "view"), , GL_FALSE, glm::value_ptr(view));
  265. ourShader.setMat4("projection", projection);
  266.  
  267. glBindVertexArray(VAO);
  268.  
  269. for (unsigned int i = ; i < ; i++)
  270. {
  271. glm::mat4 model;
  272. model = glm::translate(model, cubePositions[i]);
  273. float angle = 20.0f * i;
  274.  
  275. angle = glfwGetTime() * 25.0f;
  276.  
  277. //axis = sin(glfwGetTime());
  278. model = glm::rotate(model, glm::radians(angle), glm::vec3(0.2f * i, 0.1* i, 0.3));
  279. ourShader.setMat4("model", model);
  280. glDrawArrays(GL_TRIANGLES, , );
  281. }
  282.  
  283. //glDrawArrays(GL_TRIANGLES, 0, 36);
  284. //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  285.  
  286. //trans = glm::mat4(); //trans必须是与上面的trans是同一个,一个uniform在同一个程序中只能被绑定一次
  287. //trans = glm::translate(trans, glm::vec3(-0.5f, 0.5f, 0.0f));
  288. //trans = glm::scale(trans, glm::vec3(sin(glfwGetTime()), sin(glfwGetTime()), sin(glfwGetTime())));
  289. //glUniformMatrix4fv(glGetUniformLocation(ourShader.ID, "transform"), 1, GL_FALSE,glm::value_ptr(trans));
  290. ////glBindVertexArray(VAO);
  291. //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  292.  
  293. glfwSwapBuffers(window);
  294. glfwPollEvents();
  295. }
  296.  
  297. glDeleteVertexArrays(, &VAO);
  298. glDeleteBuffers(, &VBO);
  299.  
  300. glfwTerminate();
  301. return ;
  302.  
  303. return ;
  304. }
  305.  
  306. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  307. {
  308. glViewport(, , width, height);
  309. }
  310.  
  311. void processInput(GLFWwindow* window)
  312. {
  313. if (glfwGetKey(window, GLFW_KEY_ENTER) == GLFW_PRESS)
  314. glfwSetWindowShouldClose(window, true);
  315. if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
  316. {
  317. mixValue += 0.001f;
  318. if (mixValue >= 1.0f)
  319. mixValue = 1.0f;
  320. }
  321. if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
  322. {
  323. mixValue -= 0.001f;
  324. if (mixValue <= 0.0f)
  325. mixValue = 0.0f;
  326. }
  327.  
  328. if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS)
  329. {
  330. Left -= 0.001;
  331. }
  332.  
  333. if (glfwGetKey(window, GLFW_KEY_6) == GLFW_PRESS)
  334. {
  335. Left += 0.001f;
  336. }
  337. if (glfwGetKey(window, GLFW_KEY_8) == GLFW_PRESS)
  338. {
  339. Up += 0.001f;
  340. }
  341.  
  342. if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS)
  343. {
  344. Up -= 0.001f;
  345. }
  346.  
  347. float cameraSpeed = 2.5 * deltaTime;
  348. if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
  349. cameraPos += cameraSpeed * cameraFront;
  350. if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
  351. cameraPos -= cameraSpeed * cameraFront;
  352. if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
  353. cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
  354. if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
  355. cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
  356. }
  357.  
  358. void mouse_callback(GLFWwindow* window, double xpos, double ypos)
  359. {
  360. if (firstMouse)
  361. {
  362. lastX = xpos;
  363. lastY = ypos;
  364. firstMouse = false;
  365. }
  366.  
  367. float xoffset = xpos - lastX;
  368. float yoffset = lastY - ypos;
  369.  
  370. lastX = xpos;
  371. lastY = ypos;
  372. float sensitivity = 0.0005f;
  373. xoffset *= sensitivity;
  374. yoffset *= sensitivity;
  375. yaw += xoffset;
  376. pitch += yoffset;
  377.  
  378. if (pitch > 89.0f)
  379. pitch = 89.0f;
  380. if (pitch < -89.0f)
  381. pitch = -89.0f;
  382.  
  383. glm::vec3 front;
  384. front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
  385. front.y = sin(glm::radians(pitch));
  386. front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
  387. cameraFront = glm::normalize(front);
  388.  
  389. }
  390.  
  391. void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
  392. {
  393. if (fov >= 1.0f && fov <= 45.0f)
  394. fov -= yoffset;
  395. if (fov <= 1.0f)
  396. fov = 1.0f;
  397. if (fov >= 45.0f)
  398. fov = 45.0f;
  399. }

timg.jpg文件

wall.jpg文件

learnopengl“入门”的全部代码的更多相关文章

  1. ArcGIS API for JavaScript 入门教程[4] 代码的骨架

    [回顾与本篇预览] 上篇简单介绍了JsAPI中的数据与视图,并告诉大家这两部分有什么用.如何有机连接在一起. 这一篇快速介绍一下前端代码的骨架.当然,假定你已经熟悉HTML5.CSS3和JavaScr ...

  2. 动态规划初级 入门理解 C#代码

      using System; using System.Collections.Generic; using System.Linq; using System.Text; using Micros ...

  3. plain framework 1 参考手册 入门指引之 代码风格

    代码风格 介绍 介绍 框架自身采用了google的C++风格,作者也鼓励在你的应用中使用此风格,有关此风格你可以查阅相关资料了解.下面是一段plain framework中的代码,以便大家参考: 你可 ...

  4. Bootstrap入门四:代码

    1.内联代码 code: 通过 <code> 标签包裹内联样式的代码片段.灰色背景.灰色边框和红色字体. For example, <code><section>& ...

  5. kotlin 语言入门指南(二)--代码风格

    语言风格 这里整理了 kotlin 惯用的代码风格,如果你有喜爱的代码风格,可以在 github 上给 kotlin 提 pull request . 创建DTOs(POJSs/POCOs) 文件: ...

  6. ActiveMQ入门案例-生产者代码实现

    <–start–> 使用Java程序操作ActiveMQ生产消息,代码的复杂度较高,但也没有默写下来的必要. 开发ActiveMQ首先需要导入activemq-all.jar包,如果是ma ...

  7. 快速入门Treap(代码实现)

    学习数据结构对我来说真的相当困难,网上讲\(Treap\)的我也看不太懂,前前后后花了大概六天才把\(Treap\)学会.为了避免再次忘记,这里我整理一下\(Treap\)的基础知识和模板. 阅读此文 ...

  8. C#零基础入门08:代码规范

    一:前言 没有规矩,不成方圆.在代码的世界中,尤其这样.作为程序员,我们不想让我们的代码写出去之后被人耻笑:看,连个换行都换的这么不专业.作为开发主管,我们则不想我们的组员写出来的代码各类风格都有,五 ...

  9. Node.js安装和入门 - 2行代码让你能够启动一个Server

    转自:http://josh-persistence.iteye.com/blog/1979552  备忘 Node.js是一个轻松构建快速,可扩展的网络应用平台建立在Chrome的JavaScrip ...

随机推荐

  1. netty pipeline.addLast

    pipeline有一个主要的实现类 DefaultChannelPipeline ,addLast顾名思义,就是在处理器链的最后添加一个channelHandler. 代码如下:@Override  ...

  2. [Paper] Selection and replacement algorithm for memory performance improvement in Spark

    Summary Spark does not have a good mechanism to select reasonable RDDs to cache their partitions in ...

  3. 70 多表查询的分组F 聚合 Q 查询

    聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...

  4. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

  5. centos6.6安装hadoop-2.5.0(二、伪分布式部署)

    操作系统:centos6.6(一台服务器) 环境:selinux disabled:iptables off:java 1.8.0_131 安装包:hadoop-2.5.0.tar.gz 伪分布式环境 ...

  6. Sphinx将python代码注释生成文档

    安装 使用pip进行安装: pip install sphinx 初始化 进入你代码所在的目录,输入: sphinx-quickstart 下图:PRD是代码所在目录,生成的文档保存目录设成doc  ...

  7. 第三十二课 linux内核链表剖析

    __builtin_prefetch是gcc扩展的,用来提高访问效率,需要硬件的支持. 在标准C语言中是不允许static inline联合使用的. 删除依赖的头文件,将相应的结构拷贝到LinuxLi ...

  8. java ip 正则表达式

    private static boolean isBoolIp(String ipAddress) { String ip = "(?:(?:25[0-5]|2[0-4][0-9]|[01] ...

  9. Linux上统计文件夹下文件个数以及目录个数

    对于linux终端用户而言,统计文件夹下文件的多少是经常要做的操作,于我而言,我会经常在谷歌搜索一个命令,“如何在linux统计文件夹的个数”,然后点击自己想要的答案,但是有时候不知道统计文件夹命令运 ...

  10. XXS level3

    (1)用level1和2的方法都行不通,查看PHP源代码,发现url与输入框内容都进行了过滤 <?php ini_set("display_errors", 0); $str ...