一个简单批次容器
1 GBatch
GLTools库中包含一个简单的容器类,叫做GLBatch。这个类可以作为对几种图元简单批次的容器使用,而且它知道在使用GLShaderManager支持的任意存储着色器时如何对图元进行渲染。使用GLBatch类非常简单。首先对批次进行初始化,告诉这个类它代表哪种图元,其中包括的顶点数,以及(可选)一组或两组纹理坐标。
void GLBatch::Begin(GLenum primitive, GLunit nVerts, GLuint nTextureUnits=0);
然后,至少要复制一个由3分量(x,y,z)顶点组成的数组。
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
我们还可以选择复制表面法线、颜色和纹理坐标。
void GLBatch::CopyNormalDataf(GLfloat *vNorms); void GLBatch::CopyColorData4f(GLfloat *vColor); void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords, GLunit uiTextureLayer);
在完成上述工作之后,我们可以调用End来表明已经完成了数据复制工作,并且将设置内部标记,以通知这个类包含哪些属性。
void GLBatch::End(void);
实际上,可以在任何我们想要的时候来进行复制,只要不改变类的大小即可。而一旦调用End函数就不能再增加新的属性了(也就是说我们现在也不能确定是否要有表面法线了)。
2 用法示例
现在我们来快速浏览一下如何使用这个类渲染一个单个三角形。我们在源文件开头部分声明了GLBatch类的一个实例。
GLBatch triangleBatch;
然后在函数中,我们用3个顶点设定了一个三角形。
// Load up a triangle GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f }; triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.End();
最后,在RenderScene函数中,我们选择了适当的存储着色器并调用Draw函数。
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f }; shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); triangleBatch.Draw();