· 5 years ago · Aug 10, 2020, 01:50 PM
1#include <glad/glad.h>
2#include <GLFW/glfw3.h>
3#include <iostream>
4//bị lỗi ko gọi nên phải gọi ở đây để nó define
5void processInput(GLFWwindow* window);
6
7//dùng cho màu uniform(chuyển màu theo thời gian)
8//const char* vertexShaderSource = "#version 330 core\n"
9//"layout (location = 0) in vec3 aPos;\n"
10//"out vec4 vertexColor;"
11//"void main()\n"
12//"{\n"
13//" gl_Position = vec4(aPos,1.0);\n"
14//" vertexColor = vec4(0.5, 0.0, 0.0, 1.0);"
15//"}\0";
16//
17//const char* fragmentShaderSource = "#version 330 core\n"
18//"out vec4 FragColor;\n"
19//"uniform vec4 ourColor;"
20//"void main()\n"
21//"{"
22//" FragColor = ourColor;\n"
23//
24//"}\n";
25
26
27const char* vertexShaderSource = "#version 330 core\n"
28"layout (location = 0) in vec3 aPos;\n"
29"layout (location = 1) in vec3 aColor;\n"
30"out vec3 ourColor;\n"
31"void main()\n"
32"{\n"
33" gl_Position = vec4(aPos,1.0);\n"
34" ourColor = aColor;"
35"}\0";
36
37const char* fragmentShaderSource = "#version 330 core\n"
38"out vec4 FragColor;\n"
39"in vec3 ourColor;\n"
40"void main()\n"
41"{\n"
42" FragColor = vec4(ourColor,1.0f);\n"
43
44"}\n";
45
46
47
48
49
50/*Ch?nh màu c?a tam giác th? 2 khác */
51//const char* fragmentShaderSource1 = "#version 330 core\n"
52//"out vec4 FragColor;\n"
53//"void main()\n"
54//"{"
55//" FragColor = vec4(0.5f, 0.3f, 0.5f, 1.0f);\n"
56//
57//"}\0";
58//
59//const char* fragmentShaderSource2 = "#version 330 core\n"
60//"out vec4 FragColor;\n"
61//"void main()\n"
62//"{"
63//" FragColor = vec4(1.0f, 0.5f, 0.75f, 1.0f);\n"
64//
65//"}\0";
66
67
68
69//setting cho width và height thay vì thay b?ng tay
70const unsigned int Src_width = 1080;
71const unsigned int Src_height = 768;
72int main()
73{
74 /*Khởi tạo GLFW*/
75 //--------------//
76 glfwInit();//Thực thi glfw
77 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//Gọi rõ phiên bản OpenGL dang sử dụng để có thể sử dụng API tuong ứng
78 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
79 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//Làm rõ được profile của OpenGL truớc khi thực thi một sự kiện nào dó
80
81
82 /*Kh?i tao Window d? v?*/
83 //----------------------//
84 GLFWwindow* window = glfwCreateWindow(Src_width, Src_height, "TestingWindow", NULL, NULL);//Khởi tạo window
85
86 if (window == NULL)
87 {
88 std::cout << "Failed to Execute" << std::endl;//Thông báo khi thất bại
89 glfwTerminate();
90 return -1;
91 }
92 glfwMakeContextCurrent(window);
93
94 /*Khởi tạo GLAD để sử dụng fuction pointer của OpenGL*/
95 //----------------------------------------------------//
96 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//Ðiều kiện khởi tạo GLAD
97 {
98 std::cout << "Failed to initialize GLAD" << std::endl;//Thông báo nếu thất bại
99
100 return -1;
101 }
102
103 /*Khởi tạo vertex shader*/
104 int vertexShader = glCreateShader(GL_VERTEX_SHADER);//khởi tạo vertex shader
105 glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//Lấy nguồn shader
106 glCompileShader(vertexShader);//Compile cái shader
107
108 /*Khởi tạo fragment shader*/
109 int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);//Khởi tạo fragment shader
110 glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);//Lấy nguồn shader
111 glCompileShader(fragmentShader);//Compile shader
112
113
114 /*Fragment shader cho 2 tam giác khác*/
115 //int fragmentShader1 = glCreateShader(GL_FRAGMENT_SHADER);
116 //glShaderSource(fragmentShader1, 1, &fragmentShaderSource1, NULL);
117 //glCompileShader(fragmentShader1);//Compile shader
118
119 //int fragmentShader2 = glCreateShader(GL_FRAGMENT_SHADER);
120 //glShaderSource(fragmentShader2, 1, &fragmentShaderSource2, NULL);
121 //glCompileShader(fragmentShader2);//Compile shader
122
123
124 /*Kiểm tra vertex shader và fragment shader có chạy hay ko*/
125 int success;
126 char infoLog[512];
127 glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
128 if (!success)
129 {
130 glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
131 std::cout << "Failed to execute Vertex Shader" << infoLog << std::endl;
132 }
133
134 /*Th? nghi?m fragment shader có ch?y ko*/
135 glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
136 if (!success)
137 {
138 glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
139 std::cout << "Failed to execute Fragment Shader\n" << infoLog << std::endl;
140 }
141
142 /*Link Shader*/
143 int shaderProgram = glCreateProgram();//Tạo link shader
144 glAttachShader(shaderProgram, vertexShader);
145 glAttachShader(shaderProgram, fragmentShader);
146 glLinkProgram(shaderProgram);
147
148 ///*Link Shader cho 2 tam giác*/
149 //int shaderProgram1 = glCreateProgram();
150 //glAttachShader(shaderProgram1, vertexShader);
151 //glAttachShader(shaderProgram1, fragmentShader1);
152 //glLinkProgram(shaderProgram1);
153
154 //int shaderProgram2 = glCreateProgram();
155 //glAttachShader(shaderProgram2, vertexShader);
156 //glAttachShader(shaderProgram2, fragmentShader2);
157 //glLinkProgram(shaderProgram2);
158
159 /*Ki?m tra link*/
160 glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
161 if (!success)
162 {
163 glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
164 std::cout << "Failed to link 2 shader together\n" << infoLog << std::endl;
165 }
166 glDeleteShader(vertexShader);
167 glDeleteShader(fragmentShader);
168 /*t?a d? vertex data*/
169 //------------------//
170 float vertices[] = {
171
172 //tọa độ hình tam giác
173 //vị trí //màu
174 0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f, //top
175 -0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f, // left
176 0.0f, 0.5f,0.0f,0.0f,0.0f,1.0f // right
177 };
178
179 // //t?a d? hình ch? nh?t
180 // 0.5f, 0.5f, 0.0f,//Top Right
181 // 0.5f, -0.5f, 0.0f,//Bottom Right
182 // -0.5f, -0.5f, 0.0f,//Bottom Left
183 // -0.5f, 0.5f, 0.0f//Top Left
184 //};
185
186 /*Nếu sử dụng EBO thì không cần 6 tọa độ để vẽ ra hình chữ nhật*/
187 //vẽ 2 hình tam giác
188 // // first triangle
189 // -0.9f, -0.5f, 0.0f, // left
190 // -0.0f, -0.5f, 0.0f, // right
191 //-0.5f, 0.5f, 0.0f, // top
192 //// second triangle
193 // 0.8f, -0.5f, 0.0f, // left
194 //0.9f, -0.5f, 0.0f, // right
195 //0.7f, 0.5f, 0.0f // bottom
196 //};
197
198 /*Luu trữ tọa độ để vẽ hình chữ nhật*/
199 //Những tọa độ nào trùng sẽ đượ tái sử dụng thay vì chạy xong và bỏ các tọa độ còn lại
200
201 //unsigned int index[] =
202 //{
203 // 0,1,3,//Tam giác d?u tiên
204 // 1,2,3//Tam giác th? 2
205 //};
206
207 //float firstTriangles[] = {
208 //-0.9f, -0.5f, 0.0f, // left
209 //-0.0f, -0.5f, 0.0f, // right
210 //-0.5f, 0.5f, 0.0f, // top
211
212 //};
213
214 //float secondTriangles[] = {
215
216 //0.0f, -0.5f, 0.0f, // left
217 //0.9f, -0.5f, 0.0f, // right
218 //0.45f, 0.5f, 0.0f // bottom
219 //};
220
221
222 ///*S? d?ng 2 VAOs và VBOs d? v? 2 tam giác*/
223 //unsigned int VBOs[2], VAOs[2];//Vertex Buffer Object, Vertex Array Object, Element Buffer Object
224 //glGenBuffers(2, VBOs);//T?o ra m?t ho?c nhi?u object buffers
225 //glGenVertexArrays(2, VAOs);//T?o ra m?t ho?c nhi?u array
226
227 ///*VAOs và VBOs cho tam giác d?u tiên*/
228 //glBindVertexArray(VAOs[0]);//g?n object array cho buffer hi?n t?i
229 //glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);// g?n object buffer cho buffer hi?n t?i
230 //glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangles), firstTriangles, GL_STATIC_DRAW);//sử dụng data của tọa độ để vẽ
231 //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//gọi vertex buffer data để có thể vẽ dc
232 //glEnableVertexAttribArray(0);
233
234 ///*VAOs và VBOs cho tam giác th? hai*/
235 //glBindVertexArray(VAOs[1]);//gắn object array cho buffer hiện tại
236 //glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);// gắn object buffer cho buffer hiện tại
237 //glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangles), secondTriangles, GL_STATIC_DRAW);//s? d?ng data c?a t?a d? d? v?
238 //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);//gi?i vertex buffer data d? có th? v? dc
239 //glEnableVertexAttribArray(0);
240
241
242 unsigned int VBO, VAO, EBO;//Vertex Buffer Object, Vertex Array Object, Element Buffer Object
243 glGenBuffers(1, &VBO);//Tạo ra một hoặc nhiều object buffers
244 //glGenBuffers(1, &EBO);
245 glGenVertexArrays(1, &VAO);//Tạo ra một hoặc nhiều array
246
247
248 //V? 1 hình ch? nh?t và 1 hình tam giác
249 //VAO và VBO //
250 //-----------//
251 /*0.Copy m?ng t?a d? vào buffer d? openGL s? d?ng*/
252 glBindVertexArray(VAO);//g?n object array cho buffer hi?n t?i
253 glBindBuffer(GL_ARRAY_BUFFER, VBO);// g?n object buffer cho buffer hi?n t?i
254 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//sử dụng data củaa tọa độ để vẽ
255
256
257 //giá trị vị trí
258 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
259 glEnableVertexAttribArray(0);
260
261 //giá trị màu
262 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3*sizeof(float)));
263 glEnableVertexAttribArray(1);
264
265
266
267
268 //EBO
269 //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);// gắn object buffer cho buffer hiện tại
270 //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index), index, GL_STATIC_DRAW);
271 //GL_STATIC_DRAW sử dụng data 1 lần và vẽ nhiều lần
272 /*1.Gắn vertex attribute pointer*/
273 //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//gọi vertex buffer data để có thể vẽ dc
274 //glEnableVertexAttribArray(0);
275 /*2.Sử dụng shader program khi mình muốn render ra object*/
276 //glUseProgram(shaderProgram);
277 /*3.V? cái object mình mu?n*/
278 //ToDo
279
280 /*render loop*/
281 //------------//
282 while (!glfwWindowShouldClose(window))
283 {
284 //input
285 processInput(window);
286 //lệnh render
287 glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
288 glClear(GL_COLOR_BUFFER_BIT);
289 //Lệnh vẽ hình
290 //shader
291 glUseProgram(shaderProgram);//cho 1 hình chữ nhật và 1 hình tam giác
292 //uniform color
293 //float timeGet = glfwGetTime();// lấy thời gian trong 1 giây
294 ////nếu thêm màu thì sẽ từ từ chuyển dần từ 1 màu sang màu khác có cả trộn lẫn màu
295 //float greenColor = sin(timeGet) / 2.0f + 0.5f;//lấy sin của thời gian trong 1 giây chia cho 2 + cho 0.5 ra màu xanh nhưng nó sẽ tự chuyển đổi màu
296 //float redColor = cos(timeGet) / 1.0f+0.5f;
297 //float blueColor = sin(timeGet) / 1.0f + 0.5f;
298 //int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
299 //glUniform4f(vertexColorLocation,redColor,greenColor,blueColor,1.0f);//đồng nhất màu
300 /* glBindVertexArray(VAO);*/
301
302
303
304 ////vẽ 2 hình
305 ////Hình đầu tiên
306 //glUseProgram(shaderProgram1);
307 //glBindVertexArray(VAOs[0]);
308 //glDrawArrays(GL_TRIANGLES,0,3);//tam giác đầu tiên
309 //
310 ////Hình thứ 2
311 //glUseProgram(shaderProgram2);
312 //glBindVertexArray(VAOs[1]);
313 //glDrawArrays(GL_TRIANGLES, 0, 3);//tam giác thứ 2
314
315 //vẽ 1 hình tam giác
316 glDrawArrays(GL_TRIANGLES,0,3);//(Chỉ sử dụng vẽ tam giác thôi)
317
318 //vẽ hình chữ nhật bằng 2 tam giác
319 //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);//sử dụng để vẽ hình chữ nhật
320 //glBindVertexArray(0);// để không phải unbind VAO
321 //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
322 //kiểm tra event như key press hay chuột di chuyển
323 glfwSwapBuffers(window);
324 glfwPollEvents();
325 }
326
327 /*Render xóa khi hoàn t?t*/
328 //------------------------//
329 glfwTerminate();
330 return 0;
331}
332/*Ki?m tra input*/
333void processInput(GLFWwindow* window)
334{
335 if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//điều kiện nếu nút escape đã ấn
336 {
337 glfwSetWindowShouldClose(window, true);// dóng window khi ấn escape
338 }
339}
340
341/*Function call back khi resize window*/
342//-------------------------------------//
343void framebuffer_size_callback(GLFWwindow* window, int width, int height)
344{
345 glViewport(0, 0, width, height);//luu giá trả của window theo con số được khởi tạo
346 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//đưa giá trị thay đổi vào window khi thay đổi
347}
348
349