返回首页

{S0}简介
这是一个简单的框架为原型的OpenGL和游戏应用。起床和运行所有已经内置了最常用的工具,它提供了一个快速的方法
在该框架包括以下特点:COLLADA装载机OpenGL渲染FreeType字体渲染TGA纹理载入中帧速率计数Full-screen/Windowed支持
zip文件,里面包括以下编译的第三方库。COLLADA DOMGLEWFREETYPE使用代码
为了使用该框架,只需解压GLDemoApp_demo.zip。与Visual Studio 2005中打开该项目。与Visual Studio 2008时,有一些已知问题,您将需要重建的COLLADA DOM库与Visual Studio 2008。
使用该框架之前,请花点时间观察的目录结构。在顶层,应该有三个目录:"; 3rdPartyquot"; - 包含所有框架中使用的第三方库和头文件"; binquot" - 这是建设的解决方案后,所有的可执行文件,这个目录里面是这些子目录:释放和资源"; GLDemoAppquot" - 这是所有的源文件和*. sln文件包含
代码的兴趣点主要包含内部demo.cpp。在这个文件中,有三个功能:

void InitDemo()

{

    RenderInit();

    CColladaLoader loader;

    g_pTestColladaMesh = loader.LoadColladaFile(BuildResourcePath("test.dae"));

    g_uiTextureId = RenderLoadTexture(BuildResourcePath("test.tga"));

}



bool RunDemo()

{

    static float32 fRotation = 0.0f;

    

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    glPushMatrix();



    gluLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    

    RenderGroundGrid(-4.0f);

    

    glPushMatrix();

        glRotatef(fRotation, 1.0f, 1.0f, 1.0f);

        RenderMesh(*g_pTestColladaMesh);

    glPopMatrix();



    glPushMatrix();

    glPointSize(10.0f);

    glBegin(GL_POINTS);

    glColor3f(1.0f, 1.0f, 1.0f);

    glVertex3f(0.0f, 0.0f, 0.0f);

    glEnd();

    glPopMatrix();



    glPopMatrix();

    

    RenderText(&g_defaultFont, "F1 : Fullscreen", Vector2f(0.0f, 20.0f));

    RenderText(&g_defaultFont, "F2 : Windowed", Vector2f(0.0f, 40.0f));





    RenderBegin2dMode();

        

    RenderTexture(Vector2f(RenderGetOrthoWidth() * .5f, 50.0f), g_uiTextureId, 0.0f);



    RenderEnd2dMode();



    if(GetAsyncKeyState(VK_F1))

    {

        sRenderResolution sRes;

        sRes.nWidth = RenderGetDesiredWidth();

        sRes.nHeight = RenderGetDesiredHeight();

        sRes.nBitDepth = RenderGetBitDepth();



        RenderSetResolution(sRes, true);

    }else if(GetAsyncKeyState(VK_F2))

    {

        sRenderResolution sRes;

        sRes.nWidth = RenderGetDesiredWidth();

        sRes.nHeight = RenderGetDesiredHeight();

        sRes.nBitDepth = RenderGetBitDepth();



        RenderSetResolution(sRes, false);

    }



    fRotation += .1f;

    if(fRotation > 360.0f)

        fRotation = 0.0f;



    RenderStats();

    RenderSwapBuffers();



    return (GetAsyncKeyState(VK_ESCAPE) & 0xFFFF) ? false : true;

}



void EndDemo()

{

    RenderReleaseTexture(g_uiTextureId);

    RenderReleaseMesh(&g_pTestColladaMesh);

    RenderDestroy();

}

这是很容易看到在这里是怎么回事。 InitDemo()被称为gldemoapp.cpp内从WinMain函数右,前主应用程序进入循环。 InitDemo()函数内,你应该添加任何初始化代码,您需要为您的应用程序。请记住,此功能仅在应用程序的生命周期称为一次。默认情况下,InitDemo()函数里面,有一些代码,加载一个COLLADA文件,纹理文件。你可以简单地删除这段代码最RenderInit(),它所有的OpenGL初始化的东西除外。 BuildResourcePath()函数建立一个从正在运行的应用程序到当前目录的相对路径,一个目录内的文件夹名为quot; resourcesquot;在目录结构看,你会看到BuildResourcePath()始终提供了一个路径,是quot; ACTUALPATH \ \ BIN \ \ \ \ yourfilename.extquot;
接下来是RunDemo()函数。里面有,你应该把大量代码。在应用程序的执行,这个函数被调用多次。重要的是要注意,这个函数返回一个bool。这表明应用程序是否应继续运行,或立即退出。正如你可以看到,有几个画已经在这个函数调用。这些在这里只是为了演示,并可以安全地删除。虽然,你应该保持glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)和RenderSwapBuffers()。
最后,EndDemo()函数被调用时,应用程序终止其执行。这是最清理代码应放在哪里。渲染功能
该框架提供了许多实用工具,应使用OpenGL轻松了许多。这里列出了一些渲染和实用的功能,你可能会发现有用的:{C}
从磁盘加载的TGA纹理和返回的OpenGL纹理对象ID。这个ID可以用来调用glBindTexture。
RenderGroundGrid(float32 fYPos)

