Directx11 6.15EXERCISES(给自己看的)

1,在龙书上写了。

2.

struct Vertex
{
	XMFLOAT3 Pos;
	XMFLOAT4 Color;
};
改成

struct VertexPos
{
         XMFLOAT3 Pos;
};
struct VertexColor
{
         XMFLOAT4 Color;
};
然后,stride和offset改成stride[2]和offset[2],然后D3D11_INPUT_ELEMENT_DESC 里照题目里改一下。

其他的,按照错误信息里看一看,修改一下。

这题主要目的就是要教我们怎么用两个槽来描绘图形。

3.画LINESTRIP,POINTLIST,LINELIST的话,大致相同

 Vertex vertices[] =  
    {  
        { XMFLOAT3(-0.5f, -0.4f, 0.0f), (const float*)&Colors::White   },  
        { XMFLOAT3(-0.3f, +0.4f, 0.0f), (const float*)&Colors::LightSteelBlue   },  
        { XMFLOAT3(-0.2f, -0.2f, 0.0f), (const float*)&Colors::Red     },  
        { XMFLOAT3( 0.0f, 0.0f, 0.0f), (const float*)&Colors::Green   },  
        { XMFLOAT3(+0.1f, -0.1f, 0.0f), (const float*)&Colors::Blue    },  
        { XMFLOAT3(+0.2f, +0.1f, 0.0f), (const float*)&Colors::Yellow  },  
        { XMFLOAT3(+0.4f, -0.1f, 0.0f), (const float*)&Colors::Cyan    },  
        { XMFLOAT3(+0.5f, +0.5f, 0.0f), (const float*)&Colors::Magenta }
    };  

先把VertexBuffer改一下,然后    md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP)改一下即可。(即改简单拓扑类型的参数)。

画TRIANGLELIST和TRIANGLESTRIP的话,VertexBuffer要多一个点。

D3D11_RASTERIZER_DESC wireframeDesc;  
	ZeroMemory(&wireframeDesc, sizeof(D3D11_RASTERIZER_DESC));  
	wireframeDesc.FillMode = D3D11_FILL_WIREFRAME;  
	wireframeDesc.CullMode = D3D11_CULL_NONE;  
要把,正反面挑选效果设为NULL,不然只会显示2个三角形,转一下又只有一个三角形的情况。同样的简单拓扑类型的参数要修改一下。

4.在第五章EXERCISE做过了。

5.答案就在5.10.3!!!!

6.这道题考察了我们对CONTENT BUFFER和FX的理解。

a.先在FX文件里的cbuffer加gTime

cbuffer cbPerObject
{
	float4x4 gWorldViewProj; 
	float gTime;
};
b.然后按照题目在VS里面加上题目里的代码
VertexOut VS(VertexIn vin)
{
	VertexOut vout;
	
	vin.PosL.xy += 0.5f*sin(vin.PosL.x)*sin(3.0f*gTime);  
	vin.PosL.z  *= 0.6f + 0.4f*sin(2.0f*gTime);

	// Transform to homogeneous clip space.
	vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
	
	// Just pass vertex color into the pixel shader.
    vout.Color = vin.Color;
    
    return vout;
}
C.在BOXAPP类里增加数据元素

ID3DX11EffectScalarVariable*  mfxTime;
将gTime和mfxTime连接起来(把gTime的地址赋给mfxTime,毕竟mfxTime是指针)

mfxTime = mFX->GetVariableByName("gTime")->AsScalar();
获取totalTime,并将其给mfxTime再将其给gTime.

float totalTime = D3DApp::mTimer.TotalTime();  
	mfxTime->SetFloat(totalTime);
最后就运行成功了。

7.

只要把两个Vertex和index合起来就可以了,另外注意坐标轴分开,indice编号不要冲突,drawindex的用法注意一下就好。

8.

直接拿上面那个项目来改就好了。

第一种方法,直接在源文件里直接改。

Init里添加

D3D11_RASTERIZER_DESC wireframeDesc;  
	ZeroMemory(&wireframeDesc, sizeof(D3D11_RASTERIZER_DESC));  
	wireframeDesc.FillMode = D3D11_FILL_WIREFRAME;  
	wireframeDesc.CullMode = D3D11_CULL_NONE; 

	HR(md3dDevice->CreateRasterizerState(&wireframeDesc, &mWireframeRS));
