Directx11 6.15EXERCISES(给自己看的)

来源:互联网 发布:stussy淘宝哪家正 编辑:程序博客网 时间:2024/06/05 18:26

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。然后尝试用不同的细分等级来画。

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

0 0