首先决定暂时不考虑DX9/OGL了,我不可能在不了解一个库的时候就给它留好接口。耽误我挺多时间了,虽然有重大收获……
今天的成就是把Shader启动起来了,做了一个花的三角形。
不管怎么说,抛弃Framework不谈,本周完成界面显示还是没什么大问题的。剩下的时间我还是去读读ConfigSystem(DXSDK里一个很囧的小球Sample)的整体结构,还有读读DXUT的代码了。
如果顺利的话,我也决定采用DXUT开发,因为我没有必要在对整体流程已经了解的情况下,对每个细节了如指掌。我的关注点还是:资源管理、框架、Shader。不能偏离了学习DX的目的。
没弄明白怎么粘图,那就不管了,反正一个破三角形也没什么好看的……
随便改了改代码,用RenderMonkey时写的一些vs和ps的东西还记得。
另外Dx10的用于输出的一些Semantics的名字改了:
Direct3D 10 Semantic |
Direct3D 9 Equivalent Semantic |
SV_Depth |
DEPTH |
SV_Position |
POSITION |
SV_Target |
COLOR |
不管怎么说总是麻烦了一点。讨厌的是RenderMonkey在我的电脑上没装起来,不能方便的编辑shader然后输出fx了。明天还是研究下如何输出编译的错误信息。好歹编不过要能告诉我是哪行编不过才行……
现在的Shader代码:(就随便搞了下,显示出一个暗红色的怪东西:)
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 Color: COLOR0;
};
VS_OUTPUT VS( float4 Pos : POSITION )
{
VS_OUTPUT Output;
Output.Pos = Pos;
Output.Color = float4( 0.3f, Pos.y, Pos.x, 1.0f );
return Output;
}
struct PS_OUTPUT
{
float4 RGBColor : SV_Target; // Pixel color
};
PS_OUTPUT PS( float4 Pos : SV_POSITION,
float4 Color: COLOR0 )
{
PS_OUTPUT Output;
Output.RGBColor = Color;
return Output;
}
technique10 R0
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}
主要是把Tutorial2里的fx拿出来,把两个输出从单纯的float4变成了一个结构体,然后给VS的输出增加了一个Color,最后再把坐标的一部分当作颜色输出了出去。
posted @
2008-11-14 00:30 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(255) |
评论 (0) |
编辑 收藏
posted @
2008-11-13 21:32 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(104) |
评论 (0) |
编辑 收藏
我究竟是不太能接受这种不规则的学习方式,而且太心急太有压力太怕完不成,只能退而求其次。我想如果用glut写完还有剩余的时间,我会把它转到win API。而且我相信FamilyBlock的逻辑并不难,我有信心快速完成它。
posted @
2008-11-13 21:15 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(121) |
评论 (0) |
编辑 收藏
好吧,今晚有重大突破,那就是:窗口显示出来老!v ~。~b
就是DXSDK里那个蓝蓝的窗口,不过我为了搭建Frame,绕了好多弯,刚刚才终于显示出来。
目前完成了GraphicsDevice类的创建了,我正在考虑怎样设计通用的点列表、材质等等接口,得寻人咨询下OpenGL的关于点列表的接口。如果大家都是自定义结构体+参数那就没什么好说的老,把点列表做成一个点容器那么复杂似乎也没有必要。唉,做到再说吧!
目前的主函数代码:
int _tmain(int argc, _TCHAR* argv[])
{
InitFramework();
CComPtr<IGraphicsLibrary> pGL;
if (FAILED(GetDefaultFrameworkLibrary(&pGL)))
{
wprintf(L"No default graphics library found.\n");
ATLASSERT(false);
return 1;
}
CComBSTR bsGLName;
if (SUCCEEDED(pGL->GetLibraryName(&bsGLName)))
{
wprintf(L"Default graphics library is: %s\n", (BSTR)bsGLName);
}
pGL->EnumAdapters();
CComPtr<IGraphicsDevice> pGraphicsDevice;
if (FAILED(pGL->CreateGraphicsDevice(FALSE, 640, 480, L"Only a test", &pGraphicsDevice)))
{
ATLASSERT(false);
return 1;
}
FrameworkSimpleMainLoop(pGraphicsDevice);
return 0;
}
最后的FrameworkSimpleMainLoop就是近似传说中的glutMainLoop啦,不过为了避免全局变量,我把pGraphicsDevice给传进去了……
然后想想貌似这里没什么避免全局变量的必要(或者整个类,然后用静态变量算了)。现在的话,如果想在MainLoop内更换GraphicsDevice,原来的Device的引用计数也释放不掉了。
然后觉得一开始的注册可用库之类的流程也要改,目前那个全局map也会把所有的DLL都保留着,没有释放掉。
最好的办法是,全局map里只保留创建函数,在获取Library。主程序可以Enum每个可用类(按接口),传递GUID进去,获得一个接口,也可以选择创建默认类,然后获得一个接口。在InitFramework的时候,每个DLL只尝试性连接,如果连接成功,可以立刻释放。等到对应的类被创建的时候再去重新连接。
另外在ToggleDevice的方面还没什么好的想法。或者干脆维护一个Device列表?列表内的被Render。这也是需要改进的。
posted @
2008-11-12 22:59 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(130) |
评论 (0) |
编辑 收藏
今天把玛丽医生的界面规划了一下,规划的是那么的美好。中午吃完饭连寝室都没来得及回就赶来实验室写代码,但是万恶的XYLayout让我寒心了。
以前只是听说过XYLayout,但还是没有用过。今天规划界面的时候我想到了XYLayout,自己幻想XYLayout挺好的,对每个组建都固定一个位置,这样做界面太好了。可是回来之后写了代码居然发现JDK里面竟然无法编译,当时那个心情啊。后来想想,还是先写功能吧,屏幕上就先出来一个16*8的格子加上菜单,另外的界面就等等再说吧。
posted @
2008-11-12 22:04 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(224) |
评论 (0) |
编辑 收藏
摘要:
阅读全文
posted @
2008-11-12 19:40 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(254) |
评论 (2) |
编辑 收藏
晕死了都,为什么<gl\gl.h>前面一定要加#include <windows.h>……………………崩溃的link error
不就是一个小小的ReadBMP24函数,我想里面就用了个GLubyte类型,没用啥别的,go to definition一下,定义在gl\gl.h里,就把头文件从glut换成了gl,于是出现了崩溃的link error。上帝啊,不带这么折磨新手的。
抓狂中……
posted @
2008-11-12 11:07 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(282) |
评论 (0) |
编辑 收藏
今天早上意图创建Device和SwapChain。这没什么问题,但是我意图通过模板演绎和宏来简化对动态链接的DLL中函数的调用时,我写的模板和宏不能正常工作。
我写的函数和宏如下:
template <typename FuncType>
FuncType __forceinline GetModuleFunc(HMODULE hModule, LPCSTR lpProcName, FuncType /*pFunc*/)
{
return reinterpret_cast<FuncType>(GetProcAddress(hModule, lpProcName));
}
#define CallModuleFunc(Module, ProcName, Args) (GetModuleFunc(Module, #ProcName, ProcName))?((GetModuleFunc(Module, #ProcName, ProcName)) Args) : E_FAIL
思路是通过函数的声明演绎出函数类型,进行强转然后调用。
失败原因是尽管没有直接调用pFunc,但pFunc依然作为参数被引用了,因为是动态链接的DLL,没有引用对应的lib,所以链接时提示找不到符号的错误信息。
想知道有没有什么其他的办法只通过函数声明而不通过引用来获得类型以实现对动态链接的DLL中的函数的调用?vs2005还不支持typeof关键字,暂时没有想到什么好办法。
调用方代码大致如下:以CreateDXGIFactory(Direct10里的一个函数) 举例:
HRESULT ret = CallModuleFunc(m_hDXGIModule, CreateDXGIFactory, (__uuidof(IDXGIFactory), (void **)&pDXGIFactory) );
if (FAILED(ret))
{
ATLASSERT(0);
return E_FAIL;
}
后记:
在伟大的叛叛的指导下,用boost搞定了这个问题。
一个test程序如下:
BOOST_TYPEOF(Direct3DCreate9) *pDirect3DCreate9 = NULL;
HMODULE hdx = LoadLibrary(_T("d3d9.dll"));
pDirect3DCreate9 = reinterpret_cast<BOOST_TYPEOF(Direct3DCreate9) *>(GetProcAddress(hdx, "Direct3DCreate9"));
if (pDirect3DCreate9 == NULL)
{
ATLASSERT(0);
}
else
{
IDirect3D9 * pD3D = pDirect3DCreate9(D3D_SDK_VERSION);
if (pD3D == NULL)
{
ATLASSERT(0);
}
}
按照这个思路已经可以写出通用的宏了。
template <typename FuncType>
FuncType __forceinline GetModuleFunc(HMODULE hModule, LPCSTR lpProcName)
{
FuncType fun = reinterpret_cast<FuncType>(GetProcAddress(hModule, lpProcName));
return fun;
}
#define CallModuleFunc(Module, ProcName, Args) (GetModuleFunc<BOOST_TYPEOF(ProcName) *>(Module, #ProcName))?((GetModuleFunc<BOOST_TYPEOF(ProcName) *>(Module, #ProcName)) Args) : E_FAIL
可惜的是boost::typeof的代码我完全看不懂……学习C++的路漫漫其修远兮……
posted @
2008-11-12 09:11 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(415) |
评论 (1) |
编辑 收藏
唉,我每天的业余时间都是被劈成两半的,每一半只有两个小时。
今天晚间的成果是:成功的用动态链接调用了DX10的函数,链接失败的情况程序也可以通过返回值给予一定的提示。
通过这种方法拿到了IDXGIFactory接口,然后列举了下我的显卡和显示输出,还有在B8G8R8A8显示模式下的所有可用分辨率和刷新率(PS: 我现在是单显卡输出两个显示器的。)
运行结果:
Default graphics library is: Direct3D 10 Library
Adapter NVIDIA GeForce 8600M GT :
VendorId: 4318, DeviceId: 1031, SubSysId: 16321043, Revision: 161
DedicatedVideoMemory: 241M, DedicatedSystemMemory: 0M, SharedSystemMemor
y: 767M
Outputs:
\\.\DISPLAY1: 1024 * 768
Available display mode for B8G8R8A8_UNORM:
640*480 Refresh rate: 60Hz
640*480 Refresh rate: 70Hz
640*480 Refresh rate: 72Hz
640*480 Refresh rate: 75Hz
800*600 Refresh rate: 56Hz
800*600 Refresh rate: 60Hz
800*600 Refresh rate: 70Hz
800*600 Refresh rate: 72Hz
800*600 Refresh rate: 75Hz
1024*768 Refresh rate: 60Hz
1024*768 Refresh rate: 70Hz
1024*768 Refresh rate: 72Hz
1024*768 Refresh rate: 75Hz
\\.\DISPLAY2: 1280 * 800
Available display mode for B8G8R8A8_UNORM:
640*480 Refresh rate: 60Hz
640*480 Refresh rate: 60Hz
800*600 Refresh rate: 60Hz
800*600 Refresh rate: 60Hz
1024*768 Refresh rate: 60Hz
1024*768 Refresh rate: 60Hz
1280*800 Refresh rate: 60Hz
目前依然是连窗口和图形界面都没有的-___,-
慢慢来,因为这些基础的东西也是很重要的。
另外,列举显示卡和显示器的代码暂时没有返回给上层,主要是编码一个枚举类型还是挺耗时间的。暂时用硬编码解决。
posted @
2008-11-12 00:51 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(299) |
评论 (0) |
编辑 收藏
格子里的故事简介
分内核和外在两部分来说。先说内核的东西,也就是游戏的技术实现目标。
基于传统的俄罗斯方块游戏,在其基础上设置游戏障碍及我们的游戏要求也就是过关条件。这个游戏的过关条件就是在我们指定的区域用同一种颜色填满,而且指定的区域外必须是其他颜色的色块,或背景或另外一种颜色。图示说明:
采用俄罗斯方块的经典7元素,再配上颜色极为14种元素。目标填充区域需要全被同色格子占据,并且不能有同色突出,如图反应的两种情况。大致就是这个意思。
下面说外在部分,初步设想把它设计为一栋大楼里发生的事情。背景是晚上的某栋大楼,M*N个格子构成一关,在外在表现为M*N个房间构成一个楼层段。过关镜头向上走,也就是移向更上的一个楼层段。最开始的时候背景只有目标填充区域有微微光亮,周围的房间偏黑,然后14种元素以望远镜的镜片形式下落,稳定后它对应的房间里就会变得更亮,如果这个房间属于目标填充区域,那么房间被点亮,我们可以透过镜片看到里面发生的一个gif的故事,如果不属于目标填充区域,那么会显示一个拉上窗帘的gif。游戏过关之后镜头移动到更上层的一个楼层段,重复。但是每个楼层段每个目标填充区域所包含的房间里的gif是不一样的,也正是由这些不同来反映各个阶层或者说生活中的各个层次的人们的生存形态。格子里的故事这个题目也取自这里,同时想要表达的还有一种我们一直被禁锢的意思,活着的时候是在大大的盒子里,死后实在小小的盒子里。当然这些都不要告诉玩家~~,你也可以不这么认为。但这些确实是我想到的。而且我觉得游戏永远不只有一个目的,它毕竟是一种表达手段。哦,扯远了。下面跟上游戏进度和工作分配。
11.12——11.16 第一阶段游戏功能实现,包括基本俄罗斯方块功能实现
11.17 成果进度汇报讨论
11.17——11.23 第二阶段游戏功能实现,包括特定区域颜色判定
11.24 成果进度汇报讨论
11.25——11.30 第三阶段游戏功能实现,包括选关、存档功能实现
12.1 成果进度汇报讨论
12.1——12.7 后期测试优化,包括图片和声音导入
12.8 发布。
以上责任人:PureMilk、糖糖、朱波
Gif图片制作:肖赤赤
posted @
2008-11-11 21:47 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(132) |
评论 (0) |
编辑 收藏