顶点数组对象 Vertex Array Object VAO 
顶点缓冲对象 Vertex Buffer Object VBO 
索引缓冲对象 Element Buffer Object EBO & Index Buffer Object IBO
图像渲染管线 Graphics Pipeline 
OpenGL着色器语言 OpenGL Shading Language GLSL 
图元 Primitive
顶点着色器 Vertex Shader
图元装配 Primitive Assembly 
几何着色器 Geometry Shader
光栅化阶段 Rasterization Stage
片段着色器 Fragment Shader
裁切 Clipping
混合阶段 Blending
模板 Stencil
OpenGL学习————三角形
顶点输入
标准化设备坐标 Normalized Device Corrdinates  
应该是所谓的 归一化处理 -1 , 0 ,1.0 范围内的叫标准化设备坐标,在这个范围内的坐标 才会在屏幕上作为显示
 
深度 Depth
通常深度可以理解位Z坐标,它嗲表一个像素在空间中和你的距离,如果距离元就可能被别的像素遮挡,你就看不到它了,它会被丢弃,以节省资源
 
屏幕空间坐标 Screen space Corrdinates
 
视口变换 Viewport Transform
 
 

顶点着色器

向量 Vector
 

编译着色器

步长 Stride
每次获取数据的间隔的字节长度
 
偏移量 Offset
 
//如果窗口大小改变 回调函数
void framebuffer_size_callback(GLFWwindow* window,int width, int height);
void processInput(GLFWwindow* window);
//顶点shader代码
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
"      gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
"}\n";
const char *fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"      FragColor = vec4(1.0f,0.5f,0.2f,10f);\n"
"}";
int main()
{
       glfwInit();//初始化 glfw
       glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//确定使用的版本号 major minor
       glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
       glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//确定使用的核心模式 core-profile
       //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT);  MAC平台使用的版本号
       GLFWwindow* window = glfwCreateWindow(800,600,"learnOpenGL",NULL,NULL);//生成一个窗口对象
       if (window == NULL)
       {
              std::cout << "Failed to create GLFW windows" << std::endl;
              glfwTerminate();
              return -1;
       }
       glfwMakeContextCurrent(window);//设置当前主窗口对象
       if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//初始化 GLAD
       {
              std::cout << "Failed to initialize GLAD" << std::endl;
              return -1;
       }
       //glViewport(1,1,10,10);//告诉opengl  窗口的位置和大小 前俩参数是左下角 位置 后俩就是窗口宽高
       glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//注册窗口大小改变回调事件
       float vertices[] = {
              -1.0f,-0.5f,0.0f,
              0.0f,-0.5f,0.0f,
              -0.5f,0.5f,0.0f,
              0.0f,-0.5f,0.0f,
              1.0f,-0.5f,0.0f,
              0.5f,0.5f,0.0f,
       };
       unsigned int VBO,VAO;
       glGenVertexArrays(1,&VAO);
       glGenBuffers(1,&VBO);//申请一个顶点缓冲区
       glBindVertexArray(VAO);
       glBindBuffer(GL_ARRAY_BUFFER,VBO);//把顶点缓冲区绑定到 array_buffer 缓冲区上
       glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//把顶点数据复制到内存上
       unsigned int vertextShader;
       vertextShader = glCreateShader(GL_VERTEX_SHADER);//创建一个着色器 获取ID
       glShaderSource(vertextShader,1,&vertexShaderSource,NULL);//吧着色器代码传递进去
       glCompileShader(vertextShader);//编译文件
       //检查shader代码是否有报错
       int success;
       char infoLog[512];
       glGetShaderiv(vertextShader,GL_COMPILE_STATUS,&success);
       if (!success)
       {
              glGetShaderInfoLog(vertextShader,512,NULL,infoLog);
              std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
       }
       //片段shader代码
       unsigned int fragmentShader;
       fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
       glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
       glCompileShader(fragmentShader);
       //检查shader代码是否有报错
       glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
       if (!success)
       {
              glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
              std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
       }
       unsigned int shaderProgram;//创建一个 shader程序 链接上面的shader程序
       shaderProgram = glCreateProgram();
       glAttachShader(shaderProgram,vertextShader);
       glAttachShader(shaderProgram,fragmentShader);
       glLinkProgram(shaderProgram);
       glGetProgramiv(shaderProgram,GL_LINK_STATUS,&success);
       if (!success)
       {
              glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
              std::cout << "ERROR::SHADER::Program::COMPILATION_FAILED\n" << infoLog << std::endl;
       }
       //编译后shader代码后 就可以清理掉数据了
       glDeleteShader(vertextShader);
       glDeleteShader(fragmentShader);
       //告诉opengl 该如何解析顶点数据
       glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0);
       glEnableVertexAttribArray(0);
       //做一个渲染循环,保证程序不直接退出 Renderer Loop
       while (!glfwWindowShouldClose(window))//每次循环检查下 GLFW是否需求要推出 返回True就会跳出循环 程序结束
       {
              processInput(window);//每次循环检查下输入
       
                     //启动程序
              glUseProgram(shaderProgram);
              glBindVertexArray(VAO);
              glDrawArrays(GL_TRIANGLES, 0, 6);//使用顶点数组渲染 第一个是渲染图形,第二 三个参数是 数组索引 开始和结束值
              glfwSwapBuffers(window);//GLFW的渲染函数 储存窗口的每个像素 输出到屏幕上
              glfwPollEvents();//检查函数有没有触发什么事件 键盘输入 鼠标点击等
       }
       glfwTerminate();//如果退出程序 清理下glfw的资源
       return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
       glViewport(0,0, width, height);//感觉没有生效
}
void processInput(GLFWwindow *window)
{
       if (glfwGetKey(window,GLFW_KEY_ESCAPE)==GLFW_PRESS)//是否按下 ESC建
       {
              glfwSetWindowShouldClose(window,true);//执行关闭窗口
       }
       if (glfwGetKey(window,GLFW_KEY_1)==GLFW_PRESS)
       {
              glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
              glClear(GL_COLOR_BUFFER_BIT);
       }
       if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS)
       {
              glClearColor(0.4f, 0.6f, 0.1f, 1.0f);
              glClear(GL_COLOR_BUFFER_BIT);
       }
 
 

相关文章: