opengl渲染器入门05接口块和ubo

122 阅读2分钟

引言

本文主要介绍一下数据块(接口块)和缓冲对象

接口块

接口块类似的一个结构体,它是在顶点着色器和片元着色器中传递数据使用,所以它不接受外部传入的数据:

//顶点着色器
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;      //高光系数
}; 

几何着色器

这个感觉没有什么用,后面写。