drawscene里加
md3dImmediateContext->RSSetState(mWireframeRS);


第二种方法是直接在effect文件里面修改(也就是FX文件)

添加

RasterizerState WireframeRS
{
	FillMode = Wireframe;
	CullMode = Back;
	FrontCounterClockwise = false;
};
technique11里面添加SetRasterizerState( WireframeRS );
technique11 ColorTech
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_5_0, VS() ) );
		SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS() ) );
    }
}


9.第一种方法已经在上一题不小心做了,第二种方法只要更改CullMode里的参数。就好了(好尴尬,立方体和椎体的坐标描述方向是相反的)。

10.这次要把128位颜色数据改成,32位。

然而8位的颜色需要储存在UINT中已ABGR的形式,而不是RGBA。

因为8位储存数据格式位为小端格式(自行百度),所以数据位的读取顺序不同。(实际ABGR输进去,执行顺序就是RGBA)

所以我们要把ARGB(XMCOLOR用的顺序)改成ABGR。

接下来这段代码可以帮助我们

static D3DX11INLINE UINT ArgbToAbgr(UINT argb)
{
	BYTE A = (argb >> 24) & 0xff;
	BYTE R = (argb >> 16) & 0xff;
	BYTE G = (argb >>  8) & 0xff;
	BYTE B = (argb >>  0) & 0xff;
	
	return (A << 24) | (B << 16) | (G << 8) | (B << 0);
}
这个在d3dUtils里有(自己看一下),所以我们加一个标识符就可以用了
 Vertex vertices[] =
    {
		{ XMFLOAT3(-1.0f, -1.0f, -1.0f), Convert::ArgbToAbgr(0xffffffff)  },  // White  
		{ XMFLOAT3(-1.0f, +1.0f, -1.0f), Convert::ArgbToAbgr(0xff000000)  },  // Black
		{ XMFLOAT3(+1.0f, +1.0f, -1.0f), Convert::ArgbToAbgr(0xffff0000)  },  // Red  
		{ XMFLOAT3(+1.0f, -1.0f, -1.0f), Convert::ArgbToAbgr(0xff00ff00)  },  // Green  
		{ XMFLOAT3(-1.0f, -1.0f, +1.0f), Convert::ArgbToAbgr(0xff0000ff)  },  // Blue  
		{ XMFLOAT3(-1.0f, +1.0f, +1.0f), Convert::ArgbToAbgr(0xffffff00)  },  // Yellow  
		{ XMFLOAT3(+1.0f, +1.0f, +1.0f), Convert::ArgbToAbgr(0xff00ffff)  },  // Cyan  
		{ XMFLOAT3(+1.0f, -1.0f, +1.0f), Convert::ArgbToAbgr(0xffff00ff)  }   // Magenta  
    };

11.直接按照 4.2.8 Set the ViewPort来就好了,挺简单的没什么难度(就是Viewport结构体的所有数据成员都要初始化一下,不然会出错)。

12.

a.运行以后没有影响,应该是D3D11_INPUT_ELEMENT_DESC 里面的运行顺序按照第五个参数字节偏移量(AlignedByteOffset)来的.

b.同样没有影响,因为在EFFECT文件之间是通过语意名字来确定联系的。

同样CPP文件和EFFECT文件之间也是通过语意名字来确定联系的。

例如

D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
	{
		{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
		{"COLOR",    0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
	};

里的"POSTION"和"COLOR".

13.

首先,最关键的一步

wireframeDesc.ScissorEnable = true;
//然后就直接按照书上的代码加上这两句就可以,然后在DrawScene里加上下面这些代码就可以了
<pre name="code" class="cpp">D3D11_RECT rects = {100, 100 , 400 , 400 };
	md3dImmediateContext->RSSetScissorRects(1,&rects);

14.创造几何球体,CreateGeosphere来代替CreateSphere。然后尝试用不同的细分等级来画。

 
细分等级越高,球体就越看不出棱角,弧线就更加完美,所用的功耗就越高。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值