此功能在地面上绘制一个网格在给定的Y坐标位置。
RenderText(CFTFont* pFont, const char* strText, Vector2f& vtPosition, float32 fScale, const sRGBColor& rgbColor)

此功能显示文字的使用作为第一个参数提供的字体。默认情况下,在RenderInit()中,有加载的字体,并可以通过使用全局变量g_defaultFont的访问。例如,如果你想显示一些文本,你可以做以下...
RenderText(&g_defaultFont, "Your cool text here", Vector2f(0.0f, 20.0f));
RenderQueryResolutions(std::list<srenderresolution />& lstResolution)

获取当前显示可用的决议清单。
RenderSetResolution(sRenderResolution& rRes, bool bFullScreen)

当前的分辨率设置为OpenGL窗口。此外,它还可以切换到全屏通过quot; truequot;在第二个参数。例如,要设置分辨率和切换到全屏幕,你可以做以下...
sRenderResolution rRes;

rRes.nWidth = 640;

rRes.nHeight = 480;

rRes.nBitDepth = 32;

RenderSetResolution(rRes, true);
RenderBegin2dMode()

使用此功能,将当前的投影矩阵切换是正字。重要的是要注意的是正交决议是独立的决议角度。
RenderEnd2dMode()

使用此当你在正交模式绘图功能。下面的代码片段将在50,50加载的纹理绘制:
RenderBegin2dMode();

RenderTexture(50.0f, 50.0f), g_uiTextureId, 0.0f);

RenderEnd2dMode();
std::string ReadTextFileToBuffer(const std::string& strFileName)

这个函数会从磁盘加载一个文件,并把它的内容,在返回的缓冲区。这是载入着色器非常有用。实用工具类
除了上述功能,有几类,你会发现有用的框架工作时:CFTFont这个类是一个包装FreeType库。它将加载一个给定的FreeType字体和创造适当的渲染显示列表。您可以使用这个类的一个实例作为一个参数为RenderText。
CFTFont coolFont;

coolFont.Init(BuildResourcePath("MyAwesomeFont.TTF"), 18);

RenderText(&coolFont, "Loaded the font!", Vector2f(0.0f, 20.0f));
CColladaLoader这是一个COLLADA DOM库的包装类。这将加载COLLADA网格文件,并存储到一个sMesh实例的常数。一旦该文件已被加载和处理,负载的函数返回的实例,可用于在呼叫无效R​​enderMesh(常量sMeshamp; pMesh)。 loader会只要加载纹理,因为它们是TGA格式。请记住很多COLLADA提供额外的数据将被丢弃,一旦加载。
CColladaLoader loader;

sMesh* pMyMesh = loader.LoadColladaFile(BuildResourcePath("colladaTest.dae"));



RenderMesh(*pMyMesh);



//Once you are done with the mesh call

//

RenderReleaseMesh(&pMyMesh);
其他注意事项
觉得免费提供源文件看。在您的处置有许多辅助功能,应该让你的生活更容易。如果你运行运行编译的可执行文件的任何问题,务必仔细检查你的quot;工作Directoryquot的设置(应quot; .. \ BIN \ debugquot调试版本和quot; .. \ BIN \ releasequot针对Release版本)。此选项可根据quot; Debuggingquot;在解决方案属性"窗口。
如果您有任何疑问或代码注释,请随时联系rebelcoder gmail.com我。历史三月四日,2009年:战后初期三月四日,2009:第所做的更改|克里斯蒂安卡拉索

回答

