现代的OpenGL调试方式(翻译)

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址: http://www.learnopengl.com/#!In-Practice/Debugging 1 Debugging Graphics programming can be a lot of fun, but it can also be a large source of frustration whenever something isn’t rendering right or perhaps not even rendering at all! Seeing as most of what we do involves manipulating pixels it can be difficult to figure out the cause of error whenever something doesn’t work the way it’s supposed to. Debugging these kind of errors is different than what you’re used to when debugging errors on the CPU.

软渲染示例程序Tiny3D的实现简介

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 绘制图形的代码 Tiny3D核心的图形绘制代码调用栈如下图所示 Device::DrawBox函数 Tiny3D的核心绘制代码的入口函数Device::DrawBox函数 // theta mesh的旋转角度 // box_vertices mesh的原始模型顶点数据 void Device::DrawBox(float theta, const T3DVertex* box_vertices) Device::DrawBox函数的实现如下代码所示: void Device::DrawBox(float theta, const T3DVertex* box_vertices) { T3DMatrix4X4 m; T3DMatrixMakeRotation(&m, -1.0f, -0.5f, 1.0f, theta); transform_.SetWorldMatrix(m); transform_.Update(); DrawPlane(&box_vertices[0], &box_vertices[1], &box_vertices[2], &box_vertices[3]); DrawPlane(&box_vertices[4], &box_vertices[5], &box_vertices[6], &box_vertices[7]); DrawPlane(&box_vertices[0], &box_vertices[4], &box_vertices[5], &box_vertices[1]); DrawPlane(&box_vertices[1], &box_vertices[5], &box_vertices[6], &box_vertices[2]); DrawPlane(&box_vertices[2], &box_vertices[6], &box_vertices[7], &box_vertices[3]); DrawPlane(&box_vertices[3], &box_vertices[7], &box_vertices[4], &box_vertices[0]); } 步骤就是如下的几步: 根据传递进来的mesh的旋转角度theta,调用T3DMatrixMakeRotation函数构建world matrix,然后更新到Transform类中去 调用Transform::Update函数,更新world-view-projection matrix,这WVP matrix将在后面的用来变换顶点。 把一个六面体BOX拆分成6个矩形面,调用DrawPlane函数进行绘制。 Device::DrawPlane函数 Device::DrawPlane函数的实现如下代码所示: void Device::DrawPlane(const T3DVertex* p1, const T3DVertex* p2, const T3DVertex* p3, const T3DVertex* p4) { T3DVertex _p1 = *p1, _p2 = *p2, _p3 = *p3, _p4 = *p4; _p1.

KumaGL

KumaGL在Github中的地址 KumaGL的可执行程序包在这里下载 项目名 描述 截图 001_EmptyWindow 一个空的Kuma GL程序框架。展示了整合ImGui库作为KumaGL框架的GUI接口 002_Triangle 使用KumaGL着色器绘制三角形 003_Texture 使用KumaGL载入纹理并显示 004_Transform 图元之间的层次变换关系 005_DynamicVertexBuffer 动态定点缓冲区的使用 006_DynamicTexture 动态纹理的的使用、写入和更新的方法 007_Camera 摄像机的使用 008_Font 使用Freetype绘制文字 009_Assimp 使用Assimp库作为KumaGL的模型数据加载库,加载并显示一个静态模型 010_Lighting 用着色器编写Phong光照效果 012_FrameBuffer 使用帧缓冲区对象的效果 015_Blur 用着色器编写运动模糊效果 016_NormalMapping 用使用法线贴图实现凹凸效果 017_ParallaxMapping 用使用视差贴图的效果 020_DeferredRendering 延迟着色效果 022_HDR 高动态范围光照效果 024_VertexDisplacement 演示在顶点着色器中改变顶点位置形成动画效果 040_ImageEffect 使用了若干二维图像后期处理的效果 050_ParticleSystem 使用几何着色器生成高效粒子系统的效果 080_WaterEffect 带有反射和水波的水面效果 090_PbrLighting PBR光照效果 099_OldMovieEffect 老电影屏幕的花屏效果 100_PixelMagic 使用像素着色器直接作画的效果

我的小作品

免责声明 本站所提供的所有Windows,Android,iOS及其他的平台上的可执行程序及代码。本站不保证这些软件和代码的安全性和有效性,请慎重下载使用。这些程序和代码可以免费使用,但因此造成的所有损失本站概不承担任何责任 项目名 描述 截图 Tiny3D 用C++和SDL2库编写的一个软3D渲染器。可执行程序在这里下载,源代码在这里下载,还有一份可以辅助阅读理解代码的文档在这里下载 MD2 Model Demo 用C++和DirectX8编写的读取Quake MD2格式模型的demo。可执行程序在这里下载,源代码在这里下载,还有一份设计文档在这里下载。这个程序是在2005年用一台8M显存,CPU是赛扬450的笔记本编写的,如果现在跑起来,帧速率比当时的30FPS,估计会快上百倍 PacMan 还是在2005年,研究dxframework时,从里面抽取了pacman的demo,用C++和DirectX8独立编写的一个pacman小游戏,是一个半成品。可执行程序在这里下载,源代码在这里下载。 碰撞检测demo 还是在2005年,学习碰撞检测时,使用C++和DirectX9编写的demo,里面实现了OBB,AABB和正球体三种包围盒的相交检测判定。可执行程序在这里下载,源代码在这里下载。 图片分割工具ImageAssist 使用MFC和CxImage图像处理库编写的自动分割整张图片为若干张指定尺寸的图片。可执行程序在这里下载,源代码工程在这里下载。 图片处理工具ImageWizard 使用Python Pillow图像处理库编写的一个图像处理小工具。可执行程序在这里下载,源代码工程在这里。 坦克大战Python重制版 使用Pygame重制的坦克大战(Battle City)。可执行程序在这里下载,源代码将在合适的时候在github上公布。

给VC添加新的源代码文件扩展名以便能被编译【翻译】

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 读了microsoft的mvp网站上的一篇关于添加VC源文件扩展名的文章,顺便就把它摘要翻译下来,以备参考 Q: 如何使得Visual Studio能够把.cc后缀名的文件当作C++源文件来(编译)处理。 A: 可以使用/Tp编译选项指示编译器把.cc文件当作C++源文件来进行处理。可以把/Tp命令添加在工程的"custom build"选项中。或者可以通过修改注册表,把.cc后缀名添加到“可当成是C++源文件来处理的文件”的后缀名列表中。要修改的键如下: HKEY_CURRENT_USER/Software/Microsoft/DevStudio/X.0/Build System/Components/Platforms/Win32 (x86)/Tools/32-bit/C/C++/Input_Spec HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Build System/Components/Tools/<Component 0x3>/Input_Spec HKEY_CURRENT_USER/Software/Microsoft/DevStudio/X.0/Text Editor/Tabs/Language Settings/C/C++/FileExtensions 上面的X是Devstudio的版本号(5或者是6)。同时可以通过修改下面的键来使得有新后缀名的文件也能使用语法高亮显示功能。修改注册表要比通过设置/Tp命令来得方便,当然也可以使用后者。最后,不能通过修改注册表来在同一工程中混合使用C源文件和C++源文件。唯一的可行方法就是使用custom build规则。

关于本网站

学习计算机图形学相关理论 学习Unity3D,Unreal以及各种游戏引擎 学习DirectX、OpenGL、Vulkan 和志同道合的朋友一起交流成长

简历

