DX 一些设置大集合

鉴于DX里头的设置太多了,决定做个大集合,以后有看到的就加进来。

==============================================

1 渲染状态:

==============================================

HRESULT IDirect3DDevice9::SetRenderState(

D3DRENDERSTATETYPE State, // 更改的渲染状态

DWORD Value // 新的状态值

);

 

通用:

填充模式(线框):D3DRS_FILLMODE —- (D3DFILL_WIREFRAME 线框 D3DFILL_SOLID 普通模式)

 

色彩:

着色处理:D3DRS_SHADEMODE —- (D3DSHADE_FLAT  平面着色 D3DSHADE_GOURAUD 高洛德 )

混合像素:D3DRS_ALPHABLENDENABLE —- true/false

模板缓存:D3DRS_STENCILENABLE —-  true/false

 

灯光:

镜面光的开关: D3DRS_SPECULARENABLE —-  true/false;

 

 

===============================================

2 指定Alpha资源:

===============================================

// compute alpha from diffuse colors during shading

Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);

Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

// take alpha from alpha channel

Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

Tag 标签:

关于CEGUI渲染状态的恢复

        CEGUI在渲染完了之后,会更改DX的渲染状态,但是并不会恢复过来,于是如果此时再用DX渲染的话,就会出现混乱了,网上看了很多,但是写的都不对,这里是经本人测试切实可用的代码,其中CEGUI 版本为0.7.1

	// Revert RenderState 
	m_pDirect3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
	m_pDirect3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
	m_pDirect3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
	m_pDirect3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
	m_pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

	m_pDirect3DDevice->SetTextureStageState( 0 , D3DTSS_COLORARG1, D3DTA_TEXTURE );
	m_pDirect3DDevice->SetTextureStageState( 0 , D3DTSS_COLORARG2, D3DTA_DIFFUSE );
	m_pDirect3DDevice->SetTextureStageState( 0 , D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

       在用DX进行渲染之前执行下之前的代码,就可以用了,如果还不行的话可以参考CEGUIDirect3D9Renderer.cpp里头的 beginRendering() 这个函数,CEGUI更改过的所有的渲染状态都在这里了,呵呵。

程序运行完毕出现 Run-Time Check Failure #2 – Stack around the variable ‘App’ was corrupted.

这几天一直被这个问题所困,代码如下

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
{

	YGEGame Game;

	YGEAppParam AppParam;
	AppParam.hInstance = hInst;
	AppParam.pApplication = &Game;
	AppParam.hPrevInst = hPrevInst;
	AppParam.bWindowed = true;
	AppParam.bMulti = false;
	AppParam.bShowMouse = true;
	AppParam.uScreenHeight = 600;
	AppParam.uScreenWidth = 800;
	_tcsncpy_s( AppParam.szAppName, (TCHAR*)"Sample", DEFAULT_TITLE_NAME_LEN );
	_tcsncpy_s( AppParam.szWndTitleName, (TCHAR*)"This is Only a Sample :)", DEFAULT_TITLE_NAME_LEN );

	YGEAppFrame App;
	if( App.CreateApplication( AppParam ) )
	{
		App.RunApplication( );
	}
	return 0;
}

每次运行到return 0 之后,就会弹出消息:

Run-Time Check Failure #2 – Stack around the variable ‘App’ was corrupted.
继续阅读

CEGUI与DX(Direct3D)渲染的冲突问题

今天在工程里直接调用D3D的API画了一个旋转的三角体(可以理解为金字塔),但是一调用CEGUI的渲染之后,金字塔就无法渲染出来,只要不调用 CEGUI::System的renderGUI(),就可以渲染出来,所以觉得应该是跟CEGUI内部渲染有冲突。

 

查了下网上的资料,果然有反映说CEGUI更改了渲染状态,但没有改回来导致渲染失败。看了下CEGUI的源码,如下: 继续阅读

关于C++类型转换的问题

问题:今天做了一个改动,就是将CEGUI的D3D9Renderer从游戏的渲染模块挪到了Adapter模块,由Adapter统一管理所有的GUI事务,包括GUI 的渲染工作,但是问题出现了,Renderer在初始化成功之后,再被Sample调用的时候,突然变成了无效的指针(不为空,是地址被改动了,里头的所有成员均未初始化),导致程序宕掉。

解决:原因,在将基类指针转换为其派生类指针时用了强行转换导致的……改用static_cast问题就解决了,不过看了网上的资料后,貌似用dynamic_cast更适合,HOHO。

 

关于类型转换的相关资料:

C++类型转化分析 http://blog.csdn.net/qychjj/archive/2009/11/28/4896411.aspx

如何写出好的代码

以下一些是我看书然后结合自己的一些编程经验得出的一些总结,有不妥还望及时予以指出 🙂

 

1. 编码的目标是清晰而不是简洁

2. 在执行期获取的任何资源,必须彻底释放,不要完全指望你的”管家”,它们也不一定是可靠的

3. 需要用到通过其他函数返回的值时,务必在使用前对它们进行检查

4. 不要在多个地方重用一个临时变量,每次都创建一个新的变量,编译器会帮你解决效率问题。

继续阅读