OpenGL | 显示一个三角形
- 一般显示的3d图形都有一系列的三角形构成。
- 在OpenGL中显示物体的步骤:
- Étape d’initialisation, formée par [只要做1次,(1)(2)没有顺序关系]
- Mise en place des shaders (1)
- Envoie des données sur la carte graphique (2) [将数据传给显卡]
- Demande d’affichage des données (3) [显示]
- Étape d’initialisation, formée par [只要做1次,(1)(2)没有顺序关系]
Shader
- 可以实现根据光线改变材料的外观。
- 在OpenGL中用 GLSL (OpenGL Shading Language)实现
- 编译很快,在每次可执行文件开启时实现(compilation jit: Just In Time)
- 一般由 Vertex Shader 和 Fragment Shader 实现。
Vertex Shader
用于对每个顶点进行投影的计算。
Vertex Shader输出的结果在一个立方体[-1,1]内,clip coordinates,只有在这个Cube中的顶点才能被显示出来。
Fragment Shader
对应一个élément de primitive rasterisé (\simeq≃ un pixel appartenant à un morceau visible d’un triangle)
输入:des données de sommets interpolées linéairement sur la primitive
输出:une couleur
rasterization (栅格化) 由显卡自动实现,在Vertex Shader 和Fragment Shader 之后。
一个最小的Shader程序
这里用的是GLSL语言写的一个txt
- Vertex Shader
#version 330 core
// 指定 GLSL 3.30
layout (location = 0) in vec4 position; // 一个顶点的第一个(location = 0)参数名字(变量名) 为 position
void main()
{
gl_Position = position;
}
- Fragment Shader
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0, 0.0, 0.0, 1.0); // (r,g,b,a) a 是alpha
}
具体使用:
// ************************************************* //
// 1 - Setup Shaders //
// ************************************************* //
std::cout<<"*** Setup Shader ***"<<std::endl;
// ******************************** //
// 1.1 Define vertex and fragment shader
// ******************************** //
// Here GLSL code is hard-coded inline as strings
const char* vertex_shader_txt = " \n \
#version 330 core \n \
layout (location = 0) in vec4 position; \n \
void main() \n \
{ \n \
gl_Position = position; \n \
}";
const char* fragment_shader_txt = " \n \
#version 330 core