Liny_@NotePad

沉迷ACG中

【20090922】C++培训日记-DX初探(2)

YOYO posted @ 2009年9月22日 22:46 in 【C/C++】 with tags DirectX , 1948 阅读

主要内容是着色、光源,以及抗锯齿的处理 = =

 光源部分完全不懂 巨多参数 囧 照着COPY - -……

抗锯齿处理:锯齿是在光栅化的时候因为浮点数取整时造成的,
我们可以在初始化的时候设置设备的MultiSampleType(多重取样),
级别从1级到16级,每次取周围一定范围(取决于级别高低)的像素 计算该像素的颜色
这台PC的显卡支持到D3DMULTISAMPLE_8_SAMPLES,软件运算支持到9……
可以通过下列语句检查HAL和REF是否支持该级别:

	// 测试当前硬件性能是否支持此级别多重采样
	if (FAILED(g_pd3d9->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, TRUE, D3DMULTISAMPLE_8_SAMPLES, 
		NULL)))
	{
		MessageBox(hWnd, TEXT("HAL NOT SUPPOSE THIS MULTISAMPLE"), TEXT(""), MB_OK);

		// 尝试用软件方式创建设备
		if (FAILED(g_pd3d9->CreateDevice(D3DADAPTER_DEFAULT,	// 默认显卡
			D3DDEVTYPE_REF,				// 使用软件设备
			hWnd,					// 与设备相关的窗口句柄
			D3DCREATE_SOFTWARE_VERTEXPROCESSING,		// 定点运算采用软件方式
			&d3dParm,					// D3D设备参数
			&g_pd3dDevice9)))				// D3D设备
		{
			MessageBox(hWnd, TEXT("SORRY, REF ALSO FAILED!"), TEXT(""), MB_OK);
			return E_FAIL;
		}
	
		return S_OK;
	}
	else
	{
		// 创建D3D设备对象
		if (FAILED(g_pd3d9->CreateDevice(D3DADAPTER_DEFAULT,	// 默认显卡
			D3DDEVTYPE_HAL,				// 使用硬件设备
			hWnd,					// 与设备相关的窗口句柄
			D3DCREATE_SOFTWARE_VERTEXPROCESSING,		// 定点运算采用软件方式
			&d3dParm,					// D3D设备参数
			&g_pd3dDevice9)))				// D3D设备
		{
			return E_FAIL;
		}

		return S_OK;
	}

笔记,SHADEMODE的两种值:

  • FLAT
    取三角形中第一个顶点的颜色 填充整个平面
     
  • GOURAUD
    取三个顶点的颜色线性插值,结果会是彩色的 = =

光源则有三种:

  • POINT 点光源
    顾名思义就是从一点放出来的光源了 - -
    	// 设置一个点光源
    	D3DXVECTOR3 LightPos(0.0f, 0.0f, 0.0f);		// 在原点
    	D3DXCOLOR   c = WHITE;				// 白光
    
    	g_d3dLight9.Type      = D3DLIGHT_POINT;		// 类型
    	g_d3dLight9.Ambient   = c * 0.0f;			// 环境光
    	g_d3dLight9.Diffuse   = c;				// 漫射光
    	g_d3dLight9.Specular  = c * 0.6f;			// 镜面光
    	g_d3dLight9.Position  = LightPos;			// 光源位置
    	g_d3dLight9.Range        = 1000.0f;			// 最大光程
    
    	// 衰减 = 1 / A0 + A1 * D + A2 * D * D		(D = 光源到顶点的距离)
    	g_d3dLight9.Attenuation0 = 1.0f;			// 常量衰减系数
    	g_d3dLight9.Attenuation1 = 0.0f;			// 线性衰减系数
    	g_d3dLight9.Attenuation2 = 0.0f;			// 二次衰减系数
  • DIRECTIONAL 方向光
    有方向的光源 - -
    	// 设置一个定向光源
    	D3DXVECTOR3 LightDir(1.0f, 0.0f,  0.0f);	// 从左向右
    	D3DXCOLOR   c = WHITE;			// 白光
    
    	g_d3dLight9.Type      = D3DLIGHT_DIRECTIONAL;	// 类型
    	g_d3dLight9.Ambient   = c * 0.0f;		// 环境光
    	g_d3dLight9.Diffuse   = c;			// 漫射光
    	g_d3dLight9.Specular  = c * 0.6f;		// 镜面高光
    	g_d3dLight9.Direction = LightDir;		// 光的方向
  • SPOT 聚光灯
    像手电筒一样 中间一部分很亮 旁边慢慢变淡:
    	// 设置一个聚光灯光源
    	D3DXVECTOR3 LightPos(0.0f, 0.0f, -5.0f);	// 光源位置
    	D3DXVECTOR3 LightDir(0.0f, 0.0f,  1.0f);	// 光源方向
    	D3DXCOLOR   c = WHITE;			// White
    
    	g_d3dLight9.Type      = D3DLIGHT_SPOT;	// 类型
    	g_d3dLight9.Ambient   = c * 0.0f;		// 环境光
    	g_d3dLight9.Diffuse   = c;			// 漫射光
    	g_d3dLight9.Specular  = c * 0.6f;		// 镜面光
    	g_d3dLight9.Position  = LightPos;		// 光源位置
    	g_d3dLight9.Direction = LightDir;		// 光源方向
    	g_d3dLight9.Range        = 1000.0f;		// 最大光程
    	g_d3dLight9.Falloff      = 1.0f;		// 光强衰减方式
    	g_d3dLight9.Attenuation0 = 1.0f;		// 常量衰减系数
    	g_d3dLight9.Attenuation1 = 0.0f;		// 线性衰减系数
    	g_d3dLight9.Attenuation2 = 0.0f;		// 二次衰减系数
    	g_d3dLight9.Theta        = 0.4f;		// 内锥角
    	g_d3dLight9.Phi          = 0.9f;		// 外锥角

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter