引言
本文主要介绍一下数据块(接口块)和缓冲对象
接口块
接口块类似的一个结构体,它是在顶点着色器和片元着色器中传递数据使用,所以它不接受外部传入的数据:
//顶点着色器
out VS_OUT //out表示是输出的 VS_OUT表示从VS顶点着色器输出的结构体
{
vec2 TexCoords;
} vs_out;
void main()
{
vs_out.TexCoords = aTexCoords;
}
//片元着色器
in VS_OUT //in表示接受来的数据
{
vec2 TexCoords;
} fs_in;
void main()
{
FragColor = texture(texture, fs_in.TexCoords);
}
具体也比较的简单,不多于的介绍。
Uniform缓冲对象
Uniform缓冲对象也被称为ubo,是一种共享内存的布局方式,内部对齐的方式超出需要了,这里只需要知道怎么使用就可以了。
unsigned int uniformBlockIndexRed = glGetUniformBlockIndex(shaderRed.ID, "Matrices"); //为该着色器创建index,同时指明名称
glUniformBlockBinding(shaderRed.ID, uniformBlockIndexRed, 0); //指定到通道口
unsigned int uboMatrices;
glGenBuffers(1, &uboMatrices);
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::mat4), NULL, GL_STATIC_DRAW); //给出传入的大小 这里是2个四维的矩阵
glBindBuffer(GL_UNIFORM_BUFFER, 0); //解绑当前的ubo
glBindBufferRange(GL_UNIFORM_BUFFER, 0, uboMatrices, 0, 2 * sizeof(glm::mat4)); //绑定到ubo上
//传入数据
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projection)); //传入projection矩阵
BindBuffer(GL_UNIFORM_BUFFER, 0);
在着色器中为:
//顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (std140) uniform Matrices //这里的名字和创建的名字是一样的
{
mat4 projection;
mat4 view;
};
uniform mat4 model;
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
}
另外这里补充一下输出到外部输入到顶点或者片元着色器的结构体,可能只能在片元着色器中使用,一般用来包含灯光的一些的信息。
//外界的输入
lightingShader.setFloat("material.shininess", 32.0f);
//片元着色器
struct Material {
float shininess; //高光系数
};
几何着色器
这个感觉没有什么用,后面写。