评论会员:游客 时间:2012/01/24
亲爱的Mr.Carazo,首先,我感谢您的应用程序。它帮助了我很多。我已经建立了DOM应用程序创建的。DLL文件,并成功地构建了应用程序。现在,我对你的方式研究。我看到文件test.dae。你可以用它来测试应用程序。在该文件中,所有的网格数据将被输出为三角形。我看到。不过,现在我不能负荷。3dsMax中创建的DAE文件。我的所有网格数据文件将被输出为多边形。: codepreTagpolygonsmaterial=spanclass="code-string""/spanspanclass="code-string"red"/spancount=spanclass="code-string""/spanspanclass="code-string"288"/span<inputsemantic=spanclass="code-string""/spanspanclass="code-string"VERTEX"/spansource=spanclass="code-string""/spanspanclass="code-string"#ob-mesh-vertices"/spanoffset=spanclass="code-string""/spanspanclass="code-string"0"/span/<inputsemantic=spanclass="code-string""/spanspanclass="code-string"NORMAL"/spansource=spanclass="code-string""/spanspanclass="code-string"#obj-mesh-normals"/spanoffset=spanclass="code-string""/spanspanclass="code-string"1"/span/<inputsemantic=spanclass="code-string""/spanspanclass="code-string"TEXCOORD"/spansource=spanclass="code-string""/spanspanclass="code-string"#obj-mesh-map-channel1"/spanoffset=spanclass="code-string""/spanspanclass="code-string"2"/spanset=spanclass="code-string""/spanspanclass="code-string"1"/span/<inputsemantic=spanclass="code-string""/spanspanclass="code-string"TANGENT"/spansource=spanclass="code-string""/spanspanclass="code-string"#obj-mesh-tangent1"/spanoffset=spanclass="code-string""/spanspanclass="code-string"3"/spanset=spanclass="code-string""/spanspanclass="code-string"1"/span/<inputsemantic=spanclass="code-string""/spanspanclass="code-string"BINORMAL"/spansource=spanclass="code-string""/spanspanclass="code-string"#ob-mesh-binormal1"/spanoffset=spanclass="code-string""/spanspanclass="code-string"4"/spanset=spanclass="code-string""/spanspanclass="code-string"1"/span/TagPspanclass="code-digit"133/spanspanclass="code-digit"133/spanspanclass="code-digit"11/spanspanclass="code-digit"11/spanspanclass="code-digit"0/spanspanclass="code-digit"188/spanspanclass="code-digit"188/spanspanclass="code-digit"10/spanspanclass="code-digit"11/spanspanclass="code-digit"3/spanspanclass="code-digit"183/spanspanclass="code-digit"183/spanspanclass="code-digit"23/spanspanclass="code-digit"9/spanspanclass="code-digit"5/span/TagPTagPspanclass="code-digit"188/spanspanclass="code-digit"188/spanspanclass="code-digit"10/spanspanclass="code-digit"11/spanspanclass="code-digit"3/spanspanclass="code-digit"220/spanspanclass="code-digit"220/spanspanclass="code-digit"9/spanspanclass="code-digit"11/spanspanclass="code-digit"8/spanspanclass="code-digit"211/spanspanclass="code-digit"211/spanspanclass="code-digit"22/spanspanclass="code-digit"9/spanspanclass="code-digit"12/spanspanclass="code-digit"183/spanspanclass="code-digit"183/spanspanclass="code-digit"23/spanspanclass="code-digit"9/spanspanclass="code-digit"5/span/TagPTagPspanclass="code-digit"220/spanspanclass="code-digit"220/spanspanclass="code-digit"9/spanspanclass="code-digit"11/spanspanclass="code-digit"8/spanspanclass="code-digit"240/spanspanclass="code-digit"240/spanspanclass="code-digit"8/spanspanclass="code-digit"11/spanspanclass="code-digit"17/spanspanclass="code-digit"235/spanspanclass="code-digit"235/spanspanclass="code-digit"21/spanspanclass="code-digit"9/spanspanclass="code-digit"21/spanspanclass="code-digit"211/spanspanclass="code-digit"211/spanspanclass="code-digit"22/spanspanclass="code-digit"9/spanspanclass="code-digit"12/span/TagP/Tagpolygons/pre/code,我不得不改变了,你在哪里得到,其中有LoadColladaFile功能这样的三角阵列(ColladaLoader.cpp):codepredomPolygons_ArrayarPolygonsArray=pMesh->getPolygons_array();uint32uiPolygonCount=arPolygonsArray.getCount();uint32*pIdxArray=spanclass="code-digit"0/span; uint32uiIndexCount=spanclass="code-digit"0/span; uint32uiInputCount=spanclass="code-digit"0/span; uint32nPositionOffset=spanclass="code-digit"0/span; uint32nNormalOffset=spanclass="code-digit"0/span; uint32nTexOffset=spanclass="code-digit"0/span; std::stringstrMaterialName; spanclass="code-keyword"for/span(uint32uiCurrentPolygon=spanclass="code-digit"0/span;uiCurrentPolygon<uiPolygonCount;uiCurrentPolygon++) { domPolygons*pPolygonIndex=arPolygonsArray[uiCurrentPolygon]; spanclass="code-comment"///spanspanclass="code-comment"strMaterialName=pPolygonIndex->getMaterial();/span domInputLocalOffset_ArrayarInputOffsets=pPolygonIndex->getInput_array(); uiInputCount=arInputOffsets.getCount(); spanclass="code-keyword"for/span(uint32uiCurrentIO=spanclass="code-digit"0/span;uiCurrentIO<uiInputCount;uiCurrentIO++) { domInputLocalOffset*pCurrentOffset=arInputOffsets[uiCurrentIO]; spanclass="code-keyword"if/span(strcmp(pCurrentOffset->getSemantic(),spanclass="code-string""/spanspanclass="code-string"VERTEX"/span)==spanclass="code-digit"0/span) { nPositionOffset=pCurrentOffset->getOffset(); } spanclass="code-keyword"else/spanspanclass="code-keyword"if/span(strcmp(pCurrentOffset->getSemantic(),spanclass="code-string""/spanspanclass="code-string"NORMAL"/span)==spanclass="code-digit"0/span) { nNormalOffset=pCurrentOffset->getOffset(); } spanclass="code-keyword"else/spanspanclass="code-keyword"if/span(strcmp(pCurrentOffset->getSemantic(),spanclass="code-string""/spanspanclass="code-string"TEXCOORD"/span)==spanclass="code-digit"0/span) { nTexOffset=pCurrentOffset->getOffset(); } }  domP_ArrayarPolyInfo=pPolygonIndex->getP_array(); uint32pCount=arPolyInfo.getCount(); spanclass="code-keyword"for/span(uint32uiCurrentP=spanclass="code-digit"0/span;uiCurrentP<pCount;uiCurrentP++) { domPRefpPolyInfo=arPolyInfo[uiCurrentP]; domListOfUIntsidxArray=pPolyInfo->getValue(); uiIndexCount+=idxArray.getCount(); }  pIdxArray=spanclass="code-keyword"new/spanuint32[uiIndexCount]; memset(pIdxArray,spanclass="code-digit"0/span,spanclass="code-keyword"sizeof/span(uint32)*(uiIndexCount)); uint32uiTemp2=spanclass="code-digit"0/span;  spanclass="code-keyword"for/span(uint32uiTemp=spanclass="code-digit"0/span;uiTemp<pCount;uiTemp++) { domPRefpPolyInfo=arPolyInfo[uiTemp]; domListOfUIntsidxArray=pPolyInfo->getValue(); spanclass="code-keyword"for/span(uint32uiIdxCount=spanclass="code-digit"0/span;uiIdxCount<idxArray.getCount();uiIdxCount++) { pIdxArray[uiIdxCount+uiTemp2]=idxArray[uiIdxCount]; } uiTemp2+=idxArray.getCount(); } }/pre/code因此,我看不出什么。请花几分钟时间来帮助我。非常感谢您{S1}为您问候和良好祝愿。我不知道
生锈
评论会员:游客 时间:2012/01/24
我试图加载一个谷歌SketchUp7DAE文件,但我似乎并不工作。任何提示
?Dreamwolf
评论会员:游客 时间:2012/01/24
我得到一个错误,在该行FreetypeUtils.cpp:codepreftError=FT_New_Face(library,strFontName.c_str(),spanclass="code-digit"0/span,&face);/pre/code尽管beeing权利和字体文件的路径存在。你有任何线索,为什么呢?乌尔夫
克里斯蒂安卡拉索
评论会员:游客 时间:2012/01/24
我会考虑。你能提供任何额外的信息,这可能是有助于解决这一问题,我呢?你尝试加载你所提供的字体?或默认字体
?Dreamwolf
评论会员:游客 时间:2012/01/24
我只是想在调试模式下运行的项目。我下载的调试版本DLL的为您速递热力。我写的评论后,我尝试直接运行exe文件,外VS2005的和没有工作,所以我怀疑是路径不是在调试和发布版本。我从函数调用失败的错误代码是"1"是否有帮助
。吉尔斯Ngainsi
评论会员:游客 时间:2012/01/24
亲爱的先生卡拉索,感谢您的帮助,现在我可以嵌入在项目配置区的文件和库。到现在为止,我的代码通过编译,直到我到达的连接步骤。在这个水平,我有以下方面的错误:1gt;freetype221.lib(cff.obj):错误LNK2001:无法解析的外部符号@__security_check_cookie@41gt;freetype221.lib(type1.obj):错误LNK2001:无法解析的外部符号@__security_check_cookie@41gt;demo.obj:错误LNK2001:无法解析的外部符号@__security_check_cookie@41gt;gldemoapp.obj:错误LNK2001:无法解析的外部符号__imp__CreateWindowExA@48__imp__GetDC1gt;gldemoapp.obj:错误LNK2001:无法解析的外部符号@41gt;ColladaLoader.obj:错误LNK2001:无法解析的外部符号"__declspec(dllimport)的市民:__thiscallSTD:basic_stringlt;CHAR,structgt;,性病类:分配器GT:basic_stringlt;CHAR,structgt;,性病类:分配器GT(无效)"(???__imp_0元basic_string的@杜$char_traits@D@STD@@V$分配器@D@2@@STD@@QAE@XZ)这仍然是一个配置错误?你有一个建议,渡过这?再次感谢至于,吉尔斯
吉尔斯Ngainsi
评论会员:游客 时间:2012/01/24
斐洛\dokumente\CIAS\forschung\gldemoapp\gldemoapp\gldemoapp\stdafx.h中(9):致命错误C1083:无法打开包括文件:"WINDOWS.H":没有这样的文件或目录1gt;GLDemoApp-Fehler1,0Warnung(EN)能否请您提供支持,为我配置我的VisualStudio2005有此项目建设完成正常工作吗?无法找到文件WINDOWS.H,我不知道如何继续在这一点上谢谢答复至于,吉尔斯
克里斯蒂安卡拉索
评论会员:游客 时间:2012/01/24
我看起来虽然你可能有一些不正确的配置。"WINDOWS.H"应该已包含您的VisualStudio2005版本。你应该尝试找到这个文件在您的硬盘驱动器,并尝试将该目录添加到你的include目录(S),无论是作为一个项目设置或应用程序设置。,克里斯蒂安天使卡拉索
camelcoder713
评论会员:真棒-尝试 时间:2012/01/24
wanft
评论会员:游客 时间:2012/01/24
了不起的工作把一项复杂的系统工程,在一个简单的和有组织的界面。我发现你的教程非常有用,感谢您分享专业的编码技术和习惯
。克里斯蒂安卡拉索
评论会员:游客 时间:2012/01/24
演示应用程序启动失败,因为不能找到libcollada14dom21d.dll
wanft
评论会员:游客 时间:2012/01/24
对不起错误。看来,由于原来的zip文件大小的限制不得不修剪。为了在调试模式下运行的应用程序,你将不得不遵循这些步骤。1。从下面的网站。下载DLLimgsrc=http://www.orcode.com/img/ico/smiley_frown.gif2.Inside"bin"文件夹,另一个文件夹中创建一个名为"Debug"。复制"libcollada14dom21d.dll"到这个目录。bin文件夹中3.Inside也有一个文件夹名为"释放",复制"glew32.dll"从那里的"调试"文件夹中。现在运行的应用程序应该没有问题。如果您遇到任何问题随时与我联系。如果需要的话我还可以向您发送电子邮件的libcollada14dom21-d.dll副本。谢谢您的阅读
|只是sonnv:没有你所说的,现在我得到以下讯息:"应用程序未能正确初始化(0xc0150002)"

debug文件夹中的exe glew32.dll libcollada14dom21.dll libcollada14dom21 - d.dll。
我缺少什么?
最好的问候。

MCP - 70-016(VC)
。MCP.NET,MCAD.NET,MCSD.NET MCPD的输入。IBM OOAD的认证。
评论会员:克里斯蒂安卡拉索 时间:2012/01/24
我Code.google调试DLL相同的异常。请帮助。发行版工作得很好。
感谢
评论会员:。trumsaigon 时间:2012/01/24
如果其他人运行到这个问题,并想DLL的调试版本,我用我的项目中,随时给我发电子邮件,我会送你的DLL副本{BR
}
评论会员:degrate007 时间:2012/01/24
请调试DLL的一个副本发送给我,因为我有同样的错误我使用的VS 2008。 COLLADA 1.4

邮箱:nnmanh@gmail.com

非常感谢和问候

我不知道
评论会员:会员8118106 时间:2012/01/24
您好,
请给我一个dll文件的副本。我也得到应用程序初始化失败的错误。

谢谢
评论会员:waterharbin 时间:2012/01/24
对不起,我有同样的问题,可以发送到我的DLL?我使用VS 2010表达

电子邮箱:baal_zabut@hotmail.de