基本信息 E-MAIL sun_of_lover@sina.com QQ 3448176595 github个人主页 https://github.com/kumakoko 个人技术网站 http://www.xionggf.com 个人喜好及擅长的领域 游戏客户端的各种开发技术,尤好图形渲染技术,著有技术专著《Unity3D 内建着色器源码剖析》 专业技能 开发语言、框架及引擎 熟练程度 公司项目 个人业余学习项目 C++语言 熟悉 《一夫当关 iOS 版》《昆仑悟》《妖精同萌》《勇士 OL》《蜀山 online》《灵魂之石》《桃花源》《QQ 宠物 2》《AR 激斗》的辅助工具 HWBinder,《昆仑悟》帧动画编辑器 《KumaGL》 《PacMan》《MD2 Model Demo》《Tiny3D》 C#语言 熟悉 《万美京数颜机》《万美京数颜机》多语言文本工具《帝国争霸》《全民漂移》《混沌之刃》《超次元神域》《天殇》《东京喰种》《轨迹》《黎明之前》《S_Project》《vmeta3》《AR 激斗》《勇士 OL》多语言文本工具 TextDBGenerator Lua 语言 熟悉 《勇士 OL》界面系统《帝国争霸》《洞庭麻将》UI 系统《天殇》《黎明之前》《S_Project》《vmeta3》 Java 语言 了解 《全民漂移》和《混沌之刃》的 SDK 接入 Objective-C 语言 了解 《一夫当关 iOS 版》 Python 语言 了解 Android 打包小工具,各种辅助开发用的工具小脚本 小游戏《BattleCity Remake》、图像处理工具《ImageWizard》 MFC 框架 熟悉 《勇士 OL》的 EquipmentEditor 和 Saturn,SceneViewer 切图工具 ImageAssist cocos2D/cocos2D-x 引擎 熟悉 《一夫当关 iOS 版》《昆仑悟》《妖精同盟》 Gamebryo2.

网络上的奇珍异宝

免责声明 本站所提供的所有Windows,Android,iOS及其他的平台上的可执行程序,除特别声明者,都是本站从网络上搜集下载整理,在保证遵循程序开发者制定的第三方对程序的再发布的规则下,本站本着方便自己和他人的原则提供了下载。本站不保证这些软件的安全性和有效性,请慎重下载使用。本站所提及到的所有软件,如若能从该软件的官网下载的话,本站强烈建议用户直接从官网下载! 各种开源库 项目名 简介 glew 在Windows上搞OpenGL开发总是要面临着Microsoft的不更新的刁难。GLEW提供了一整套OpenGL的扩展实现,并且是跨平台的 glus OpenGL的一个扩展工具库 nVidia Cg Toolkit 由nVidia提供的Cg开发包。做shader编程都用它 UNet Unity3D的内置网络库 layabox H5游戏开源引擎 TypeScript中文网 TypeScript语言的中文学习网站 Spine-Unity Unity3D环境下的Spine动画插件官网 实用开发工具 项目名 简介 PicoPixel 做图形编程的时候,想像使用C语言的printf函数那样子输出纹理的内容吗?用它! PngQuant 能大幅度地压缩PNG图片文件体积而几乎不损失原始图像质量的工具,这个工具是基于命令行的。有人给他做了一个界面工具PngGoo OpenGL Extension Viewer 用来查看Android手机对OpenGLES扩展功能的支持度的小软件 Tile2D 由国人开发的一个通用的2D地图编辑器。金点时空开发的《圣剑英雄传——英雄救美》就是使用这个编辑器编辑的场景地图。这是一个DOS程序,所以在Windows 7及以上版本的操作系统需要使用DOSBOX去执行 DosBox 想在其他平台上跑dos程序,用它就是最合适的。本站提供一个本地下载 GLSL语法高亮提示 用在Notepad++上的,可以高亮显示GLSL语法文件的配置文件 ShaderLab语法高亮提示 用在Notepad++上的,可以高亮显示Unity3D Shaderlab语法文件的配置文件 ILSpy 用来反编译C#代码的利器,本站提供了一个本地下载 Math Animation 用动画展示数学原理和公式的网页,由本站整理 RenderDoc 一个Shader调试工具,支持OpenGL,Direct3D11,支持Win7及之后的平台,支持Linux UnityAssetsStudio 一个可以Unity3D打成APK包后,查看和导出里面的资源的工具 UnityAssetsExplorer 一个可以Unity3D打成APK包后,查看和导出里面的资源的工具 URP Unity性能测试分析解决方案UPR。URP有以下三个特点:1.无SDK:UPR通过无侵入式测试模式,不影响开发者原有的制作流程,避免额外的时间成本。2.不需要Root:目前Android 手机的Root难度越来越高,不要求Root才能最大程度的提供便利性。3.不需要提交APK:由于Unity游戏APK比较容易被破解,提交APK给第三方对于开发者而言往往需要非常慎重。尤其是对于开发中的重点项目,基本上不可能把APK提交到第三方进行测试。 World Machine 一款用来制作地形的工具,如果不用于商业用途的话,这个软件是可以免费使用的,本站提供一个下载,下载包的MD5值是805121a7036782047b04a75168dffbea,但如果此官网依然能访问,最好直接从官网下载。 MaCrea 可以用用来生成材质贴图的免费工具,本站提供一个下载,下载包的MD5值是0271de94ae3da1ea55e47fa5141bd225,但如果此官网依然能访问,最好直接从官网下载。 CubeMapGen 用来生成可进行卷积运算的立方体映射贴图。本站提供一个下载,下载包的MD5值是a6eb480b987618c023c79a4297fdb057,但如果此官网依然能访问,最好直接从官网下载。 Adreno GPU Profiler 一个Shader调试工具,支持OpenGL,Direct3D11,支持Win7及之后的平台,支持Linux,MacOS BorPak 用来解压使用OpenBOR引擎开发的游戏的资源包的工具 技术大神的集散地

