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。然后尝试用不同的细分等级来画。
细分等级越高,球体就越看不出棱角,弧线就更加完美,所用的功耗就越高。
- Directx11 6.15EXERCISES(给自己看的)
- directx11 5.14exercises(给自己看的,有错请斧正)
- 给自己看的。。。
- 给自己看的
- 给自己看的,
- 给自己看的哦
- 给自己看的总结
- 给自己看的sql
- html--给自己看的
- 人是活给自己看的
- 给自己看的NIM
- 杂记---------->给自己看的
- 给自己看的Redis
- 给自己看的招聘信息
- moreAjax(仅仅是给自己看的)
- 关于循环跳出 给自己看的
- linux 命令行(给自己看的)
- Ext (给自己看的)
- Distinct Subsequences
- 修改windows的注册表以实现修改键盘按键的映射
- java基础集合之Map
- Java学习笔记(17) Binary I/O
- 使用SQLyog连接MySQL
- Directx11 6.15EXERCISES(给自己看的)
- 二维透视投影变换
- Hibernate Dao、Service 基类
- extern
- initWithNibName
- 初识Mysql存储过程
- Jmap相关
- 关于Xposed
- 兼容i6的三级菜单(不闪的)