montychen / Computer_Graphics_Programming_in_OpenGL_with_C_SourceCode

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Computer Graphics Programming in OpenGL with C++_SourceCode_CGPCompanionFiles

macOS Mojave 10.14 支持OpenGL的最新版本是 4.1 代码需要做如下修改

	 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
	 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

	 glewExperimental = GL_TRUE;
	 glewInit()

下面是在屏幕绘制一个点的例子

	 #include <GL/glew.h>
	 #include <GLFW/glfw3.h>
	 #include <iostream>
	 using namespace std;

	 #define numVAOs 1

	 GLuint renderingProgram;
	 GLuint vao[numVAOs];

	 GLuint createShaderProgram() {
		 const char *vshaderSource =
			 "#version 410    \n"
			 "void main(void) \n"
			 "{ gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";

		 const char *fshaderSource =
			 "#version 410    \n"
			 "out vec4 color; \n"
			 "void main(void) \n"
			 "{ color = vec4(0.0, 0.0, 1.0, 1.0); }";

		 GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
		 GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
		 GLuint vfprogram = glCreateProgram();

		 glShaderSource(vShader, 1, &vshaderSource, NULL);
		 glShaderSource(fShader, 1, &fshaderSource, NULL);
		 glCompileShader(vShader);
		 glCompileShader(fShader);

		 glAttachShader(vfprogram, vShader);
		 glAttachShader(vfprogram, fShader);
		 glLinkProgram(vfprogram);

		 return vfprogram;
	 }

	 void init(GLFWwindow* window) {
		 renderingProgram = createShaderProgram();
		 glGenVertexArrays(numVAOs, vao); // numVAOs指定要创建VAO的数量, vao用来保存新创建vao的标识符。 
		 glBindVertexArray(vao[0]);       // 在这个例子中,其实没用到vao, 因为仅有的一个顶点数据硬编码在顶点着色器里了。
	                                      // 只是OpenGL规范要求,至少要提供一个vao,所以这里就创建了一个。 
	 }

	 void display(GLFWwindow* window, double currentTime) {
		 glUseProgram(renderingProgram);  // 把shader 加载到GUP( OpenGL pipeline)
		 glPointSize(30.0f);              // 默认1个point对应1个pixel的大小。 这里把1个point设置成30个像素的大小。
		 glDrawArrays(GL_POINTS, 0, 1);   // pipeline里的 GLSL代码(shader)开始执行。 这里指定的图元类型是 GL_POINTS
		 glfwSwapBuffers(window);         // 在屏幕上显示出来。
	 }

	 int main(void) {
		 if (!glfwInit()) { exit(EXIT_FAILURE); }
		 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
		 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
		 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
		 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

		 GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter 2 - program 2", NULL, NULL);
		 glfwMakeContextCurrent(window);

		 glewExperimental = GL_TRUE;
		 if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
		 glfwSwapInterval(1);

		 init(window);

		 while (!glfwWindowShouldClose(window)) {
			 display(window, glfwGetTime());
			 glfwPollEvents();
		 }

		 glfwDestroyWindow(window);
		 glfwTerminate();
		 exit(EXIT_SUCCESS);
	 }

About


Languages

Language:C++ 91.1%Language:GLSL 8.9%