啄木鸟图形库的顶点封装类测试代码,分别使用VBO和非VBO的形式实现ArrayOfStructs以及StructsOfArrays这两种顶点数据结构。CVertexIndexDrawArrayGLES2类将提供顶点的相关操作。通过配置VEXIDXDRAWITEM的值配置顶点缓冲,这个以后可以通过模型文件进行集中初始化。
效果图:
shader的代码,使用GLSL ES 1.0搞的 (OPENGLES 2.0的程序不看shader还真的不知道具体怎么画的)
static const Char strVertexShader[] =
"attribute vec4 aPosition;\n"
"attribute vec4 aColor;\n"
"uniform mat4 uFixedViewMatrix;\n"
"varying vec4 vColor;\n"
"void main() {\n"
"gl_Position = uFixedViewMatrix * aPosition;\n"
"vColor = aColor;"
"}\n";
static const Char strFragmentShader[] =
"precision mediump float;\n"
"varying vec4 vColor;\n"
"void main() {\n"
"gl_FragColor = vColor;\n"
"}\n";
测试程序主窗体代码
class CTestForm : public CPeckerActivityForm
{
private:
IPeckerCGDriver* m_pCGDriver;
CGPUProgramGLES2 m_ShaderProgram;
CVertexIndexDrawArrayGLES2 m_ArrayOfStructsWithOutVBODrawItems;
CVertexIndexDrawArrayGLES2 m_StructsOfArraysWithOutVBODrawItems;
CVertexIndexDrawArrayGLES2 m_ArrayOfStructsWithVBODrawItems;
CVertexIndexDrawArrayGLES2 m_StructsOfArraysWithVBODrawItems;
CMatrix4 m_MatView;
CMatrix4 m_MatWorld;
CMatrix4 m_MatProj;
CMatrix4 m_MatScale;
CMatrix4 m_MatOgMvp;
UInt m_MvpMatHandle;
typedef struct stVecCoord
{
Vector4f pos;
Vector3f color;
} VECCOR;
public:
CTestForm()
{
m_pCGDriver = CPeckerCGDrivers::GetCGDriver();
}
virtual ~CTestForm()
{
;
}
virtual HResult InitDisplay(int w, int h)
{
if (null == m_pCGDriver)
{
return P_ERR;
}
static const VECCOR vecClr[] =
{
{
{ -0.5f, 0.0f, 0.0f, 1.0f },
{ 0.0f, 0.0f, 0.0f } },
{
{ -0.5f, 1.0f, 0.0f, 1.0f },
{ 0.0f, 1.0f, 0.0f } },
{
{ 0.5f, 0.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 0.0f } },
{
{ 0.5f, 1.0f, 0.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f } } };
static const GLfloat fPos[] =
{ -0.5f, 0.0f, 0.0f, 1.0f, -0.5f, 1.0f, 0.0f, 1.0f, 0.5f, 0.0f, 0.0f,
1.0f, 0.5f, 1.0f, 0.0f, 1.0f };
static const GLfloat fColor[] =
{ 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f };
m_ArrayOfStructsWithOutVBODrawItems.ClearDrawItem();
VEXIDXDRAWITEM drawItem;
// only vertex;
//ArrayOfStructs
drawItem.m_BuffID = 0;
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = vecClr;
drawItem.m_DrawBufLen = sizeof(vecClr);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 4;
drawItem.m_nShaderAttrID = 0;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(VECCOR);
m_ArrayOfStructsWithOutVBODrawItems.AddDrawItem(drawItem);
drawItem.m_BuffID = 0;
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = vecClr;
drawItem.m_DrawBufLen = sizeof(vecClr);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 3;
drawItem.m_nShaderAttrID = 1;
drawItem.m_nOffset = sizeof(Vector4f);
drawItem.m_Stride = sizeof(VECCOR);
m_ArrayOfStructsWithOutVBODrawItems.AddDrawItem(drawItem);
m_ArrayOfStructsWithOutVBODrawItems.InitDrawArray(
NORMAL_VERTEX_DRAWITEM_MODE);
//StructsOfArrays
m_StructsOfArraysWithOutVBODrawItems.ClearDrawItem();
drawItem.m_BuffID = 0;
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = fPos;
drawItem.m_DrawBufLen = sizeof(fPos);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 4;
drawItem.m_nShaderAttrID = 0;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(Vector4f);
m_StructsOfArraysWithOutVBODrawItems.AddDrawItem(drawItem);
drawItem.m_BuffID = 0;
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = fColor;
drawItem.m_DrawBufLen = sizeof(fColor);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 3;
drawItem.m_nShaderAttrID = 1;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(Vector3f);
m_StructsOfArraysWithOutVBODrawItems.AddDrawItem(drawItem);
m_StructsOfArraysWithOutVBODrawItems.InitDrawArray(
NORMAL_VERTEX_DRAWITEM_MODE);
//VBO ArrayOfStructs
m_ArrayOfStructsWithVBODrawItems.ClearDrawItem();
glGenBuffers(1, &(drawItem.m_BuffID));
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = vecClr;
drawItem.m_DrawBufLen = sizeof(vecClr);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 4;
drawItem.m_nShaderAttrID = 0;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(VECCOR);
m_ArrayOfStructsWithVBODrawItems.AddDrawItem(drawItem);
glGenBuffers(1, &(drawItem.m_BuffID));
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = vecClr;
drawItem.m_DrawBufLen = sizeof(vecClr);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 3;
drawItem.m_nShaderAttrID = 1;
drawItem.m_nOffset = sizeof(Vector4f);
drawItem.m_Stride = sizeof(VECCOR);
m_ArrayOfStructsWithVBODrawItems.AddDrawItem(drawItem);
m_ArrayOfStructsWithVBODrawItems.InitDrawArray(
VERTEX_VBO_DRAWITEM_MODE);
//VBO StructsOfArrays
m_StructsOfArraysWithVBODrawItems.ClearDrawItem();
glGenBuffers(1, &(drawItem.m_BuffID));
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = fPos;
drawItem.m_DrawBufLen = sizeof(fPos);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 4;
drawItem.m_nShaderAttrID = 0;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(Vector4f);
m_StructsOfArraysWithVBODrawItems.AddDrawItem(drawItem);
glGenBuffers(1, &(drawItem.m_BuffID));
drawItem.m_BuffTargetType = PG_ARRAY_BUFFER;
drawItem.m_BuffUseType = PG_STATIC_DRAW;
drawItem.m_DrawData = fColor;
drawItem.m_DrawBufLen = sizeof(fColor);
drawItem.m_FVFFormat = 0;
drawItem.m_bNormalized = false;
drawItem.m_nDataFormat = PG_FLOAT;
drawItem.m_nAttrDataCount = 3;
drawItem.m_nShaderAttrID = 1;
drawItem.m_nOffset = 0;
drawItem.m_Stride = sizeof(Vector3f);
m_StructsOfArraysWithVBODrawItems.AddDrawItem(drawItem);
m_StructsOfArraysWithVBODrawItems.InitDrawArray(
VERTEX_VBO_DRAWITEM_MODE);
m_ShaderProgram.CreateShaderSysDefaultProgram(MVP_POS_COLOR_TYPE); //(POS_TYPE);
ConstStringChars strUniformIName =
{ "uFixedViewMatrix", strlen("uFixedViewMatrix") };
m_MvpMatHandle = m_ShaderProgram.GetUniformID(strUniformIName);
m_MatView = CMatrix4::LookAtRH(CVector3(0.0f, 0.0f, 5.0f),
CVector3(0.0f, 0.0f, 0.0f), CVector3(0.0f, 1.0f, 0.0f));
m_MatProj = CMatrix4::PerspectiveFov(PECKER_PI / 4.0f,
(float) h / (float) w, 0.01f, 1.0f, true);
m_MatWorld = CMatrix4::IdentityMatrix4(); //CMatrix4::RotationZ(-PECKER_PI);
m_MatScale = CMatrix4::Scale(0.5f, 0.5f, 1.0f);
m_MatOgMvp = m_MatProj * m_MatView * m_MatScale * m_MatWorld;
m_pCGDriver->SetContextViewport(0, 0, w, h);
return 0;
}
virtual HResult RenderFrame(struct stOsContextEngine* pContextEngine)
{
if (null == m_pCGDriver)
{
return P_ERR;
}
UInt iShaderAttr = glGetAttribLocation(m_ShaderProgram.GetProgramID(),
"aPosition");
m_pCGDriver->ClearColor(0.5f, 0.0f, 1.0f, 1.0f);
m_pCGDriver->Clear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
HResult hSelectProRes = m_pCGDriver->SelectGPUProgram(&m_ShaderProgram);
if (P_OK == hSelectProRes && P_OK == m_pCGDriver->Begin())
{
static char logInfo[256];
static Float fAngle = 0.0f;
CMatrix4 mvp = m_MatOgMvp * CMatrix4::Translation(1.5f, -1.5f, 0.0f);
//* CMatrix4::RotationZ(fAngle);
fAngle += 0.1f;
if (fAngle > 6.29)
fAngle = 0.0f;
// ArrayOfStructs Without VBO
m_ShaderProgram.SetUniformMatrixArray(m_MvpMatHandle, 1,
(Matrix4*) mvp.GetData());
m_ArrayOfStructsWithOutVBODrawItems.PreArrayDraw();
m_ArrayOfStructsWithOutVBODrawItems.DrawVertexArray(
PG_TRIANGLE_STRIP, 0, 4);
m_ArrayOfStructsWithOutVBODrawItems.FinArrayDraw();
// StructsOfArrays Without VBO
mvp = m_MatOgMvp * CMatrix4::Translation(1.5f, 1.5f, 0.0f);
//* CMatrix4::RotationZ(-fAngle);
m_ShaderProgram.SetUniformMatrixArray(m_MvpMatHandle, 1,
(Matrix4*) mvp.GetData());
m_StructsOfArraysWithOutVBODrawItems.PreArrayDraw();
m_StructsOfArraysWithOutVBODrawItems.DrawVertexArray(
PG_TRIANGLE_STRIP, 0, 4);
m_StructsOfArraysWithOutVBODrawItems.FinArrayDraw();
// ArrayOfStructs With VBO
mvp = m_MatOgMvp * CMatrix4::Translation(-1.5f, 1.5f, 0.0f);
// * CMatrix4::RotationZ(fAngle);
m_ShaderProgram.SetUniformMatrixArray(m_MvpMatHandle, 1,
(Matrix4*) mvp.GetData());
m_ArrayOfStructsWithVBODrawItems.PreArrayDraw();
m_ArrayOfStructsWithVBODrawItems.DrawVertexArray(
PG_TRIANGLE_STRIP, 0, 4);
m_ArrayOfStructsWithVBODrawItems.FinArrayDraw();
// StructsOfArrays With VBO
mvp = m_MatOgMvp * CMatrix4::Translation(-1.5f, -1.5f, 0.0f);
//* CMatrix4::RotationZ(-fAngle);
m_ShaderProgram.SetUniformMatrixArray(m_MvpMatHandle, 1,
(Matrix4*) mvp.GetData());
m_StructsOfArraysWithVBODrawItems.PreArrayDraw();
m_StructsOfArraysWithVBODrawItems.DrawVertexArray(
PG_TRIANGLE_STRIP, 0, 4);
m_StructsOfArraysWithVBODrawItems.FinArrayDraw();
m_pCGDriver->End();
}
else
{
static char logInfo[256];
sprintf(logInfo, "SelectGPUProgram RES = %X", hSelectProRes);
CPeckerLogger::GetSignleton()->LogOut(LOGINFO_ERROR, "RenderFrame",
logInfo);
}
return 0;
}
//virtual HResult TermDisplay(struct stOsContextEngine* pContextEngine) = 0;
virtual HResult SaveState(struct stOsContextEngine* pContextEngine)
{
return 0;
}
virtual HResult LoadState(struct stOsContextEngine* pContextEngine)
{
return 0;
}
virtual SInt OnInputEvent(Handle hEventHandle)
{
return 0;
}
virtual void OnWndCmdProc(struct stOsContextEngine* pContextEngine,
Long nCmdCode, Long wPrams)
{
}
};