渲染管线
顶点数据 -->顶点着色器 --> 细分控制着色器 --> 细分计算着色器 -->几何着色器 --> 图元设置 --> 剪切 --> 光栅化 --> 片元着色器--> 屏幕显示
注意:细分着色器:(可选)使用patch来描述一个物体的形状,结果是图元数量增加,外观更加平顺
几何着色器:(可选)可创建新的图元(邻接图元类型)
图元装配:将顶点组织成图元
剪切:落在视口之外的不需绘制: glEnable(GL_CLIP_PLANE0); //平面枚举量
gl_ClipDistance[0] = dot(vertex, plane); //计算平面方程
光栅化:将图元转化成片元,即一个“候选的像素”,可以放在帧缓存中
glDisable(GL_RASTERIZER_DISCARD); 开启光栅化
实例:三角形
void init( void )
{
glGenVertexArrays( NumVAOs, VAOs ); //初始化顶点数组对象
glBindVertexArray( VAOs[Triangles] );
GLfloat vertices[NumVertices][2] = {
{ -0.90f, -0.90f }, { 0.85f, -0.90f }, { -0.90f, 0.85f }, // Triangle 1
{ 0.90f, -0.85f }, { 0.90f, 0.90f }, { -0.85f, 0.90f } // Triangle 2
};
glGenBuffers( NumBuffers, Buffers );
glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);
ShaderInfo shaders[] =
{
{ GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
{ GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders( shaders );
glUseProgram( program );
glVertexAttribPointer( vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); //关联到顶点属性数组
glEnableVertexAttribArray( vPosition );
}
void display( void )
{
static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
glClearBufferfv(GL_COLOR, 0, black);
glBindVertexArray( VAOs[Triangles] ); //准备使用这个对象
glDrawArrays( GL_TRIANGLES, 0, NumVertices );
}