C#中的迭代器和yield

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在.NET中通过使用接口IEnumerator和IEnumerable及其泛型等价物。来封装 迭代器模式 。所谓 迭代器模式 即是:允许你访问一个数据项序列,能依次遍历该序列中的每一项元素,而无需关心元素在序列内部的组织形式。 1.非泛型版本的IEnumerator和IEnumerable接口 首先看IEnumerator接口的定义,代码如下: public interface IEnumerator { /* 获取集合中位于枚举数当前位置的元素。在下列任一情况下,不定义Current: 1 枚举器位于集合中第一个元素之前,紧跟在创建枚举器之后。 在读取Current的值之前, 必须调用MoveNext,以将枚举器前进到集合的第一个元素。 2 对MoveNext的最后一次调用返回了 false,指示集合的末尾。 3 由于对集合所做的更改(如添加、修改或删除元素),枚举器无效。 在调用 Current 之前,MoveNext返回相同的对象。 MoveNext将Current设置为下一个元素。 */ object Current { get; } /* 将枚举数推进到集合的下一个元素。 如果枚举数已成功地推进到下一个元素,则为true; 如果枚举数传递到集合的末尾,则为false。 在创建枚举器之后,或在调用Reset方法之后,枚举数将定位到集合的第一个元素之前, 对MoveNext方法的第一次调用将枚举器移动到集合的第一个元素上。 如果MoveNext越过集合的末尾,则枚举器将定位到集合中的最后一个元素之后,MoveNext返回false。 当枚举器位于此位置时,对MoveNext的后续调用也将返回false,直到调用Reset。 如果对集合所做的更改(如添加、修改或删除元素),则MoveNext的行为是不确定的。 */ bool MoveNext(); /* 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。 */ void Reset(); } 顾名思义,IEnumerator就是表征一个“ 迭代器 ”(又可称为 枚举器 )应有的功能接口,该接口所函数的方法如上述代码注释中所描述,接下来看IEumerable接口,代码如下: public interface IEnumerable { IEnumerator GetEnumerator(); } IEnumerable用来表征“一个数据集合是 可迭代 的( 可枚举 的)”,即是说该数据集合中的每个元素都是可以被一一迭代的。IEnumerable接口也很简单,只有一个方法,就是返回 能访问到该数据集合每个元素的迭代器 。