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_BUFFEROpenGL 允许同时绑定多个缓冲,只要缓冲的类型不同,
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.x,vec.y,vec.z,vec.w - 为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的
gl_Position变量,它在幕后是vec4类型

浙公网安备 33010602011771号