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。然后尝试用不同的细分等级来画。
细分等级越高,球体就越看不出棱角,弧线就更加完美,所用的功耗就越高。