OpenGL 顶点着色器

OpenGL 顶点着色器

OpenGL是一个 3D 图形库,在 OpenGL 中指定的所有坐标也都是 3D 坐标,并且只处理在 -1.0 ~ 1.0 这个范围内的数据

标准化设备坐标:

  • x, y, z 的值在 -1.0 ~ 1.0 之间的一小段空间

  • y 轴正方向向上,(0,0)为这个图像的中心

  • 标准化设备坐标通过 glViewport 函数提供的数据,进行视口变换,最终变换为屏幕空间坐标

顶点着色器工作

  • 在GPU上创建内存,用于存储顶点数据

    通过 顶点缓冲对象 (Vertex Buffer Objects,VBO)管理此内存

    顶点缓冲对象是一个OpenGL对象,有一个独一无二的ID

    unsigned int VBO;
    glGenBuffers(1, &VBO);  // 生成一个 VBO对象
    

    OpenGL 有多种缓冲对象类型,顶点缓冲对象的缓冲类型是 GL_ARRAY_BUFFER

    OpenGL 允许同时绑定多个缓冲,只要缓冲的类型不同,

    glBindBuffer(GL_ARRAY_BUFFER, VBO);  
    // 将新创建的缓冲绑定到 GL_ARRAY_BUFFER目标上
    // 之后,使用的任何缓冲调用,都会用来配置当前绑定的缓冲
    

    将之前定义的顶点数据复制到缓冲的内存中

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    // 第一个参数:目标缓冲器的类型
    // 第二个参数:目标缓冲器大小(以字节为单位)
    // 第三个参数:发送的实际数据
    // 第四个参数:我么希望显卡如何管理给定的数据 
    // 期中 vertices 定义如下
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    };
    
    
  • 显卡如何管理给定的数据,形式如下:

    • GL_STATIC_DRAW:数据不会或几乎不会改变

    • GL_DYNAMIC_DRAW:数据会被改变很多

    • GL_STREAM_DRAW:数据每次绘制时都会改变

  • 配置 OpenGL 如何解释这些内存,并且指定如何发送给显卡

GLSL (OpenGL Shading Language)

  • 一个基础的顶点着色器
#version 330 core // 表明使用的是核心模式
layout(location = 0) in vec3 aPos;

void main(){
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
  • 每个着色器都起始于一个版本声明,同时GLSL和OpenGL版本是相匹配的
  • in关键字,在顶点着色器中声明所有的输入顶点属性
  • layout (location = 0) 设定输入变量的位置值
  • GLSL 中一个向量最多 4 个分量,分别是 vec.xvec.yvec.zvec.w
  • 为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的gl_Position变量,它在幕后是vec4类型
posted @ 2021-11-26 21:06  blahhhh  阅读(124)  评论(0)    收藏  举报