int main(void)
{
    GLFWwindow* window;

    if (!glfwInit())
        return -1;
    
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    
    
 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }
    
    glfwMakeContextCurrent(window);
    
    // Set the required callback functions
    glfwSetKeyCallback(window, key_callback);
    

    
    // Define the viewport dimensions
    glViewport(0, 0, 640, 480);
    
    // Setup OpenGL options
    glEnable(GL_DEPTH_TEST);
    
    
    printf("%s \n\n",glGetString(GL_VERSION)) ;
    

    
    
    //下面两种方式二选一:
    //1.使用全局的字符串加载shader
//    compileShaders();
    
    //2.使用c++类加载shader资源文件
    
    

    
    
        ZZLShader myshader("./shaderFiles/vertexShader.vs", "./shaderFiles/fragmentShader.frag");
    //
   
    
    process();
    
    textureProcess();
    while (!glfwWindowShouldClose(window))
    {
        
        glClearColor(0.2, 0.2, 0.2, 1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        /*  use uniform global var..
         
        GLfloat timeValue = glfwGetTime();
        GLfloat greenValue = sin(timeValue)/2 + 0.5f;
        GLuint vertexColorLocation = glGetUniformLocation(shaderProgram, "changeColor");
        glUseProgram(shaderProgram);
        
        glUniform4f(vertexColorLocation, 0.5f, 0.5f, greenValue, 1.0f);
        
         */
        //1.使用全局的字符串加载着色器程序方式
//        glUseProgram(shaderProgram);
        
        
        //2.使用C++类加载加载着色器程序方式
        myshader.UseShader();
        
        // transform
        /*
        glm::mat4 trans;
        GLfloat timeValue = glfwGetTime();
        GLfloat greenValue = sin(timeValue)/2 + 0.5f;
//
//        trans = glm::scale(trans, glm::vec3(greenValue,greenValue,0.0f));
        trans = glm::rotate(trans, (GLfloat)glfwGetTime() * 2.0f, glm::vec3(0.0,0.0,1.0f));
        trans = glm::translate(trans, glm::vec3(greenValue,greenValue,0.0f));
        GLuint transfromLoc = glGetUniformLocation(myshader.programId, "transform");
        glUniformMatrix4fv(transfromLoc, 1, GL_FALSE, glm::value_ptr(trans));
        
        */
        
        
        glm::mat4 modeMatrix;
        glm::mat4 viewMatrix;
        glm::mat4 perspectiveMatrix;
        

//        viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0,0.0,-3.0));
        GLfloat camX = sinf(glfwGetTime())*10.0f;
        GLfloat camZ = cos(glfwGetTime())*10.0f;
        
        viewMatrix = glm::lookAt(glm::vec3(camX,0.0f,camZ), glm::vec3(0.0f,0.0f,0.0f), glm::vec3(0.0f,1.0f,0.0f));
        perspectiveMatrix = glm::perspective(glm::radians(field_of_view), (GLfloat)(640.0/480.0), 0.1f, 100.0f);
        
        GLuint modelLocal = glGetUniformLocation(myshader.programId, "modeMatrix");
        GLuint viewLocal = glGetUniformLocation(myshader.programId, "viewMatrix");
        GLuint perspectiveLocal = glGetUniformLocation(myshader.programId, "perspectiveMatrix");
        
        
        glUniformMatrix4fv(viewLocal, 1, GL_FALSE, glm::value_ptr(viewMatrix));
        glUniformMatrix4fv(perspectiveLocal, 1, GL_FALSE, glm::value_ptr(perspectiveMatrix));
        
        
        
        glBindVertexArray(VAO[0]);
        glBindTexture(GL_TEXTURE_2D, texture1);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        
        
        glBindVertexArray(VAO[1]);
        glDrawArrays(GL_TRIANGLES, 0, 3);
    

        glBindVertexArray(VAO[2]);
        for (GLuint i= 0; i<10; i++) {
            modeMatrix = glm::translate(modeMatrix, cubePositions[i]*0.3f);
//            modeMatrix = glm::rotate(modeMatrix, (GLfloat)glm::radians(glfwGetTime()*100), glm::vec3(0.5f,0.5,0.5));
            glUniformMatrix4fv(modelLocal, 1, GL_FALSE, glm::value_ptr(modeMatrix));
            glDrawArrays(GL_TRIANGLES, 0, 36);
        }
        
        glBindVertexArray(0);
        glfwSwapBuffers(window);
        
 
        glfwPollEvents();
    }
    glDeleteProgram(shaderProgram);
    glDeleteVertexArrays(3, VAO);
    glDeleteBuffers(3, VBO);
    
    glfwTerminate();
    return 0;
}
Exemple #2
0
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
	GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "3.Exercise1", NULL, NULL);

	/* 第一次把这个忘了,异常中断 */
	glfwMakeContextCurrent(window);
	
	glViewport(0, 0, WIDTH, HEIGHT);

	glewExperimental = GL_TRUE;
	glewInit();

	Shader myshader("./Resources/default.vs", "./Resources/default.frag");

	GLfloat vertices[] = {
		// Positions         // Colors
		0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,  // Bottom Right
		-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,  // Bottom Left
		0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f   // Top 
	};

	GLuint VAO, VBO;
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);

	glBindVertexArray(VAO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	/* positioin attribute */
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
	glEnableVertexAttribArray(0);
	/*color attribute */
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
	glEnableVertexAttribArray(1);

	glBindVertexArray(0);


	while (!glfwWindowShouldClose(window)){
		glfwPollEvents();

		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		myshader.Use();
		glBindVertexArray(VAO);
		glDrawArrays(GL_TRIANGLES, 0, 3);
		glBindVertexArray(0);

		glfwSwapBuffers(window);
	}
	glDeleteVertexArrays(1, &VAO);
	glDeleteBuffers(1, &VBO);
	glfwTerminate();
	return a.exec();
}