啄木鸟图形库的顶点封装类测试代码

2023-10-30 21:20

本文主要是介绍啄木鸟图形库的顶点封装类测试代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

啄木鸟图形库的顶点封装类测试代码,分别使用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;//ArrayOfStructsdrawItem.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);//StructsOfArraysm_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 ArrayOfStructsm_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 StructsOfArraysm_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 VBOm_ShaderProgram.SetUniformMatrixArray(m_MvpMatHandle, 1,(Matrix4*) mvp.GetData());m_ArrayOfStructsWithOutVBODrawItems.PreArrayDraw();m_ArrayOfStructsWithOutVBODrawItems.DrawVertexArray(PG_TRIANGLE_STRIP, 0, 4);m_ArrayOfStructsWithOutVBODrawItems.FinArrayDraw();// StructsOfArrays Without VBOmvp = 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 VBOmvp = 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 VBOmvp = 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){}
};

转载于:https://my.oschina.net/u/253717/blog/80705

这篇关于啄木鸟图形库的顶点封装类测试代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310650

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。