OpenGL超级宝典(第7版)笔记8 几何着色器 清单3.9
上一篇我们介绍了曲面细分的各个环节,包括细分曲面控制着色器TCS、细分曲面引擎、细分曲面评估着色器TES。这回我们将学习在光栅化之前最后一个可编程的着色器,结合着色器。并稍微说说基元装配、裁剪、光栅化有关的东西。
首先说说最简单的几何着色器编译:
geometry_shader = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometry_shader, 1, geometry_shader_source2, NULL);
glCompileShader(geometry_shader);
glGetShaderiv(geometry_shader, GL_COMPILE_STATUS, &shader_success);//检查编译是否成功
if (!shader_success)
{
glGetShaderInfoLog(geometry_shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::GEOMETRY_SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
}
和之前的各种着色器没什么不同,就是注意GL_GEOMETRY_SHADER,还有别忘了在连接着色器程序前把这个着色器attach上(glAttachShader();)
几何着色器
几何着色器可以改变基元的模式,例如输入到几何着色器的是很多的小三角形,而输出可以是很多的顶点,还例如输入是很多的顶点,输出可以在每个顶点位置处生成很多的小三角形。几何着色器十分的灵活(它甚至能在细分着色器之后再对三角形进行细分,见后方我们的试验)
几何着色器的运行十分特殊,它对每个输入基元运行一次,在运行时可以访问该基元所有的顶点信息,且在一次运行中可以通过EmitVertex();进行多次的顶点输出(等下你就会见到),例如清单3.9
清单3.9 我们的第一个几何着色器
#version 450 core
layout (triangles) in;
layout (points,max_vertices=3) out;