日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Introdution to 3D Game Programming With DirectX11 第11章 习题解答

發布時間:2024/6/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Introdution to 3D Game Programming With DirectX11 第11章 习题解答 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

11.1

?這道題要注意使用了line strip,由于曾經一直用triangle list,所以在幾何渲染的時候easy算錯定點描繪的順序。

貼一些代碼,大概就能把這個問題解釋清楚了,由于框架還不是特別熟,所以是在原有樣例的基礎上建立的自己的代碼

void TreeBillboardApp::BuildCircleBuffers() {////Create the vertex buffer//std::vector<Vertex::Basic32> vertices(32);for (int i = 0; i < 32; i++){vertices[i].Pos.x = cosf(MathHelper::Pi * i / 16);vertices[i].Pos.y = 0;vertices[i].Pos.z = sinf(MathHelper::Pi * i / 16);XMVECTOR p = XMLoadFloat3(&vertices[i].Pos);XMStoreFloat3(&vertices[i].Normal, XMVector3Normalize(p));vertices[i].Tex.x = i / 32;vertices[i].Tex.y = 0;}D3D11_BUFFER_DESC vbd;vbd.Usage = D3D11_USAGE_IMMUTABLE;vbd.ByteWidth = sizeof(Vertex::Basic32) * 32;vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = 0;vbd.MiscFlags = 0;vbd.StructureByteStride = 0;D3D11_SUBRESOURCE_DATA vinitData;vinitData.pSysMem = &vertices[0];HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mCircleVB));////Create the index buffer//UINT indices[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0 };D3D11_BUFFER_DESC ibd;ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(UINT)* 33;ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;ibd.MiscFlags = 0;ibd.StructureByteStride = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = indices;HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mCircleIB)); }void TreeBillboardApp::DrawCircle(CXMMATRIX viewProj) {//--------------------------------------------------------------------------////Draw the circle//// Set per object constants.XMMATRIX world = XMLoadFloat4x4(&mCircleWorld);XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);XMMATRIX worldViewProj = world*viewProj;Effects::CircleFX->SetWorld(world);Effects::CircleFX->SetWorldInvTranspose(worldInvTranspose);Effects::CircleFX->SetWorldViewProj(worldViewProj);Effects::CircleFX->SetTexTransform(XMMatrixIdentity());Effects::CircleFX->SetMaterial(mBoxMat);Effects::CircleFX->SetDiffuseMap(mBoxMapSRV);Effects::CircleFX->SetDirLights(mDirLights);Effects::CircleFX->SetEyePosW(mEyePosW);Effects::CircleFX->SetFogColor(Colors::Silver);Effects::CircleFX->SetFogStart(15.0f);Effects::CircleFX->SetFogRange(175.0f);md3dImmediateContext->IASetInputLayout(InputLayouts::Basic32);md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);md3dImmediateContext->RSSetState(RenderStates::WireframeRS);UINT stride1 = sizeof(Vertex::Basic32);UINT offset1 = 0;md3dImmediateContext->IASetVertexBuffers(0, 1, &mCircleVB, &stride1, &offset1);md3dImmediateContext->IASetIndexBuffer(mCircleIB, DXGI_FORMAT_R32_UINT, 0);ID3DX11EffectTechnique* circleTech;D3DX11_TECHNIQUE_DESC techDesc;switch (mRenderOptions){case RenderOptions::Lighting:circleTech = Effects::CircleFX->Light3Tech;break;case RenderOptions::Textures:circleTech = Effects::CircleFX->Light3TexAlphaClipTech;break;case RenderOptions::TexturesAndFog:circleTech = Effects::CircleFX->Light3TexAlphaClipFogTech;break;}circleTech->GetDesc(&techDesc);for (UINT p = 0; p < techDesc.Passes; ++p){//md3dImmediateContext->OMSetBlendState(RenderStates::AlphaToCoverageBS, blendFactor, 0xffffffff);md3dImmediateContext->RSSetState(RenderStates::NoCullRS);circleTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);md3dImmediateContext->DrawIndexed(33, 0, 0);// Restore default render state.md3dImmediateContext->RSSetState(0);} }
還專給那個circle單寫了fx,請無視那凝視

//============================================================================= // Basic.fx by Frank Luna (C) 2011 All Rights Reserved. // // Basic effect that currently supports transformations, lighting, and texturing. //=============================================================================#include "LightHelper.fx"cbuffer cbPerFrame {DirectionalLight gDirLights[3];float3 gEyePosW;float gFogStart;float gFogRange;float4 gFogColor; };cbuffer cbPerObject {float4x4 gWorld;float4x4 gWorldInvTranspose;float4x4 gWorldViewProj;float4x4 gTexTransform;Material gMaterial; };// Nonnumeric values cannot be added to a cbuffer. Texture2D gDiffuseMap;SamplerState samAnisotropic {Filter = ANISOTROPIC;MaxAnisotropy = 4;AddressU = WRAP;AddressV = WRAP; };struct VertexIn {float3 PosL : POSITION;float3 NormalL : NORMAL;float2 Tex : TEXCOORD; };struct VertexOut {float4 PosH : SV_POSITION;float3 PosW : POSITION;float3 NormalW : NORMAL;float2 Tex : TEXCOORD; };struct GeoOut {float4 PosH : SV_POSITION;float3 PosW : POSITION;float3 NormalW : NORMAL;float2 Tex : TEXCOORD;uint PrimID : SV_PrimitiveID; };VertexOut VS(VertexIn vin) {VertexOut vout;// Transform to world space space.vout.PosW = mul(float4(vin.PosL, 1.0f), gWorld).xyz;vout.NormalW = mul(vin.NormalL, (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);// Output vertex attributes for interpolation across triangle.vout.Tex = mul(float4(vin.Tex, 0.0f, 1.0f), gTexTransform).xy;return vout; }[maxvertexcount(4)] void GS(line VertexOut gin[2],uint primID : SV_PrimitiveID,inout TriangleStream<GeoOut> triStream) {//// Compute the local coordinate system of the sprite relative to the world// space such that the billboard is aligned with the y-axis and faces the eye.//float3 up = float3(0.0f, 5.0f, 0.0f);//float3 look = gEyePosW - gin[0].CenterW;//look.y = 0.0f; // y-axis aligned, so project to xz-plane//look = normalize(look);//float3 right = cross(up, look);//// Compute triangle strip vertices (quad) in world space.////float halfWidth = 0.5f*gin[0].SizeW.x;//float halfHeight = 0.5f*gin[0].SizeW.y;float4 v[4];v[0] = float4(gin[0].PosW, 1.0f);v[1] = float4(gin[0].PosW + up, 1.0f);v[2] = float4(gin[1].PosW, 1.0f);v[3] = float4(gin[1].PosW + up, 1.0f);float3 n[4];n[0] = gin[0].NormalW;n[1] = gin[0].NormalW;n[2] = gin[1].NormalW;n[3] = gin[1].NormalW;float2 t[4];t[0] = gin[0].Tex;t[1].x = gin[0].Tex.x;t[1].y = 1.0f;t[2] = gin[1].Tex;t[3].x = gin[1].Tex.x;t[3].y = 1.0f;//// Transform quad vertices to world space and output // them as a triangle strip.//GeoOut gout;[unroll]for (int i = 0; i < 4; ++i){gout.PosH = mul(v[i], gWorldViewProj);gout.PosW = v[i].xyz;gout.NormalW = n[i].xyz;gout.Tex = t[i].xy;gout.PrimID = primID;triStream.Append(gout);} }float4 PS(GeoOut pin, uniform int gLightCount, uniform bool gUseTexure, uniform bool gAlphaClip, uniform bool gFogEnabled) : SV_Target {// Interpolating normal can unnormalize it, so normalize it.pin.NormalW = normalize(pin.NormalW);// The toEye vector is used in lighting.float3 toEye = gEyePosW - pin.PosW;// Cache the distance to the eye from this surface point.float distToEye = length(toEye);// Normalize.toEye /= distToEye;// Default to multiplicative identity.//float3 uvw = float3(pin.Tex, pin.PrimID % 4);float4 texColor = float4(1, 1, 1, 1);if (gUseTexure){// Sample texture.texColor = gDiffuseMap.Sample(samAnisotropic, pin.Tex);if (gAlphaClip){// Discard pixel if texture alpha < 0.1. Note that we do this// test as soon as possible so that we can potentially exit the shader // early, thereby skipping the rest of the shader code.clip(texColor.a - 0.1f);}}//// Lighting.//float4 litColor = texColor;if (gLightCount > 0){// Start with a sum of zero.float4 ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// Sum the light contribution from each light source. [unroll]for (int i = 0; i < gLightCount; ++i){float4 A, D, S;ComputeDirectionalLight(gMaterial, gDirLights[i], pin.NormalW, toEye,A, D, S);ambient += A;diffuse += D;spec += S;}// Modulate with late add.litColor = texColor*(ambient + diffuse) + spec;}//// Fogging//if (gFogEnabled){float fogLerp = saturate((distToEye - gFogStart) / gFogRange);// Blend the fog color and the lit color.litColor = lerp(litColor, gFogColor, fogLerp);}// Common to take alpha from diffuse material and texture.litColor.a = gMaterial.Diffuse.a * texColor.a;return litColor; }technique11 Light1 {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, false, false, false)));} }technique11 Light2 {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(2, false, false, false)));} }technique11 Light3 {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(3, false, false, false)));} }technique11 Light0Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(0, true, false, false)));} }technique11 Light1Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, true, false, false)));} }technique11 Light2Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(2, true, false, false)));} }technique11 Light3Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader(gs_5_0, GS()));SetPixelShader(CompileShader(ps_5_0, PS(3, true, false, false)));} }technique11 Light0TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(0, true, true, false)));} }technique11 Light1TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, true, true, false)));} }technique11 Light2TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(2, true, true, false)));} }technique11 Light3TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(3, true, true, false)));} }technique11 Light1Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, false, false, true)));} }technique11 Light2Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader(gs_5_0, GS()));SetPixelShader(CompileShader(ps_5_0, PS(2, false, false, true)));} }technique11 Light3Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(3, false, false, true)));} }technique11 Light0TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(0, true, false, true)));} }technique11 Light1TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, true, false, true)));} }technique11 Light2TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(2, true, false, true)));} }technique11 Light3TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(3, true, false, true)));} }technique11 Light0TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(0, true, true, true)));} }technique11 Light1TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(1, true, true, true)));} }technique11 Light2TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(2, true, true, true)));} }technique11 Light3TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(CompileShader( gs_5_0, GS() ));SetPixelShader(CompileShader(ps_5_0, PS(3, true, true, true)));} }




11.2?

Basic.fx#include "LightHelper.fx"cbuffer cbPerFrame {DirectionalLight gDirLights[3];float3 gEyePosW;float gFogStart;float gFogRange;float4 gFogColor; };cbuffer cbPerObject {float4x4 gWorld;float4x4 gWorldInvTranspose;float4x4 gWorldViewProj;float4x4 gTexTransform;Material gMaterial; };// Nonnumeric values cannot be added to a cbuffer. Texture2D gDiffuseMap;SamplerState samAnisotropic {Filter = ANISOTROPIC;MaxAnisotropy = 4;AddressU = WRAP;AddressV = WRAP; };struct VertexIn {float3 PosL : POSITION;float3 NormalL : NORMAL;float2 Tex : TEXCOORD; };struct VertexOut {float3 PosL : POSITION;float3 NormalL : NORMAL;float2 Tex : TEXCOORD; };struct GeoOut {float4 PosH : SV_POSITION;float3 PosW : POSITION;float3 NormalW : NORMAL;float2 Tex : TEXCOORD;float FogLerp : FOG; };VertexOut VS(VertexIn vin) {VertexOut vout;vout.PosL = vin.PosL;vout.NormalL = vin.NormalL;vout.Tex = vin.Tex;return vout; }void SubdivideZero(VertexOut inVerts[3], out VertexOut outVerts[3]) {outVerts[0] = inVerts[0];outVerts[1] = inVerts[1];outVerts[2] = inVerts[2]; }void Subdivide(VertexOut inVerts[3], out VertexOut outVerts[6]) {VertexOut m[3];// Compute edge midpoints.m[0].PosL = 0.5f*(inVerts[0].PosL + inVerts[1].PosL);m[1].PosL = 0.5f*(inVerts[1].PosL + inVerts[2].PosL);m[2].PosL = 0.5f*(inVerts[2].PosL + inVerts[0].PosL);// Project onto unit spherem[0].PosL = normalize(m[0].PosL);m[1].PosL = normalize(m[1].PosL);m[2].PosL = normalize(m[2].PosL);// Derive normals.m[0].NormalL = m[0].PosL;m[1].NormalL = m[1].PosL;m[2].NormalL = m[2].PosL;// Interpolate texture coordinates.m[0].Tex = 0.5f*(inVerts[0].Tex + inVerts[1].Tex);m[1].Tex = 0.5f*(inVerts[1].Tex + inVerts[2].Tex);m[2].Tex = 0.5f*(inVerts[2].Tex + inVerts[0].Tex);outVerts[0] = inVerts[0];outVerts[1] = m[0];outVerts[2] = m[2];outVerts[3] = m[1];outVerts[4] = inVerts[2];outVerts[5] = inVerts[1]; }void SubdivideTwice(VertexOut inVerts[3], out VertexOut outVerts[15]) {VertexOut m[12];// Compute edge midpoints.m[0].PosL = 0.75f * inVerts[0].PosL + 0.25 * inVerts[2].PosL;m[1].PosL = 0.5f * inVerts[0].PosL + 0.5 * inVerts[2].PosL;m[2].PosL = 0.25f * inVerts[0].PosL + 0.75 * inVerts[2].PosL;m[3].PosL = 0.75f * inVerts[2].PosL + 0.25 * inVerts[1].PosL;m[4].PosL = 0.5f * inVerts[2].PosL + 0.5 * inVerts[1].PosL;m[5].PosL = 0.25f * inVerts[2].PosL + 0.75 * inVerts[1].PosL;m[6].PosL = 0.75f * inVerts[1].PosL + 0.25 * inVerts[0].PosL;m[7].PosL = 0.5f * inVerts[1].PosL + 0.5 * inVerts[0].PosL;m[8].PosL = 0.25f * inVerts[1].PosL + 0.75 * inVerts[0].PosL;m[9].PosL = 0.5f * m[4].PosL + 0.5 * m[7].PosL;m[10].PosL = 0.5f * m[1].PosL + 0.5 * m[7].PosL;m[11].PosL = 0.5f * m[1].PosL + 0.5 * m[4].PosL;// Project onto unit spherem[0].PosL = normalize(m[0].PosL);m[1].PosL = normalize(m[1].PosL);m[2].PosL = normalize(m[2].PosL);m[3].PosL = normalize(m[3].PosL);m[4].PosL = normalize(m[4].PosL);m[5].PosL = normalize(m[5].PosL);m[6].PosL = normalize(m[6].PosL);m[7].PosL = normalize(m[7].PosL);m[8].PosL = normalize(m[8].PosL);m[9].PosL = normalize(m[9].PosL);m[10].PosL = normalize(m[10].PosL);m[11].PosL = normalize(m[11].PosL);// Derive normals.m[0].NormalL = m[0].PosL;m[1].NormalL = m[1].PosL;m[2].NormalL = m[2].PosL;m[3].NormalL = m[3].PosL;m[4].NormalL = m[4].PosL;m[5].NormalL = m[5].PosL;m[6].NormalL = m[6].PosL;m[7].NormalL = m[7].PosL;m[8].NormalL = m[8].PosL;m[9].NormalL = m[9].PosL;m[10].NormalL = m[10].PosL;m[11].NormalL = m[11].PosL;// Interpolate texture coordinates.m[0].Tex = 0.75f * inVerts[0].Tex + 0.25 * inVerts[2].Tex;m[1].Tex = 0.5f * inVerts[0].Tex + 0.5 * inVerts[2].Tex;m[2].Tex = 0.25f * inVerts[0].Tex + 0.75 * inVerts[2].Tex;m[3].Tex = 0.75f * inVerts[2].Tex + 0.25 * inVerts[1].Tex;m[4].Tex = 0.5f * inVerts[2].Tex + 0.5 * inVerts[1].Tex;m[5].Tex = 0.25f * inVerts[2].Tex + 0.75 * inVerts[1].Tex;m[6].Tex = 0.75f * inVerts[1].Tex + 0.25 * inVerts[0].Tex;m[7].Tex = 0.5f * inVerts[1].Tex + 0.5 * inVerts[0].Tex;m[8].Tex = 0.25f * inVerts[1].Tex + 0.75 * inVerts[0].Tex;m[9].Tex = 0.5f * m[4].Tex + 0.5 * m[7].Tex;m[10].Tex = 0.5f * m[1].Tex + 0.5 * m[7].Tex;m[11].Tex = 0.5f * m[1].Tex + 0.5 * m[4].Tex;outVerts[0] = inVerts[0];outVerts[1] = m[0];outVerts[2] = m[1];outVerts[3] = m[2];outVerts[4] = inVerts[2];outVerts[5] = m[3];outVerts[6] = m[4];outVerts[7] = m[5];outVerts[8] = inVerts[1];outVerts[9] = m[6];outVerts[10] = m[7];outVerts[11] = m[8];outVerts[12] = m[9];outVerts[13] = m[10];outVerts[14] = m[11]; }void OutputSubdivisionZero(VertexOut v[3], inout TriangleStream<GeoOut> triStream) {GeoOut gout[3];[unroll]for (int i = 0; i < 3; ++i){// Transorm to world space space.gout[i].PosW = mul(float4(v[i].PosL, 1.0f), gWorld).xyz;gout[i].NormalW = mul(v[i].NormalL, (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.gout[i].PosH = mul(float4(v[i].PosL, 1.0f), gWorldViewProj);gout[i].Tex = v[i].Tex;}[unroll]for (int j = 0; j < 3; ++j){triStream.Append(gout[j]);} }void OutputSubdivision(VertexOut v[6], inout TriangleStream<GeoOut> triStream) {GeoOut gout[6];[unroll]for (int i = 0; i < 6; ++i){// Transorm to world space space.gout[i].PosW = mul(float4(v[i].PosL, 1.0f), gWorld).xyz;gout[i].NormalW = mul(v[i].NormalL, (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.gout[i].PosH = mul(float4(v[i].PosL, 1.0f), gWorldViewProj);gout[i].Tex = v[i].Tex;}[unroll]for (int j = 0; j < 5; ++j){triStream.Append(gout[j]);}triStream.RestartStrip();triStream.Append(gout[1]);triStream.Append(gout[5]);triStream.Append(gout[3]); }void OutputSubdivisionTwice(VertexOut v[15], inout TriangleStream<GeoOut> triStream) {GeoOut gout[15];[unroll]for (int i = 0; i < 15; ++i){// Transorm to world space space.gout[i].PosW = mul(float4(v[i].PosL, 1.0f), gWorld).xyz;gout[i].NormalW = mul(v[i].NormalL, (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.gout[i].PosH = mul(float4(v[i].PosL, 1.0f), gWorldViewProj);gout[i].Tex = v[i].Tex;}triStream.Append(gout[0]);triStream.Append(gout[11]);triStream.Append(gout[1]);triStream.Append(gout[13]);triStream.Append(gout[2]);triStream.Append(gout[14]);triStream.Append(gout[3]);triStream.Append(gout[5]);triStream.Append(gout[4]);triStream.RestartStrip();triStream.Append(gout[11]); triStream.Append(gout[10]);triStream.Append(gout[13]);triStream.Append(gout[12]);triStream.Append(gout[14]);triStream.Append(gout[6]);triStream.Append(gout[5]);triStream.RestartStrip();triStream.Append(gout[10]);triStream.Append(gout[9]);triStream.Append(gout[12]);triStream.Append(gout[7]);triStream.Append(gout[6]);triStream.RestartStrip();triStream.Append(gout[9]);triStream.Append(gout[8]);triStream.Append(gout[7]);}[maxvertexcount(24)] void GS(triangle VertexOut gin[3], inout TriangleStream<GeoOut> triStream) {if (length(gEyePosW) >= 30){VertexOut v[3];SubdivideZero(gin, v);OutputSubdivisionZero(v, triStream);}else if ((length(gEyePosW) >= 15)){VertexOut v[6];Subdivide(gin, v);OutputSubdivision(v, triStream);}else{VertexOut v[15];SubdivideTwice(gin, v);OutputSubdivisionTwice(v, triStream);} }float4 PS(GeoOut pin, uniform int gLightCount, uniform bool gUseTexure, uniform bool gAlphaClip, uniform bool gFogEnabled) : SV_Target {// Interpolating normal can unnormalize it, so normalize it.pin.NormalW = normalize(pin.NormalW);// The toEye vector is used in lighting.float3 toEye = gEyePosW - pin.PosW;// Cache the distance to the eye from this surface point.float distToEye = length(toEye);// Normalize.toEye /= distToEye;// Default to multiplicative identity.float4 texColor = float4(1, 1, 1, 1);if(gUseTexure){// Sample texture.texColor = gDiffuseMap.Sample( samAnisotropic, pin.Tex );if(gAlphaClip){// Discard pixel if texture alpha < 0.1. Note that we do this// test as soon as possible so that we can potentially exit the shader // early, thereby skipping the rest of the shader code.clip(texColor.a - 0.1f);}}//// Lighting.//float4 litColor = texColor;if( gLightCount > 0 ){// Start with a sum of zero.float4 ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// Sum the light contribution from each light source. [unroll]for(int i = 0; i < gLightCount; ++i){float4 A, D, S;ComputeDirectionalLight(gMaterial, gDirLights[i], pin.NormalW, toEye, A, D, S);ambient += A;diffuse += D;spec += S;}// Modulate with late add.litColor = texColor*(ambient + diffuse) + spec;}//// Fogging//if( gFogEnabled ){float fogLerp = saturate( (distToEye - gFogStart) / gFogRange ); // Blend the fog color and the lit color.litColor = lerp(litColor, gFogColor, fogLerp);}// Common to take alpha from diffuse material and texture.litColor.a = gMaterial.Diffuse.a * texColor.a;return litColor; }technique11 Light1 {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader(CompileShader(gs_5_0, GS()));SetPixelShader( CompileShader( ps_5_0, PS(1, false, false, false) ) );} }technique11 Light2 {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, false, false, false) ) );} }technique11 Light3 {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, false, false, false) ) );} }technique11 Light0Tex {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, false, false) ) );} }technique11 Light1Tex {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, false, false) ) );} }technique11 Light2Tex {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, false, false) ) );} }technique11 Light3Tex {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, false, false) ) );} }technique11 Light0TexAlphaClip {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, true, false) ) );} }technique11 Light1TexAlphaClip {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, true, false) ) );} }technique11 Light2TexAlphaClip {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, true, false) ) );} }technique11 Light3TexAlphaClip {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, true, false) ) );} }technique11 Light1Fog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, false, false, true) ) );} }technique11 Light2Fog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, false, false, true) ) );} }technique11 Light3Fog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, false, false, true) ) );} }technique11 Light0TexFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, false, true) ) );} }technique11 Light1TexFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, false, true) ) );} }technique11 Light2TexFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, false, true) ) );} }technique11 Light3TexFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, false, true) ) );} }technique11 Light0TexAlphaClipFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, true, true) ) );} }technique11 Light1TexAlphaClipFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, true, true) ) );} }technique11 Light2TexAlphaClipFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, true, true) ) );} }technique11 Light3TexAlphaClipFog {pass P0{SetVertexShader( CompileShader( vs_5_0, VS() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, true, true) ) );} }

LightHelper.fx //*************************************************************************************** // LightHelper.fx by Frank Luna (C) 2011 All Rights Reserved. // // Structures and functions for lighting calculations. //***************************************************************************************struct DirectionalLight {float4 Ambient;float4 Diffuse;float4 Specular;float3 Direction;float pad; };struct PointLight { float4 Ambient;float4 Diffuse;float4 Specular;float3 Position;float Range;float3 Att;float pad; };struct SpotLight {float4 Ambient;float4 Diffuse;float4 Specular;float3 Position;float Range;float3 Direction;float Spot;float3 Att;float pad; };struct Material {float4 Ambient;float4 Diffuse;float4 Specular; // w = SpecPowerfloat4 Reflect; };//--------------------------------------------------------------------------------------- // Computes the ambient, diffuse, and specular terms in the lighting equation // from a directional light. We need to output the terms separately because // later we will modify the individual terms. //--------------------------------------------------------------------------------------- void ComputeDirectionalLight(Material mat, DirectionalLight L, float3 normal, float3 toEye,out float4 ambient,out float4 diffuse,out float4 spec) {// Initialize outputs.ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// The light vector aims opposite the direction the light rays travel.float3 lightVec = -L.Direction;// Add ambient term.ambient = mat.Ambient * L.Ambient; // Add diffuse and specular term, provided the surface is in // the line of site of the light.float diffuseFactor = dot(lightVec, normal);// Flatten to avoid dynamic branching.[flatten]if( diffuseFactor > 0.0f ){float3 v = reflect(-lightVec, normal);float specFactor = pow(max(dot(v, toEye), 0.0f), mat.Specular.w);diffuse = diffuseFactor * mat.Diffuse * L.Diffuse;spec = specFactor * mat.Specular * L.Specular;} }//--------------------------------------------------------------------------------------- // Computes the ambient, diffuse, and specular terms in the lighting equation // from a point light. We need to output the terms separately because // later we will modify the individual terms. //--------------------------------------------------------------------------------------- void ComputePointLight(Material mat, PointLight L, float3 pos, float3 normal, float3 toEye,out float4 ambient, out float4 diffuse, out float4 spec) {// Initialize outputs.ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// The vector from the surface to the light.float3 lightVec = L.Position - pos;// The distance from surface to light.float d = length(lightVec);// Range test.if( d > L.Range )return;// Normalize the light vector.lightVec /= d; // Ambient term.ambient = mat.Ambient * L.Ambient; // Add diffuse and specular term, provided the surface is in // the line of site of the light.float diffuseFactor = dot(lightVec, normal);// Flatten to avoid dynamic branching.[flatten]if( diffuseFactor > 0.0f ){float3 v = reflect(-lightVec, normal);float specFactor = pow(max(dot(v, toEye), 0.0f), mat.Specular.w);diffuse = diffuseFactor * mat.Diffuse * L.Diffuse;spec = specFactor * mat.Specular * L.Specular;}// Attenuatefloat att = 1.0f / dot(L.Att, float3(1.0f, d, d*d));diffuse *= att;spec *= att; }//--------------------------------------------------------------------------------------- // Computes the ambient, diffuse, and specular terms in the lighting equation // from a spotlight. We need to output the terms separately because // later we will modify the individual terms. //--------------------------------------------------------------------------------------- void ComputeSpotLight(Material mat, SpotLight L, float3 pos, float3 normal, float3 toEye,out float4 ambient, out float4 diffuse, out float4 spec) {// Initialize outputs.ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// The vector from the surface to the light.float3 lightVec = L.Position - pos;// The distance from surface to light.float d = length(lightVec);// Range test.if( d > L.Range )return;// Normalize the light vector.lightVec /= d; // Ambient term.ambient = mat.Ambient * L.Ambient; // Add diffuse and specular term, provided the surface is in // the line of site of the light.float diffuseFactor = dot(lightVec, normal);// Flatten to avoid dynamic branching.[flatten]if( diffuseFactor > 0.0f ){float3 v = reflect(-lightVec, normal);float specFactor = pow(max(dot(v, toEye), 0.0f), mat.Specular.w);diffuse = diffuseFactor * mat.Diffuse * L.Diffuse;spec = specFactor * mat.Specular * L.Specular;}// Scale by spotlight factor and attenuate.float spot = pow(max(dot(-lightVec, L.Direction), 0.0f), L.Spot);// Scale by spotlight factor and attenuate.float att = spot / dot(L.Att, float3(1.0f, d, d*d));ambient *= spot;diffuse *= att;spec *= att; }
Effects.h #ifndef EFFECTS_H #define EFFECTS_H#include "d3dUtil.h"#pragma region Effect class Effect { public:Effect(ID3D11Device* device, const std::wstring& filename);virtual ~Effect();private:Effect(const Effect& rhs);Effect& operator=(const Effect& rhs);protected:ID3DX11Effect* mFX; }; #pragma endregion#pragma region BasicEffect class BasicEffect : public Effect { public:BasicEffect(ID3D11Device* device, const std::wstring& filename);~BasicEffect();void SetWorldViewProj(CXMMATRIX M) { WorldViewProj->SetMatrix(reinterpret_cast<const float*>(&M)); }void SetWorld(CXMMATRIX M) { World->SetMatrix(reinterpret_cast<const float*>(&M)); }void SetWorldInvTranspose(CXMMATRIX M) { WorldInvTranspose->SetMatrix(reinterpret_cast<const float*>(&M)); }void SetTexTransform(CXMMATRIX M) { TexTransform->SetMatrix(reinterpret_cast<const float*>(&M)); }void SetEyePosW(const XMFLOAT3& v) { EyePosW->SetRawValue(&v, 0, sizeof(XMFLOAT3)); }void SetDirLight(const DirectionalLight* lights) { DirLights->SetRawValue(lights, 0, 3 * sizeof(DirectionalLight)); }void SetMatrial(const Material& mat) { Mat->SetRawValue(&mat, 0, sizeof(Material)); }void SetDiffuseMap(ID3D11ShaderResourceView* tex) { DiffuseMap->SetResource(tex); }ID3DX11EffectTechnique* Light1Tech;ID3DX11EffectTechnique* Light2Tech;ID3DX11EffectTechnique* Light3Tech;ID3DX11EffectMatrixVariable* WorldViewProj;ID3DX11EffectMatrixVariable* World;ID3DX11EffectMatrixVariable* WorldInvTranspose;ID3DX11EffectMatrixVariable* TexTransform;ID3DX11EffectVectorVariable* EyePosW;ID3DX11EffectVariable* DirLights;ID3DX11EffectVariable* Mat;ID3DX11EffectShaderResourceVariable* DiffuseMap; }; #pragma endregion#pragma region Effects class Effects { public:static void InitAll(ID3D11Device* device);static void DestroyAll();static BasicEffect* BasicFX; }; #pragma endregion#endif
RenderStates.h #ifndef RENDERSTATES_H #define RENDERSTATES_H#include "d3dUtil.h"class RenderStates { public:static void InitAll(ID3D11Device* device);static void DestroyAll();// Rasterize statesstatic ID3D11RasterizerState* WireframeRS;static ID3D11RasterizerState* NoCullRS;static ID3D11RasterizerState* CullClockwiseRS;// Blend statesstatic ID3D11BlendState* AlphaToCoverageBS;static ID3D11BlendState* TransparentBS;static ID3D11BlendState* NoRenderTargetWritesBS;// Depth/stencil states };#endif
Vertex.h #ifndef VERTEX_H #define VERTEX_H#include "d3dUtil.h"namespace Vertex {// Basic 32-byte vertex structure.struct Basic32{Basic32() : Pos(0.0f, 0.0f, 0.0f), Normal(0.0f, 0.0f, 0.0f), Tex(0.0f, 0.0f) {}Basic32(const XMFLOAT3& p, const XMFLOAT3& n, const XMFLOAT2& uv): Pos(p), Normal(n), Tex(uv) {}Basic32(float px, float py, float pz, float nx, float ny, float nz, float u, float v): Pos(px, py, pz), Normal(nx, ny, nz), Tex(u, v) {}XMFLOAT3 Pos;XMFLOAT3 Normal;XMFLOAT2 Tex;}; }class InputLayoutDesc { public:// Init like const int A::a[4] = {0, 1, 2, 3}; in .cpp file.static const D3D11_INPUT_ELEMENT_DESC Basic32[3];};class InputLayouts { public:static void InitAll(ID3D11Device* device);static void DestroyAll();static ID3D11InputLayout* Basic32; };#endif
Effects.cpp #include "Effects.h"#pragma region Effect Effect::Effect(ID3D11Device* device, const std::wstring& filename): mFX(0) {std::ifstream fin(filename, std::ios::binary);fin.seekg(0, std::ios_base::end);int size = (int)fin.tellg();fin.seekg(0, std::ios_base::beg);std::vector<char> compiledShader(size);fin.read(&compiledShader[0], size);fin.close();HR(D3DX11CreateEffectFromMemory(&compiledShader[0], size,0, device, &mFX)); }Effect::~Effect() {ReleaseCOM(mFX); } #pragma endregion#pragma region BasicEffect BasicEffect::BasicEffect(ID3D11Device* device, const std::wstring& filename) : Effect(device, filename) {Light1Tech = mFX->GetTechniqueByName("Light1");Light2Tech = mFX->GetTechniqueByName("Light2");Light3Tech = mFX->GetTechniqueByName("Light3");WorldViewProj = mFX->GetVariableByName("gWorldViewProj")->AsMatrix();World = mFX->GetVariableByName("gWorld")->AsMatrix();WorldInvTranspose = mFX->GetVariableByName("gWorldInvTranspose")->AsMatrix();TexTransform = mFX->GetVariableByName("gTexTransform")->AsMatrix();EyePosW = mFX->GetVariableByName("gEyePosW")->AsVector();DirLights = mFX->GetVariableByName("gDirLights");Mat = mFX->GetVariableByName("gMaterial");DiffuseMap = mFX->GetVariableByName("gDiffuseMap")->AsShaderResource(); }BasicEffect::~BasicEffect() { } #pragma endregion#pragma region EffectsBasicEffect* Effects::BasicFX = 0;void Effects::InitAll(ID3D11Device* device) {BasicFX = new BasicEffect(device, L"FX/Basic.fxo"); }void Effects::DestroyAll() {SafeDelete(BasicFX); } #pragma endregion
Main.cpp #include "d3dApp.h" #include "d3dx11Effect.h" #include "GeometryGenerator.h" #include "MathHelper.h" #include "Effects.h" #include "Vertex.h" #include "RenderStates.h"enum RenderOptions {Lit = 0,Lit2 = 1, };enum TextureOptions {Wireframe = 0,Color = 1, }; class Icosahedron : public D3DApp { public:Icosahedron(HINSTANCE hInstance);~Icosahedron();bool Init();void OnResize();void UpdateScene(float dt);void DrawScene(); void OnMouseDown(WPARAM btnState, int x, int y);void OnMouseUp(WPARAM btnState, int x, int y);void OnMouseMove(WPARAM btnState, int x, int y);private:void BuildIcosahedronGeometryBuffers();private:ID3D11Buffer* mIcosahedronVB;ID3D11Buffer* mIcosahedronIB;ID3D11ShaderResourceView* mIcosahedronMapSRV;DirectionalLight mDirLights[3];Material mIcosahedronMat;XMFLOAT4X4 mIcosahedronWorld;UINT mIcosahedronIndexCount;XMFLOAT4X4 mView;XMFLOAT4X4 mProj;RenderOptions mRenderOptions;TextureOptions mTexOptions;XMFLOAT3 mEyePosW;float mTheta;float mPhi;float mRadius;POINT mLastMousePos; };int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,PSTR cmdLine, int showCmd) { #if defined(DEBUG) | defined(_DEBUG)_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endifIcosahedron theApp(hInstance);if (!theApp.Init())return 0;return theApp.Run(); }Icosahedron::Icosahedron(HINSTANCE hInstance) : D3DApp(hInstance), mIcosahedronVB(0), mIcosahedronIB(0), mEyePosW(0.0f, 0.0f, 0.0f), mRenderOptions(RenderOptions::Lit), mIcosahedronIndexCount(0), mTheta(1.3f*MathHelper::Pi), mPhi(0.4f*MathHelper::Pi), mRadius(80.0f), mTexOptions(TextureOptions::Color) {mMainWndCaption = L"Icosahedron";mEnable4xMsaa = true;mLastMousePos.x = 0;mLastMousePos.y = 0;XMMATRIX I = XMMatrixIdentity();XMStoreFloat4x4(&mView, I);XMStoreFloat4x4(&mProj, I);XMMATRIX icosahedronScale = XMMatrixScaling(5.0f, 5.0f, 5.0f);XMMATRIX icosahedronOffset = XMMatrixTranslation(0.0f, 0.0f, 0.0f);XMStoreFloat4x4(&mIcosahedronWorld, icosahedronScale*icosahedronOffset);mDirLights[0].Ambient = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);mDirLights[0].Diffuse = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mDirLights[0].Specular = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mDirLights[0].Direction = XMFLOAT3(0.57735f, -0.57735f, 0.57735f);mDirLights[1].Ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[1].Diffuse = XMFLOAT4(0.20f, 0.20f, 0.20f, 1.0f);mDirLights[1].Specular = XMFLOAT4(0.25f, 0.25f, 0.25f, 1.0f);mDirLights[1].Direction = XMFLOAT3(-0.57735f, -0.57735f, 0.57735f);mDirLights[2].Ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[2].Diffuse = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);mDirLights[2].Specular = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[2].Direction = XMFLOAT3(0.0f, -0.707f, -0.707f);mIcosahedronMat.Ambient = XMFLOAT4(0.48f, 0.77f, 0.46f, 1.0f);mIcosahedronMat.Diffuse = XMFLOAT4(0.48f, 0.77f, 0.46f, 1.0f);mIcosahedronMat.Specular = XMFLOAT4(0.2f, 0.2f, 0.2f, 16.0f); }Icosahedron::~Icosahedron() {md3dImmediateContext->ClearState();ReleaseCOM(mIcosahedronVB);ReleaseCOM(mIcosahedronIB);Effects::DestroyAll();InputLayouts::DestroyAll();RenderStates::DestroyAll(); }bool Icosahedron::Init() {if (!D3DApp::Init())return false;Effects::InitAll(md3dDevice);InputLayouts::InitAll(md3dDevice);RenderStates::InitAll(md3dDevice);BuildIcosahedronGeometryBuffers();return true; }void Icosahedron::OnResize() {D3DApp::OnResize();XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathHelper::Pi, AspectRatio(), 1.0f, 1000.0f);XMStoreFloat4x4(&mProj, P); }void Icosahedron::UpdateScene(float dt) {float x = mRadius*sinf(mPhi)*cosf(mTheta);float z = mRadius*sinf(mPhi)*sinf(mTheta);float y = mRadius*cosf(mPhi);mEyePosW = XMFLOAT3(x, y, z);// Build the view matrix.XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);XMVECTOR target = XMVectorZero();XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);XMMATRIX V = XMMatrixLookAtLH(pos, target, up);XMStoreFloat4x4(&mView, V);//// Switch the render mode based in key input//if (GetAsyncKeyState('1') & 0x8000)mRenderOptions = RenderOptions::Lit;if (GetAsyncKeyState('2') & 0x8000)mRenderOptions = RenderOptions::Lit2;if (GetAsyncKeyState('W') & 0x8000)mTexOptions = TextureOptions::Wireframe;if (GetAsyncKeyState('C') & 0x8000)mTexOptions = TextureOptions::Color; }void Icosahedron::DrawScene() {md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::Silver));md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);md3dImmediateContext->IASetInputLayout(InputLayouts::Basic32);md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);XMMATRIX view = XMLoadFloat4x4(&mView);XMMATRIX proj = XMLoadFloat4x4(&mProj);XMMATRIX viewProj = view*proj;Effects::BasicFX->SetEyePosW(mEyePosW);Effects::BasicFX->SetDirLight(mDirLights);//// Figure out which technique to use//ID3DX11EffectTechnique* IcosahedronTech;switch (mRenderOptions){case RenderOptions::Lit:IcosahedronTech = Effects::BasicFX->Light1Tech;break;case RenderOptions::Lit2:IcosahedronTech = Effects::BasicFX->Light2Tech;break;}UINT stride = sizeof(Vertex::Basic32);UINT offset = 0;D3DX11_TECHNIQUE_DESC techDesc;//// DraW the icosahedron.//IcosahedronTech->GetDesc(&techDesc);for (UINT p = 0; p < techDesc.Passes; ++p){md3dImmediateContext->IASetVertexBuffers(0, 1, &mIcosahedronVB, &stride, &offset);md3dImmediateContext->IASetIndexBuffer(mIcosahedronIB, DXGI_FORMAT_R32_UINT, 0);// Set per object constants.XMMATRIX world = XMLoadFloat4x4(&mIcosahedronWorld);XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);XMMATRIX worldViewProj = world*view*proj;Effects::BasicFX->SetWorld(world);Effects::BasicFX->SetWorldInvTranspose(worldInvTranspose);Effects::BasicFX->SetWorldViewProj(worldViewProj);Effects::BasicFX->SetTexTransform(XMMatrixIdentity());Effects::BasicFX->SetMatrial(mIcosahedronMat);//Effects::BasicFX->SetDiffuseMap(mIcosahedronMapSRV);switch (mTexOptions){case TextureOptions::Color:md3dImmediateContext->RSSetState(RenderStates::NoCullRS);break;case TextureOptions::Wireframe:md3dImmediateContext->RSSetState(RenderStates::WireframeRS);break;}IcosahedronTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);md3dImmediateContext->DrawIndexed(mIcosahedronIndexCount, 0, 0);// Restore default render state.md3dImmediateContext->RSSetState(0);}HR(mSwapChain->Present(0, 0)); }void Icosahedron::OnMouseDown(WPARAM btnState, int x, int y) {mLastMousePos.x = x;mLastMousePos.y = y;SetCapture(mhMainWnd); }void Icosahedron::OnMouseUp(WPARAM btnState, int x, int y) {ReleaseCapture(); }void Icosahedron::OnMouseMove(WPARAM btnState, int x, int y) {if ((btnState & MK_LBUTTON) != 0){// Make each pixel correspond to a quater of a degree.float dx = XMConvertToRadians(0.25f*static_cast<float>(x - mLastMousePos.x));float dy = XMConvertToRadians(0.25f*static_cast<float>(y - mLastMousePos.y));// Update angles based on input to orbit camera around box.mTheta += dx;mPhi += dy;// Restric the angle mPhi.mPhi = MathHelper::Clamp(mPhi, 0.1f, MathHelper::Pi - 0.1f);}else if ((btnState & MK_RBUTTON) != 0){// Make each pixel correspond to 0.01 unit in the scene.float dx = 0.1f*static_cast<float>(x - mLastMousePos.x);float dy = 0.1f*static_cast<float>(y - mLastMousePos.y);//Update the camera radius based on inputs.mRadius += dx - dy;// Restrict the radius.mRadius = MathHelper::Clamp(mRadius, 10.0f, 500.0f);}mLastMousePos.x = x;mLastMousePos.y = y; }void Icosahedron::BuildIcosahedronGeometryBuffers() {GeometryGenerator::MeshData icosahedron;GeometryGenerator geoGen;geoGen.CreateGeosphere(1.0f, 0u, icosahedron);//// Extract the vertex elements we are interested in and pack the// vertices of all the meshes into one vertex buffer//std::vector<Vertex::Basic32> vertices(icosahedron.Vertices.size());for (UINT i = 0; i < icosahedron.Vertices.size(); ++i){vertices[i].Pos = icosahedron.Vertices[i].Position;vertices[i].Normal = icosahedron.Vertices[i].Normal;vertices[i].Tex = icosahedron.Vertices[i].TexC;}D3D11_BUFFER_DESC vbd;vbd.Usage = D3D11_USAGE_IMMUTABLE;vbd.ByteWidth = sizeof(Vertex::Basic32) * icosahedron.Vertices.size();vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = 0;vbd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA vinitData;vinitData.pSysMem = &vertices[0];HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mIcosahedronVB));//// Pack the indices of all the meshes into one index buffer.//D3D11_BUFFER_DESC ibd;ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(UINT)* icosahedron.Indices.size(); ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;ibd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = &icosahedron.Indices[0];mIcosahedronIndexCount = icosahedron.Indices.size();HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIcosahedronIB)); }
RenderStates.cpp #include "RenderStates.h"ID3D11RasterizerState* RenderStates::WireframeRS = 0; ID3D11RasterizerState* RenderStates::NoCullRS = 0; ID3D11RasterizerState* RenderStates::CullClockwiseRS = 0;ID3D11BlendState* RenderStates::AlphaToCoverageBS = 0; ID3D11BlendState* RenderStates::TransparentBS = 0; ID3D11BlendState* RenderStates::NoRenderTargetWritesBS = 0;void RenderStates::InitAll(ID3D11Device* device) {//// WireframeRS//D3D11_RASTERIZER_DESC wireframeDesc;ZeroMemory(&wireframeDesc, sizeof(D3D11_RASTERIZER_DESC));wireframeDesc.FillMode = D3D11_FILL_WIREFRAME;wireframeDesc.CullMode = D3D11_CULL_BACK;wireframeDesc.FrontCounterClockwise = false;wireframeDesc.DepthClipEnable = true;HR(device->CreateRasterizerState(&wireframeDesc, &WireframeRS));//// NoCullRS//D3D11_RASTERIZER_DESC noCullDesc;ZeroMemory(&noCullDesc, sizeof(D3D11_RASTERIZER_DESC));noCullDesc.FillMode = D3D11_FILL_SOLID;noCullDesc.CullMode = D3D11_CULL_NONE;noCullDesc.FrontCounterClockwise = false;noCullDesc.DepthClipEnable = true;HR(device->CreateRasterizerState(&noCullDesc, &NoCullRS));//// CullClockwiseRS//// Note: Define such that we still cull backfaces by making front faces CCW.// If we did not cull bacefaces, then we have to worry about the BackFace// property in the D3D11_DEPTH_STENCIL_DESCD3D11_RASTERIZER_DESC cullClockwiseDesc;ZeroMemory(&cullClockwiseDesc, sizeof(D3D11_RASTERIZER_DESC));cullClockwiseDesc.FillMode = D3D11_FILL_SOLID;cullClockwiseDesc.CullMode = D3D11_CULL_BACK;cullClockwiseDesc.FrontCounterClockwise = true;cullClockwiseDesc.DepthClipEnable = true;HR(device->CreateRasterizerState(&cullClockwiseDesc, &CullClockwiseRS));//// AlphaToCoverageBS//D3D11_BLEND_DESC alphaToCoverageDesc = { 0 };alphaToCoverageDesc.AlphaToCoverageEnable = true;alphaToCoverageDesc.IndependentBlendEnable = false;alphaToCoverageDesc.RenderTarget[0].BlendEnable = false;alphaToCoverageDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;HR(device->CreateBlendState(&alphaToCoverageDesc, &AlphaToCoverageBS));//// TransparentBS//D3D11_BLEND_DESC transparentDesc = { 0 };transparentDesc.AlphaToCoverageEnable = false;transparentDesc.IndependentBlendEnable = false;transparentDesc.RenderTarget[0].BlendEnable = true;transparentDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;transparentDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;transparentDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;transparentDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;transparentDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;transparentDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;transparentDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;HR(device->CreateBlendState(&transparentDesc, &TransparentBS));////NoRenderTargetWritesBS//D3D11_BLEND_DESC noRenderTargetWritesDesc = { 0 };noRenderTargetWritesDesc.AlphaToCoverageEnable = false;noRenderTargetWritesDesc.IndependentBlendEnable = false;noRenderTargetWritesDesc.RenderTarget[0].BlendEnable = false;noRenderTargetWritesDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;noRenderTargetWritesDesc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;noRenderTargetWritesDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;noRenderTargetWritesDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;noRenderTargetWritesDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;noRenderTargetWritesDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;noRenderTargetWritesDesc.RenderTarget[0].RenderTargetWriteMask = 0;HR(device->CreateBlendState(&noRenderTargetWritesDesc, &NoRenderTargetWritesBS)); }void RenderStates::DestroyAll() {ReleaseCOM(WireframeRS);ReleaseCOM(NoCullRS);ReleaseCOM(CullClockwiseRS);ReleaseCOM(AlphaToCoverageBS);ReleaseCOM(TransparentBS);ReleaseCOM(NoRenderTargetWritesBS); }
Vertex.cpp #include "Vertex.h" #include "Effects.h"#pragma region InputLayoutDescconst D3D11_INPUT_ELEMENT_DESC InputLayoutDesc::Basic32[3] = {{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 } };#pragma endregion#pragma region InputLayoutsID3D11InputLayout* InputLayouts::Basic32 = 0;void InputLayouts::InitAll(ID3D11Device* device) {D3DX11_PASS_DESC passDesc;//// Basic32//Effects::BasicFX->Light1Tech->GetPassByIndex(0)->GetDesc(&passDesc);HR(device->CreateInputLayout(InputLayoutDesc::Basic32, 3, passDesc.pIAInputSignature,passDesc.IAInputSignatureSize, &Basic32)); }void InputLayouts::DestroyAll() {ReleaseCOM(Basic32); }#pragma endregion







11.3 那個primitiveID用的有點問題,GS的第一個參數用了個數組,所以primitiveID依照數組的第一個元素設置了

void Explosion(VertexOut inVerts[3], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> triStream) {VertexOut explosionVerts[3];GeoOut gout[3];float3 u = inVerts[1].PosL - inVerts[0].PosL;float3 v = inVerts[2].PosL - inVerts[0].PosL;float3 n = cross(u, v);[unroll]for (int i = 0; i < 3; ++i){explosionVerts[i].PosL = inVerts[i].PosL + /*primID * */gScale * gTime * n;// Transorm to world space space.gout[i].PosW = mul(float4(explosionVerts[i].PosL, 1.0f), gWorld).xyz;gout[i].NormalW = mul(normalize(explosionVerts[i].PosL), (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.gout[i].PosH = mul(float4(explosionVerts[i].PosL, 1.0f), gWorldViewProj);gout[i].Tex = inVerts[i].Tex;}[unroll]for (int j = 0; j < 3; ++j){triStream.Append(gout[j]);} }[maxvertexcount(24)] void GS(triangle VertexOut gin[3], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> triStream) {if (length(gEyePosW) >= 30){//VertexOut v[3];//SubdivideZero(gin, v);//OutputSubdivisionZero(v, triStream);Explosion(gin, primID, triStream);}else if ((length(gEyePosW) >= 15)){VertexOut v[6];Subdivide(gin, v);OutputSubdivision(v, triStream);}else{VertexOut v[15];SubdivideTwice(gin, v);OutputSubdivisionTwice(v, triStream);} }

if (GetAsyncKeyState('E') & 0x8000){fExpTimeBase = mTimer.TotalTime();bExplosion = true;}if (GetAsyncKeyState('F') & 0x8000)fScale++; }
Effects::BasicFX->SetExpTime(mExpTime);Effects::BasicFX->SetExplosionScalar(fScale);
和上一題比,代碼變動不大





由于有爆炸效果,所以做了個gif,可能網頁上看不到,下載就能看到

11.4代碼寫的非常亂,變量名設定的也不合適,但還好,效果出來了

//============================================================================= // Basic.fx by Frank Luna (C) 2011 All Rights Reserved. // // Basic effect that currently supports transformations, lighting, and texturing. //=============================================================================#include "LightHelper.fx"cbuffer cbPerFrame {DirectionalLight gDirLights[3];float3 gEyePosW;float gFogStart;float gFogRange;float4 gFogColor; };cbuffer cbPerObject {float4x4 gWorld;float4x4 gWorldInvTranspose;float4x4 gWorldViewProj;float4x4 gTexTransform;Material gMaterial;}; // Nonnumeric values cannot be added to a cbuffer. Texture2D gDiffuseMap;SamplerState samAnisotropic {Filter = ANISOTROPIC;MaxAnisotropy = 4;AddressU = WRAP;AddressV = WRAP; };struct VertexIn {float3 PosL : POSITION;float3 NormalL : NORMAL;float2 Tex : TEXCOORD; };struct VertexOut {float4 PosH : SV_POSITION;float3 PosW : POSITION;float3 NormalW : NORMAL;float2 Tex : TEXCOORD; };struct GeoOut {float4 PosH : SV_POSITION;float3 PosW : POSITION;float3 NormalW : NORMAL;float2 Tex : TEXCOORD; };VertexOut VS(VertexIn vin) {VertexOut vout;// Transform to world space space.vout.PosW = mul(float4(vin.PosL, 1.0f), gWorld).xyz;vout.NormalW = mul(vin.NormalL, (float3x3)gWorldInvTranspose);// Transform to homogeneous clip space.vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);// Output vertex attributes for interpolation across triangle.vout.Tex = mul(float4(vin.Tex, 0.0f, 1.0f), gTexTransform).xy;return vout; }VertexOut VSONE(VertexIn vin) {VertexOut vout;// Transform to world space space.vout.PosW = vin.PosL;vout.NormalW = vin.NormalL;// Transform to homogeneous clip space.vout.PosH = (vin.PosL, 1.0f);// Output vertex attributes for interpolation across triangle.vout.Tex = vin.Tex;return vout; }[maxvertexcount(3)] void GS(point VertexOut gin[1], inout LineStream<GeoOut> lineStream) {GeoOut gout[2];gout[0].PosH = mul(float4(gin[0].PosW, 1.0f), gWorldViewProj);gout[0].PosW = mul(float4(gin[0].PosW, 1.0f), gWorld).xyz;gout[0].NormalW = mul(gin[0].NormalW, (float3x3)gWorldInvTranspose);gout[0].Tex = mul(float4(gin[0].Tex, 0.0f, 1.0f), gTexTransform).xy;gout[1].PosW = mul(float4((gin[0].PosW + gin[0].NormalW), 1.0f), gWorld).xyz;gout[1].NormalW = mul(normalize((gin[0].PosW + gin[0].NormalW)), (float3x3)gWorldInvTranspose);gout[1].PosH = mul(float4((gin[0].PosW + gin[0].NormalW), 1.0f), gWorldViewProj);gout[1].Tex = gout[0].Tex;lineStream.Append(gout[1]);lineStream.Append(gout[0]);}float4 PS(GeoOut pin, uniform int gLightCount, uniform bool gUseTexure, uniform bool gAlphaClip, uniform bool gFogEnabled) : SV_Target {// Interpolating normal can unnormalize it, so normalize it.pin.NormalW = normalize(pin.NormalW);// The toEye vector is used in lighting.float3 toEye = gEyePosW - pin.PosW; // Cache the distance to the eye from this surface point.float distToEye = length(toEye);// Normalize.toEye /= distToEye;// Default to multiplicative identity.float4 texColor = float4(1, 1, 1, 1);if(gUseTexure){// Sample texture.texColor = gDiffuseMap.Sample( samAnisotropic, pin.Tex );if(gAlphaClip){// Discard pixel if texture alpha < 0.1. Note that we do this// test as soon as possible so that we can potentially exit the shader // early, thereby skipping the rest of the shader code.clip(texColor.a - 0.1f);}}//// Lighting.//float4 litColor = texColor;if( gLightCount > 0 ){ // Start with a sum of zero. float4 ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);float4 spec = float4(0.0f, 0.0f, 0.0f, 0.0f);// Sum the light contribution from each light source. [unroll]for(int i = 0; i < gLightCount; ++i){float4 A, D, S;ComputeDirectionalLight(gMaterial, gDirLights[i], pin.NormalW, toEye, A, D, S);ambient += A;diffuse += D;spec += S;}// Modulate with late add.litColor = texColor*(ambient + diffuse) + spec;}//// Fogging//if( gFogEnabled ){float fogLerp = saturate( (distToEye - gFogStart) / gFogRange ); // Blend the fog color and the lit color.litColor = lerp(litColor, gFogColor, fogLerp);}// Common to take alpha from diffuse material and texture.litColor.a = gMaterial.Diffuse.a * texColor.a;return litColor; }technique11 Light1 {pass P0{SetVertexShader( CompileShader( vs_5_0, VSONE() ) );SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, false, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, false, false, false)));} }technique11 Light2 {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, false, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, false, false, false)));} }technique11 Light3 {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, false, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, false, false, false)));} }technique11 Light0Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(0, true, false, false)));} }technique11 Light1Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, true, false, false)));} }technique11 Light2Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, true, false, false)));} }technique11 Light3Tex {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, false, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, true, false, false)));} }technique11 Light0TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, true, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(0, true, true, false)));} }technique11 Light1TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, true, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, true, true, false)));} }technique11 Light2TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, true, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, true, true, false)));} }technique11 Light3TexAlphaClip {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, true, false) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, true, true, false)));} }technique11 Light1Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, false, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, false, false, true)));} }technique11 Light2Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, false, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, false, false, true)));} }technique11 Light3Fog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, false, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, false, false, true)));} }technique11 Light0TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(0, true, false, true)));} }technique11 Light1TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, true, false, true)));} }technique11 Light2TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, true, false, true)));} }technique11 Light3TexFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, false, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, true, false, true)));} }technique11 Light0TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(0, true, true, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(0, true, true, true)));} }technique11 Light1TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(1, true, true, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(1, true, true, true)));} }technique11 Light2TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(2, true, true, true) ) );}pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(2, true, true, true)));} }technique11 Light3TexAlphaClipFog {pass P0{SetVertexShader(CompileShader(vs_5_0, VSONE()));SetGeometryShader( CompileShader(gs_5_0, GS()) );SetPixelShader( CompileShader( ps_5_0, PS(3, true, true, true) ) ); }pass P1{SetVertexShader(CompileShader(vs_5_0, VS()));SetGeometryShader(NULL);SetPixelShader(CompileShader(ps_5_0, PS(3, true, true, true)));} }

//*************************************************************************************** // BlendDemo.cpp by Frank Luna (C) 2011 All Rights Reserved. // // Demonstrates blending, HLSL clip(), and fogging. // // Controls: // Hold the left mouse button down and move the mouse to rotate. // Hold the right mouse button down to zoom in and out. // // Press '1' - Lighting only render mode. // Press '2' - Texture render mode. // Press '3' - Fog render mode. // //***************************************************************************************#include "d3dApp.h" #include "d3dx11Effect.h" #include "GeometryGenerator.h" #include "MathHelper.h" #include "LightHelper.h" #include "Effects.h" #include "Vertex.h" #include "RenderStates.h" #include "Waves.h"enum RenderOptions {Lighting = 0,Textures = 1,TexturesAndFog = 2 };class BlendApp : public D3DApp { public:BlendApp(HINSTANCE hInstance);~BlendApp();bool Init();void OnResize();void UpdateScene(float dt);void DrawScene(); void OnMouseDown(WPARAM btnState, int x, int y);void OnMouseUp(WPARAM btnState, int x, int y);void OnMouseMove(WPARAM btnState, int x, int y);private:float GetHillHeight(float x, float z)const;XMFLOAT3 GetHillNormal(float x, float z)const;void BuildLandGeometryBuffers();void BuildWaveGeometryBuffers();void BuildCrateGeometryBuffers();private:ID3D11Buffer* mLandVB;ID3D11Buffer* mLandIB;ID3D11Buffer* mWavesVB;ID3D11Buffer* mWavesIB;ID3D11Buffer* mBoxVB;ID3D11Buffer* mBoxIB;ID3D11ShaderResourceView* mGrassMapSRV;ID3D11ShaderResourceView* mWavesMapSRV;ID3D11ShaderResourceView* mBoxMapSRV;Waves mWaves;DirectionalLight mDirLights[3];Material mLandMat;Material mWavesMat;Material mBoxMat;XMFLOAT4X4 mGrassTexTransform;XMFLOAT4X4 mWaterTexTransform;XMFLOAT4X4 mLandWorld;XMFLOAT4X4 mWavesWorld;XMFLOAT4X4 mBoxWorld;XMFLOAT4X4 mView;XMFLOAT4X4 mProj;UINT mLandIndexCount;XMFLOAT2 mWaterTexOffset;RenderOptions mRenderOptions;XMFLOAT3 mEyePosW;float mTheta;float mPhi;float mRadius;POINT mLastMousePos; };int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,PSTR cmdLine, int showCmd) {// Enable run-time memory check for debug builds. #if defined(DEBUG) | defined(_DEBUG)_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endifBlendApp theApp(hInstance);if( !theApp.Init() )return 0;return theApp.Run(); }BlendApp::BlendApp(HINSTANCE hInstance) : D3DApp(hInstance), mLandVB(0), mLandIB(0), mWavesVB(0), mWavesIB(0), mBoxVB(0), mBoxIB(0), mGrassMapSRV(0), mWavesMapSRV(0), mBoxMapSRV(0),mWaterTexOffset(0.0f, 0.0f), mEyePosW(0.0f, 0.0f, 0.0f), mLandIndexCount(0), mRenderOptions(RenderOptions::TexturesAndFog),mTheta(1.3f*MathHelper::Pi), mPhi(0.4f*MathHelper::Pi), mRadius(80.0f) {mMainWndCaption = L"Blend Demo";mEnable4xMsaa = false;mLastMousePos.x = 0;mLastMousePos.y = 0;XMMATRIX I = XMMatrixIdentity();XMStoreFloat4x4(&mLandWorld, I);XMStoreFloat4x4(&mWavesWorld, I);XMStoreFloat4x4(&mView, I);XMStoreFloat4x4(&mProj, I);XMMATRIX boxScale = XMMatrixScaling(15.0f, 15.0f, 15.0f);XMMATRIX boxOffset = XMMatrixTranslation(8.0f, 5.0f, -15.0f);XMStoreFloat4x4(&mBoxWorld, boxScale*boxOffset);XMMATRIX grassTexScale = XMMatrixScaling(5.0f, 5.0f, 0.0f);XMStoreFloat4x4(&mGrassTexTransform, grassTexScale);mDirLights[0].Ambient = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);mDirLights[0].Diffuse = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mDirLights[0].Specular = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mDirLights[0].Direction = XMFLOAT3(0.57735f, -0.57735f, 0.57735f);mDirLights[1].Ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[1].Diffuse = XMFLOAT4(0.20f, 0.20f, 0.20f, 1.0f);mDirLights[1].Specular = XMFLOAT4(0.25f, 0.25f, 0.25f, 1.0f);mDirLights[1].Direction = XMFLOAT3(-0.57735f, -0.57735f, 0.57735f);mDirLights[2].Ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[2].Diffuse = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);mDirLights[2].Specular = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);mDirLights[2].Direction = XMFLOAT3(0.0f, -0.707f, -0.707f);mLandMat.Ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mLandMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);mLandMat.Specular = XMFLOAT4(0.2f, 0.2f, 0.2f, 16.0f);mWavesMat.Ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mWavesMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 0.5f);mWavesMat.Specular = XMFLOAT4(0.8f, 0.8f, 0.8f, 32.0f);mBoxMat.Ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);mBoxMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);mBoxMat.Specular = XMFLOAT4(0.4f, 0.4f, 0.4f, 16.0f); }BlendApp::~BlendApp() {md3dImmediateContext->ClearState();ReleaseCOM(mLandVB);ReleaseCOM(mLandIB);ReleaseCOM(mWavesVB);ReleaseCOM(mWavesIB);ReleaseCOM(mBoxVB);ReleaseCOM(mBoxIB);ReleaseCOM(mGrassMapSRV);ReleaseCOM(mWavesMapSRV);ReleaseCOM(mBoxMapSRV);Effects::DestroyAll();InputLayouts::DestroyAll();RenderStates::DestroyAll(); }bool BlendApp::Init() {if(!D3DApp::Init())return false;mWaves.Init(160, 160, 1.0f, 0.03f, 5.0f, 0.3f);// Must init Effects first since InputLayouts depend on shader signatures.Effects::InitAll(md3dDevice);InputLayouts::InitAll(md3dDevice);RenderStates::InitAll(md3dDevice);HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice, L"Textures/grass.dds", 0, 0, &mGrassMapSRV, 0 ));HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice, L"Textures/water2.dds", 0, 0, &mWavesMapSRV, 0 ));HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice, L"Textures/WireFence.dds", 0, 0, &mBoxMapSRV, 0 ));BuildLandGeometryBuffers();BuildWaveGeometryBuffers();BuildCrateGeometryBuffers();return true; }void BlendApp::OnResize() {D3DApp::OnResize();XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathHelper::Pi, AspectRatio(), 1.0f, 1000.0f);XMStoreFloat4x4(&mProj, P); }void BlendApp::UpdateScene(float dt) {// Convert Spherical to Cartesian coordinates.float x = mRadius*sinf(mPhi)*cosf(mTheta);float z = mRadius*sinf(mPhi)*sinf(mTheta);float y = mRadius*cosf(mPhi);mEyePosW = XMFLOAT3(x, y, z);// Build the view matrix.XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);XMVECTOR target = XMVectorZero();XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);XMMATRIX V = XMMatrixLookAtLH(pos, target, up);XMStoreFloat4x4(&mView, V);//// Every quarter second, generate a random wave.//static float t_base = 0.0f;if( (mTimer.TotalTime() - t_base) >= 0.1f ){t_base += 0.1f;DWORD i = 5 + rand() % (mWaves.RowCount()-10);DWORD j = 5 + rand() % (mWaves.ColumnCount()-10);float r = MathHelper::RandF(0.5f, 1.0f);mWaves.Disturb(i, j, r);}mWaves.Update(dt);//// Update the wave vertex buffer with the new solution.//D3D11_MAPPED_SUBRESOURCE mappedData;HR(md3dImmediateContext->Map(mWavesVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData));Vertex::Basic32* v = reinterpret_cast<Vertex::Basic32*>(mappedData.pData);for(UINT i = 0; i < mWaves.VertexCount(); ++i){v[i].Pos = mWaves[i];v[i].Normal = mWaves.Normal(i);// Derive tex-coords in [0,1] from position.v[i].Tex.x = 0.5f + mWaves[i].x / mWaves.Width();v[i].Tex.y = 0.5f - mWaves[i].z / mWaves.Depth();}md3dImmediateContext->Unmap(mWavesVB, 0);//// Animate water texture coordinates.//// Tile water texture.XMMATRIX wavesScale = XMMatrixScaling(5.0f, 5.0f, 0.0f);// Translate texture over time.mWaterTexOffset.y += 0.05f*dt;mWaterTexOffset.x += 0.1f*dt; XMMATRIX wavesOffset = XMMatrixTranslation(mWaterTexOffset.x, mWaterTexOffset.y, 0.0f);// Combine scale and translation.XMStoreFloat4x4(&mWaterTexTransform, wavesScale*wavesOffset);//// Switch the render mode based in key input.//if( GetAsyncKeyState('1') & 0x8000 )mRenderOptions = RenderOptions::Lighting; if( GetAsyncKeyState('2') & 0x8000 )mRenderOptions = RenderOptions::Textures; if( GetAsyncKeyState('3') & 0x8000 )mRenderOptions = RenderOptions::TexturesAndFog; }void BlendApp::DrawScene() {md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::Silver));md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);md3dImmediateContext->IASetInputLayout(InputLayouts::Basic32);//md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);float blendFactor[] = {0.0f, 0.0f, 0.0f, 0.0f};UINT stride = sizeof(Vertex::Basic32);UINT offset = 0;XMMATRIX view = XMLoadFloat4x4(&mView);XMMATRIX proj = XMLoadFloat4x4(&mProj);XMMATRIX viewProj = view*proj;// Set per frame constants.Effects::BasicFX->SetDirLights(mDirLights);Effects::BasicFX->SetEyePosW(mEyePosW);Effects::BasicFX->SetFogColor(Colors::Silver);Effects::BasicFX->SetFogStart(15.0f);Effects::BasicFX->SetFogRange(175.0f);ID3DX11EffectTechnique* boxTech;ID3DX11EffectTechnique* landAndWavesTech;switch(mRenderOptions){case RenderOptions::Lighting:boxTech = Effects::BasicFX->Light3Tech;landAndWavesTech = Effects::BasicFX->Light3Tech;break;case RenderOptions::Textures:boxTech = Effects::BasicFX->Light3TexAlphaClipTech;landAndWavesTech = Effects::BasicFX->Light3TexTech;break;case RenderOptions::TexturesAndFog:boxTech = Effects::BasicFX->Light3TexAlphaClipFogTech;landAndWavesTech = Effects::BasicFX->Light3TexFogTech;break;}D3DX11_TECHNIQUE_DESC techDesc;//// Draw the box with alpha clipping.// boxTech->GetDesc( &techDesc );for(UINT p = 0; p < techDesc.Passes; ++p){if (0 == p){md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);}else{md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);}md3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);md3dImmediateContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);// Set per object constants.XMMATRIX world = XMLoadFloat4x4(&mBoxWorld);XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);XMMATRIX worldViewProj = world*view*proj;Effects::BasicFX->SetWorld(world);Effects::BasicFX->SetWorldInvTranspose(worldInvTranspose);Effects::BasicFX->SetWorldViewProj(worldViewProj);Effects::BasicFX->SetTexTransform(XMMatrixIdentity());Effects::BasicFX->SetMaterial(mBoxMat);Effects::BasicFX->SetDiffuseMap(mBoxMapSRV);md3dImmediateContext->RSSetState(RenderStates::NoCullRS);boxTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);md3dImmediateContext->DrawIndexed(36, 0, 0);// Restore default render state.md3dImmediateContext->RSSetState(0);}//// Draw the hills and water with texture and fog (no alpha clipping needed).//landAndWavesTech->GetDesc( &techDesc );for(UINT p = 0; p < techDesc.Passes; ++p){if (0 == p){md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);}else{md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);}//// Draw the hills.//md3dImmediateContext->IASetVertexBuffers(0, 1, &mLandVB, &stride, &offset);md3dImmediateContext->IASetIndexBuffer(mLandIB, DXGI_FORMAT_R32_UINT, 0);// Set per object constants.XMMATRIX world = XMLoadFloat4x4(&mLandWorld);XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);XMMATRIX worldViewProj = world*view*proj;Effects::BasicFX->SetWorld(world);Effects::BasicFX->SetWorldInvTranspose(worldInvTranspose);Effects::BasicFX->SetWorldViewProj(worldViewProj);Effects::BasicFX->SetTexTransform(XMLoadFloat4x4(&mGrassTexTransform));Effects::BasicFX->SetMaterial(mLandMat);Effects::BasicFX->SetDiffuseMap(mGrassMapSRV);landAndWavesTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);md3dImmediateContext->DrawIndexed(mLandIndexCount, 0, 0);//// Draw the waves.//md3dImmediateContext->IASetVertexBuffers(0, 1, &mWavesVB, &stride, &offset);md3dImmediateContext->IASetIndexBuffer(mWavesIB, DXGI_FORMAT_R32_UINT, 0);// Set per object constants.world = XMLoadFloat4x4(&mWavesWorld);worldInvTranspose = MathHelper::InverseTranspose(world);worldViewProj = world*view*proj;Effects::BasicFX->SetWorld(world);Effects::BasicFX->SetWorldInvTranspose(worldInvTranspose);Effects::BasicFX->SetWorldViewProj(worldViewProj);Effects::BasicFX->SetTexTransform(XMLoadFloat4x4(&mWaterTexTransform));Effects::BasicFX->SetMaterial(mWavesMat);Effects::BasicFX->SetDiffuseMap(mWavesMapSRV);md3dImmediateContext->OMSetBlendState(RenderStates::TransparentBS, blendFactor, 0xffffffff);landAndWavesTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);md3dImmediateContext->DrawIndexed(3*mWaves.TriangleCount(), 0, 0);// Restore default blend statemd3dImmediateContext->OMSetBlendState(0, blendFactor, 0xffffffff);}HR(mSwapChain->Present(0, 0)); }void BlendApp::OnMouseDown(WPARAM btnState, int x, int y) {mLastMousePos.x = x;mLastMousePos.y = y;SetCapture(mhMainWnd); }void BlendApp::OnMouseUp(WPARAM btnState, int x, int y) {ReleaseCapture(); }void BlendApp::OnMouseMove(WPARAM btnState, int x, int y) {if( (btnState & MK_LBUTTON) != 0 ){// Make each pixel correspond to a quarter of a degree.float dx = XMConvertToRadians(0.25f*static_cast<float>(x - mLastMousePos.x));float dy = XMConvertToRadians(0.25f*static_cast<float>(y - mLastMousePos.y));// Update angles based on input to orbit camera around box.mTheta += dx;mPhi += dy;// Restrict the angle mPhi.mPhi = MathHelper::Clamp(mPhi, 0.1f, MathHelper::Pi-0.1f);}else if( (btnState & MK_RBUTTON) != 0 ){// Make each pixel correspond to 0.01 unit in the scene.float dx = 0.1f*static_cast<float>(x - mLastMousePos.x);float dy = 0.1f*static_cast<float>(y - mLastMousePos.y);// Update the camera radius based on input.mRadius += dx - dy;// Restrict the radius.mRadius = MathHelper::Clamp(mRadius, 20.0f, 500.0f);}mLastMousePos.x = x;mLastMousePos.y = y; }float BlendApp::GetHillHeight(float x, float z)const {return 0.3f*( z*sinf(0.1f*x) + x*cosf(0.1f*z) ); }XMFLOAT3 BlendApp::GetHillNormal(float x, float z)const {// n = (-df/dx, 1, -df/dz)XMFLOAT3 n(-0.03f*z*cosf(0.1f*x) - 0.3f*cosf(0.1f*z),1.0f,-0.3f*sinf(0.1f*x) + 0.03f*x*sinf(0.1f*z));XMVECTOR unitNormal = XMVector3Normalize(XMLoadFloat3(&n));XMStoreFloat3(&n, unitNormal);return n; }void BlendApp::BuildLandGeometryBuffers() {GeometryGenerator::MeshData grid;GeometryGenerator geoGen;geoGen.CreateGrid(160.0f, 160.0f, 50, 50, grid);mLandIndexCount = grid.Indices.size();//// Extract the vertex elements we are interested and apply the height function to// each vertex. //std::vector<Vertex::Basic32> vertices(grid.Vertices.size());for(UINT i = 0; i < grid.Vertices.size(); ++i){XMFLOAT3 p = grid.Vertices[i].Position;p.y = GetHillHeight(p.x, p.z);vertices[i].Pos = p;vertices[i].Normal = GetHillNormal(p.x, p.z);vertices[i].Tex = grid.Vertices[i].TexC;}D3D11_BUFFER_DESC vbd;vbd.Usage = D3D11_USAGE_IMMUTABLE;vbd.ByteWidth = sizeof(Vertex::Basic32) * grid.Vertices.size();vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = 0;vbd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA vinitData;vinitData.pSysMem = &vertices[0];HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mLandVB));//// Pack the indices of all the meshes into one index buffer.//D3D11_BUFFER_DESC ibd;ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(UINT) * mLandIndexCount;ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;ibd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = &grid.Indices[0];HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mLandIB)); }void BlendApp::BuildWaveGeometryBuffers() {// Create the vertex buffer. Note that we allocate space only, as// we will be updating the data every time step of the simulation.D3D11_BUFFER_DESC vbd;vbd.Usage = D3D11_USAGE_DYNAMIC;vbd.ByteWidth = sizeof(Vertex::Basic32) * mWaves.VertexCount();vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;vbd.MiscFlags = 0;HR(md3dDevice->CreateBuffer(&vbd, 0, &mWavesVB));// Create the index buffer. The index buffer is fixed, so we only // need to create and set once.std::vector<UINT> indices(3*mWaves.TriangleCount()); // 3 indices per face// Iterate over each quad.UINT m = mWaves.RowCount();UINT n = mWaves.ColumnCount();int k = 0;for(UINT i = 0; i < m-1; ++i){for(DWORD j = 0; j < n-1; ++j){indices[k] = i*n+j;indices[k+1] = i*n+j+1;indices[k+2] = (i+1)*n+j;indices[k+3] = (i+1)*n+j;indices[k+4] = i*n+j+1;indices[k+5] = (i+1)*n+j+1;k += 6; // next quad}}D3D11_BUFFER_DESC ibd;ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(UINT) * indices.size();ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;ibd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = &indices[0];HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mWavesIB)); }void BlendApp::BuildCrateGeometryBuffers() {GeometryGenerator::MeshData box;GeometryGenerator geoGen;geoGen.CreateBox(1.0f, 1.0f, 1.0f, box);//// Extract the vertex elements we are interested in and pack the// vertices of all the meshes into one vertex buffer.//std::vector<Vertex::Basic32> vertices(box.Vertices.size());for(UINT i = 0; i < box.Vertices.size(); ++i){vertices[i].Pos = box.Vertices[i].Position;vertices[i].Normal = box.Vertices[i].Normal;vertices[i].Tex = box.Vertices[i].TexC;}D3D11_BUFFER_DESC vbd;vbd.Usage = D3D11_USAGE_IMMUTABLE;vbd.ByteWidth = sizeof(Vertex::Basic32) * box.Vertices.size();vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = 0;vbd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA vinitData;vinitData.pSysMem = &vertices[0];HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB));//// Pack the indices of all the meshes into one index buffer.//D3D11_BUFFER_DESC ibd;ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(UINT) * box.Indices.size();ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;ibd.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = &box.Indices[0];HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mBoxIB)); }



11.6-11.7注意那個DrawIndexed要自己create index buffer,由于是改原有代碼,所以也沒貼代碼,還有要注意的是那個紋理地址越界時開始幾個紋理太小了,可能以為全部紋理都一樣,事實上不是的,細致看前四個小樹,是有差別的

轉載于:https://www.cnblogs.com/hrhguanli/p/3806265.html

總結

以上是生活随笔為你收集整理的Introdution to 3D Game Programming With DirectX11 第11章 习题解答的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲午夜久久久久久久久电影网 | 久久久www成人免费精品 | 婷婷色婷婷| 99中文视频在线 | 久久人人看 | 99久久精品国 | 天天插视频 | 成人免费观看视频大全 | 亚洲成a人片综合在线 | 最新av免费在线观看 | 三级黄色片在线观看 | 久久综合精品一区 | 国产精品视频在线观看 | 久草资源免费 | 狠狠色丁香久久综合网 | 国产成人精品一区二区三区在线 | 成人动图| 色97在线 | 日韩精品一区二区三区丰满 | 久久综合久久久久88 | 自拍超碰在线 | 久99久中文字幕在线 | 精品视频久久 | 97超在线视频 | 中文字幕一区二区三区视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲毛片在线观看. | 国产一区二区在线免费播放 | 一区二区三区中文字幕在线观看 | 欧美一区二区三区在线看 | 欧美日韩国产免费视频 | av在线播放观看 | 成人毛片100免费观看 | 91大神精品视频在线观看 | 在线免费av播放 | 99视频久久 | 激情丁香 | 日本丶国产丶欧美色综合 | 日韩黄色大片在线观看 | 久久精品直播 | 亚洲国产日韩一区 | 一区二区久久久久 | 麻豆系列在线观看 | 伊人色**天天综合婷婷 | 中文字幕亚洲在线观看 | 日本中文字幕网 | 久久久久综合精品福利啪啪 | 91精品综合| 亚洲成人免费在线 | 国产淫a | 亚洲日本色 | 久久精品99国产精品 | 欧美一级免费片 | 久久久久成人精品免费播放动漫 | 高清av网 | 91你懂的 | 婷婷久久一区二区三区 | 在线有码中文字幕 | 激情综合六月 | 五月激情亚洲 | 久久精品一二三区白丝高潮 | 国产在线观看午夜 | 成人国产精品入口 | 国产一区二区三区高清播放 | 爱情影院aqdy鲁丝片二区 | 999抗病毒口服液 | 人人爽人人香蕉 | 在线观看视频国产一区 | 黄色免费看片网站 | 免费a视频 | 久草www | 蜜臀久久99精品久久久无需会员 | 奇米7777狠狠狠琪琪视频 | 亚洲欧洲av在线 | 亚洲视频精品 | 国产一区久久久 | 亚洲视频www | 91九色蝌蚪视频 | 久久国产精品一区二区三区四区 | 西西444www大胆高清图片 | 久久精品视频免费观看 | 欧美一区免费观看 | 免费av在线网站 | 天天插综合网 | 日韩免费高清 | 久久在视频 | 色婷五月天 | 伊人久久国产精品 | 99re视频在线观看 | 国产精品成人一区二区三区吃奶 | 国产视| 激情网站免费观看 | 成人av直播| 日韩城人在线 | 欧美91精品久久久久国产性生爱 | 伊甸园av在线 | 日韩精品视频免费专区在线播放 | 国产无限资源在线观看 | 91在线porny国产在线看 | 在线播放国产一区二区三区 | 黄a在线观看| 一区二区三区在线免费观看 | 日韩在线观看一区 | 色五月成人 | 中文字幕 国产精品 | 久久久亚洲麻豆日韩精品一区三区 | 9在线观看免费高清完整版在线观看明 | 精品久久久久一区二区国产 | 国内久久久久 | 黄色视屏免费在线观看 | 国产中文字幕91 | 丁香花中文在线免费观看 | 88av视频 | www欧美xxxx| 国产在线精品一区二区三区 | 国产在线精品播放 | 亚洲精品综合在线 | 狠狠色丁香婷婷综合久小说久 | 青草视频免费观看 | 欧美成人影音 | 日韩在线播放av | 久久免费看av| 六月丁香激情综合 | 国产一区在线视频播放 | 91av电影在线 | 久草精品在线 | 亚洲乱码久久 | 黄色精品网站 | 成年人视频在线免费播放 | 久草新在线| 黄色大片日本 | 337p欧美| 91综合久久一区二区 | www.黄色片网站 | 国产精品女同一区二区三区久久夜 | 欧美日韩另类在线观看 | 粉嫩av一区二区三区四区 | 久久精品1区2区 | 日韩簧片在线观看 | 久久黄色小说视频 | 91黄色在线视频 | 99热这里只有精品久久 | 精品国产一区二区三区四 | 欧美激情精品久久久久久免费印度 | av免费在线网站 | 91精品1区| 中文字幕资源站 | 最近中文字幕在线播放 | 久久午夜电影网 | 免费av看片 | 久久久人 | 久久久久久久久影院 | 国产精品午夜久久 | 久久人人爽人人爽 | 亚洲码国产日韩欧美高潮在线播放 | 国产又粗又硬又长又爽的视频 | 日韩视频一区二区在线 | 91在线播放国产 | 99视频国产在线 | 久久高清国产视频 | 婷婷播播网 | 成人在线一区二区 | 国产高清绿奴videos | 午夜视频免费播放 | 在线观看激情av | 日韩欧美在线视频一区二区三区 | 久久视频在线观看中文字幕 | 国产 日韩 欧美 中文 在线播放 | 中文有码在线 | 日韩在线免费视频 | 欧美日韩在线视频一区 | 亚洲精品福利视频 | 成人在线视频在线观看 | 日本高清久久久 | 国产在线视频一区 | 国产亚洲精品成人av久久ww | 国产一二区在线观看 | 午夜精品麻豆 | 成年人免费看片 | 日韩91av | 日本黄色免费在线 | 亚洲精品一区二区三区在线观看 | 欧美资源在线观看 | 国产精品国产三级国产不产一地 | 亚洲一区免费在线 | 91丨九色丨蝌蚪丰满 | 亚洲精品国偷拍自产在线观看 | 欧美在线观看视频一区二区三区 | 国产精品免费在线 | 亚洲va韩国va欧美va精四季 | 天天爱av导航 | 色99色 | 久久综合之合合综合久久 | 日韩爱爱网站 | 精品亚洲视频在线 | 人人揉人人揉人人揉人人揉97 | 99热日本 | 中文字幕在线视频国产 | 精品国产乱码久久久久久1区2匹 | 在线视频在线观看 | 成人亚洲精品国产www | 超级碰99| 成人亚洲免费 | 亚洲精品综合一区二区 | 日韩视频免费在线观看 | 免费亚洲精品 | 一区二区三区在线免费播放 | 五月婷婷激情网 | 久久久久国产a免费观看rela | 色偷偷88欧美精品久久久 | 亚洲激情小视频 | 免费在线成人av电影 | 免费在线观看不卡av | 国产一区二区三区免费观看视频 | 色偷偷男人的天堂av | 9999激情| 17videosex性欧美 | 成x99人av在线www| 91麻豆文化传媒在线观看 | 99一区二区三区 | 黄色aaa毛片 | 99热官网| 天天舔天天射天天操 | av在线播放中文字幕 | 国产一区自拍视频 | 久久久久久高潮国产精品视 | 欧美一级黄色网 | 播五月婷婷 | 久久视影 | 丝袜美女视频网站 | 日韩电影一区二区三区在线观看 | 国产精品麻豆果冻传媒在线播放 | 97精品久久 | 国产婷婷 | 成人宗合网 | 欧美日韩高清一区二区三区 | www九九热 | 麻豆超碰 | 96精品高清视频在线观看软件特色 | 免费 在线 中文 日本 | 免费大片黄在线 | 亚洲精品免费观看视频 | 精品久久五月天 | 婷婷 中文字幕 | 免费成人黄色av | 成人免费av电影 | 久久人人爽人人片 | 日韩中文字幕一区 | 日韩电影在线观看一区 | 久久不射网站 | 亚洲 欧洲 国产 精品 | 不卡中文字幕在线 | 国产韩国日本高清视频 | 久久久久一区二区三区四区 | 亚洲精品一区二区三区高潮 | 亚洲理论片 | 91精品国产99久久久久 | 国产91电影在线观看 | 麻豆国产视频 | 麻豆传媒视频在线免费观看 | 国产精品久久久久久久久费观看 | 久久精品久久精品久久精品 | 天堂av在线免费 | 精品国产一二三 | 亚洲一区美女视频在线观看免费 | 成人av教育 | 国产一卡二卡在线 | 欧美色一色 | 视频福利在线 | 麻豆手机在线 | av视屏在线 | 国产精品国产三级国产aⅴ入口 | 天天操夜夜操国产精品 | 久久国内精品 | 久久久久99精品成人片三人毛片 | 日本动漫做毛片一区二区 | 最近2019年日本中文免费字幕 | a级国产乱理论片在线观看 伊人宗合网 | 播五月综合 | 91av网站在线观看 | 国产精品高清在线观看 | 国产在线美女 | 色综合婷婷久久 | 深夜免费福利在线 | 夜夜躁狠狠躁日日躁视频黑人 | 人人澡人| 在线看日韩 | 婷婷亚洲综合五月天小说 | 中文字幕av电影下载 | 在线国产一区二区三区 | 在线观看黄色的网站 | 成年人免费观看国产 | 久久久久国产免费免费 | 91麻豆精品国产自产在线游戏 | 国产精品一区二区三区免费看 | 欧美黄在线 | 国产成人精品女人久久久 | 夜夜夜夜爽 | 久久在视频 | 深夜福利视频在线观看 | 99热日本 | 午夜美女av | 久久久久久久久久久福利 | 欧美日韩免费一区二区三区 | 国产黄色片久久 | 园产精品久久久久久久7电影 | 五月激情姐姐 | 婷婷激情综合网 | 亚洲黄色在线播放 | 开心激情久久 | 99精品国产视频 | 色九九视频 | 精品亚洲成a人在线观看 | 亚洲少妇自拍 | 黄色av网站在线观看免费 | 99av国产精品欲麻豆 | 欧美污在线观看 | 国产成视频在线观看 | 日韩中文字幕免费在线播放 | 国产亚洲婷婷 | 亚洲区二区 | 国产一区高清在线观看 | 亚洲三级在线免费观看 | 又污又黄网站 | 一区二区三区在线免费观看视频 | 国产va精品免费观看 | 成人a视频片观看免费 | 亚洲成人高清在线 | 成人网页在线免费观看 | 九9热这里真品2 | 国产精品久久久久aaaa九色 | 中文字幕乱偷在线 | 亚洲免费国产 | 国产精品普通话 | 999国内精品永久免费视频 | 久久免费视频这里只有精品 | 日韩在线免费视频 | www五月婷婷 | 国产3p视频| 日韩一区二区三区高清免费看看 | 亚洲在线网址 | 久久久久福利视频 | 黄色片网站免费 | 欧美日韩久久久 | 国产精品国产亚洲精品看不卡15 | 天天干夜夜操视频 | 亚洲精品99久久久久久 | 中文字幕在线乱 | 国产精品精品国产色婷婷 | 在线看毛片网站 | 一级性生活片 | 日韩在线高清视频 | 国产无限资源在线观看 | 91污污视频在线观看 | 国产精品视频一二三 | 少妇bbb搡bbbb搡bbbb | 日本中文字幕在线看 | 国产免费黄视频在线观看 | 亚洲自拍偷拍色图 | 91看片在线观看 | 18久久久| 久久激情婷婷 | 精品欧美一区二区三区久久久 | 在线a人片免费观看视频 | 成人免费网站视频 | 国产精品久久久久高潮 | 日本精品久久久久中文字幕 | 国内精品久久久久影院男同志 | 99爱这里只有精品 | 黄色av网站在线免费观看 | 久久影院中文字幕 | 久久伊人91| 免费av网址在线观看 | 国产精品久久久av | 在线观看国产日韩欧美 | 一区二区三区免费在线 | 天天曰天天爽 | 免费久久久久久 | 在线观看视频中文字幕 | 亚洲dvd| 69久久99精品久久久久婷婷 | 欧美极品在线播放 | 日韩一二区在线观看 | 亚洲精品午夜视频 | 精品视频免费观看 | 久久婷亚洲五月一区天天躁 | 久久国产精品久久w女人spa | 国产a国产a国产a | 国产精品mv| 国产精品美女久久久久久久 | 亚洲精品18p | 五月激情天 | 国产精品资源在线观看 | 91插插影库 | 久久久久亚洲精品中文字幕 | 免费成人在线观看视频 | 亚洲另类人人澡 | 亚洲精品成人网 | 一区二区伦理电影 | 瑞典xxxx性hd极品 | 999成人免费视频 | 天堂av在线网站 | 久久在线精品 | 国产最新福利 | 欧美一级片在线播放 | 国产a视频免费观看 | 麻豆免费视频网站 | 天天射天天干天天操 | 国产成人av免费在线观看 | 在线免费观看视频a | 91看片淫黄大片一级在线观看 | 午夜性生活 | www色片 | 中文字幕丰满人伦在线 | 在线免费观看黄色 | 国产一区成人在线 | 亚洲欧洲av在线 | 国产黄色免费 | 天天操天天射天天操 | 日本久久久久久久久久 | 天天艹 | 91在线视频观看 | 国产资源精品在线观看 | 综合在线亚洲 | 亚洲精品小区久久久久久 | 精品久久久久久久久中文字幕 | 欧美一二三区在线观看 | 久久永久免费视频 | 人人草天天草 | 亚洲九九九在线观看 | 黄色软件大全网站 | 国产美女精品视频免费观看 | 日韩系列在线 | 亚洲精品乱码久久久久久蜜桃不爽 | 成人动漫一区二区 | 国产精品第一页在线 | 久久久久久欧美二区电影网 | 国产精品久久久久久久久久免费看 | 国产高清不卡一区二区三区 | www.黄色片网站 | 欧美激情一区不卡 | 国产 在线 高清 精品 | 中文字幕成人av | 国产精品高清一区二区三区 | 亚洲精品免费播放 | 一级免费黄色 | 国产亚洲精品v | 黄色一级大片在线免费看产 | 日b黄色片 | 91综合在线| 激情久久网| 亚洲国产中文字幕在线 | 91精品啪在线观看国产 | 亚洲免费观看在线视频 | 综合久久精品 | 亚洲国产美女精品久久久久∴ | 中文字幕在线观看视频一区 | 免费又黄又爽 | 亚洲婷婷网| 中文字幕第一页在线播放 | 亚洲国产色一区 | 水蜜桃亚洲一二三四在线 | 在线观看黄色大片 | 国产 视频 高清 免费 | 婷婷在线视频观看 | 国产又粗又猛又黄又爽视频 | 九九九九九精品 | 97天天综合网 | 99热在线看 | 在线观看免费福利 | 欧美 亚洲 另类 激情 另类 | 欧美va天堂在线电影 | 四虎成人在线 | 在线免费观看成人 | 免费黄色av电影 | 手机在线免费av | 91在线亚洲| 国产伦精品一区二区三区在线 | 国产美女免费视频 | 丁香婷婷综合色啪 | 久久久网站 | 国产亚洲精品中文字幕 | 97综合网 | 婷婷五天天在线视频 | 手机看国产毛片 | 久久影院午夜论 | 国产一区二区久久 | 亚洲精品国精品久久99热一 | 日韩视频免费在线观看 | 伊人国产视频 | a级国产乱理伦片在线观看 亚洲3级 | 国内精品免费 | 久久99国产精品二区护士 | 国产高清在线免费观看 | 狠狠色狠狠色 | 国产破处精品 | 国产视频精品久久 | 国产精品免费久久久 | 91精品对白一区国产伦 | 亚洲综合网站在线观看 | 国产五月色婷婷六月丁香视频 | 国产日韩欧美在线播放 | 国产亚洲免费观看 | 欧美日韩亚洲在线观看 | 97色涩| 人人玩人人添人人澡97 | 日韩精品视频在线免费观看 | 麻豆va一区二区三区久久浪 | 欧美一区二区免费在线观看 | 久久人网| 久久99国产精品视频 | 国产日产精品一区二区三区四区的观看方式 | 九九久久久| 欧美性受极品xxxx喷水 | 天天干天天操天天射 | 午夜精品久久久久久久99水蜜桃 | 免费aa大片| 日韩欧美视频免费看 | 综合网天天色 | 天天插天天操天天干 | 香蕉网址 | av免费黄色 | www.一区二区三区 | 欧美亚洲久久 | 在线视频 区 | 亚洲天堂色婷婷 | 美女网站色| 精品久久久久久国产偷窥 | 久草精品免费 | 亚洲一级免费电影 | 日本一区二区免费在线观看 | 成人免费在线观看电影 | 麻豆传媒视频观看 | 欧美中文字幕久久 | 国产一区二区电影在线观看 | 久久综合久久伊人 | 成人免费在线电影 | 中文字幕激情 | 东方av免费在线观看 | 日韩在线观看中文 | www.超碰97.com | 中文视频在线看 | 日韩精品亚洲专区在线观看 | 中文字幕在线观看完整版电影 | 在线免费av网站 | 欧美日韩免费观看一区二区三区 | 中文字幕在线免费观看视频 | 69国产盗摄一区二区三区五区 | 国产午夜一区二区 | 视频三区在线 | 中文字幕电影高清在线观看 | 国产一区二区网址 | 日韩一区二区三免费高清在线观看 | 欧美一区二区在线看 | 天天操夜夜爱 | 亚洲精品综合一区二区 | 4438全国亚洲精品观看视频 | 日韩一二三区不卡 | 免费久久网 | 91精品国产91久久久久久三级 | 久久综合九九 | a天堂在线看 | 91色国产在线 | 国产破处在线播放 | 天天干,天天插 | 亚洲尺码电影av久久 | 国产色久 | 国产精品欧美精品 | 欧美日性视频 | 在线观看免费一级片 | 久草在线最新视频 | 免费看黄的 | 激情综合网色播五月 | 色婷婷电影网 | 亚洲激情小视频 | 狠狠狠色丁香综合久久天下网 | 久久这里只有精品23 | 狠狠色丁香婷婷综合欧美 | 韩国三级av在线 | 亚洲三级黄 | 97视频免费在线看 | 日韩黄色在线 | 青草视频在线看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 天天天综合网 | 看全黄大色黄大片 | 亚洲精品视频国产 | 欧美亚洲一级片 | 久久精品综合网 | 久久亚洲福利视频 | 人人舔人人插 | 国产亚洲精品精品精品 | 激情丁香 | 三级av中文字幕 | 国产成人99av超碰超爽 | 黄色免费网站 | 免费黄a| 国产精品手机在线观看 | 97在线资源| 亚洲欧美乱综合图片区小说区 | 久久视频一区二区 | 婷婷5月色 | 99精品国产福利在线观看免费 | 一本一本久久aa综合精品 | 久久久高清一区二区三区 | 美女国产 | 日韩在线观看视频网站 | 久久久久久免费毛片精品 | 一区二区三区四区五区在线 | 中文字幕 影院 | 久久综合精品国产一区二区三区 | 91免费看片黄 | 91探花视频 | 最新国产中文字幕 | 国产精品视频 | 国模精品一区二区三区 | 久久免费精品 | 日韩精品一区二区在线观看视频 | 国产99久久精品一区二区300 | 久久成人久久 | 亚州av一区 | 91网免费看 | 波多野结衣视频在线 | 日韩免费一区 | 婷婷伊人综合 | 色婷婷av国产精品 | 国产福利一区二区三区在线观看 | 波多在线视频 | 国产精品手机在线 | 在线播放日韩av | 国产色啪 | 欧美九九九 | 日韩二区精品 | 99免费在线观看 | 国产人成在线视频 | 日日夜夜av | 97在线观 | 国产在线日韩 | 免费看久久久 | 国产精品一区二区三区视频免费 | 亚洲国产欧美在线人成大黄瓜 | 91在线免费播放视频 | 欧美日韩精品在线观看视频 | 国产精品99精品 | www亚洲一区 | 99在线热播精品免费 | 人人操日日干 | 色综合天天天天做夜夜夜夜做 | 成人a在线观看 | 亚洲综合视频网 | 91免费高清观看 | 国产视频一区二区三区在线 | 综合久久久久 | 日本中文乱码卡一卡二新区 | 国产精品99久久久久久大便 | 亚洲日本欧美在线 | 91成年人网站 | 五月婷婷一区 | 日本中文乱码卡一卡二新区 | 在线观看中文字幕第一页 | 99视频在线免费观看 | 又粗又长又大又爽又黄少妇毛片 | 日日日视频| 欧美日韩在线播放一区 | 久草9视频 | 日韩精品第1页 | 免费在线一区二区 | 97成人免费 | 久久色亚洲 | 在线播放国产一区二区三区 | 成人av免费看 | 久草视频在线看 | 黄色免费网站下载 | 国产精品久久久久久久久久不蜜月 | 在线观看av黄色 | 欧美激情视频在线免费观看 | 国产成人综合图片 | 国产精品视频最多的网站 | av在线直接看 | av免费在线观看1 | 91在线视频观看免费 | 国产精品久久久久久久久久了 | 手机色站 | 正在播放国产一区 | 国产在线精品一区二区三区 | 91视频首页 | 亚洲精区二区三区四区麻豆 | 91在线视频在线观看 | 麻豆果冻剧传媒在线播放 | 欧美久久久久久久久久久久久 | 国产涩涩网站 | 久草视频精品 | av一级久久 | 久久精品久久精品久久精品 | 欧美日韩网站 | www免费| 亚洲日本一区二区在线 | 久久看毛片 | 激情欧美xxxx | 日韩试看 | 婷婷激情综合 | 国产一区二区三区在线免费观看 | 欧美日韩网站 | 久草免费看 | 国产一级淫片在线观看 | 视频91在线| 91伊人久久大香线蕉蜜芽人口 | 少妇超碰在线 | 激情欧美丁香 | 精品久久网| 六月激情 | 开心激情五月婷婷 | 国产一级在线播放 | 天天爱综合| 亚洲综合小说 | 国产成人av网址 | 超碰人在线 | 制服丝袜亚洲 | 国产精品www | 亚洲精品一区二区网址 | 日韩高清不卡一区二区三区 | 久久香蕉国产 | 激情综合电影网 | 国产精品毛片一区 | 免费三级骚 | 黄色影院在线免费观看 | 香蕉影院在线播放 | 日韩成人欧美 | 国产精品午夜免费福利视频 | 激情综合六月 | av高清一区二区三区 | 欧美一区中文字幕 | 黄色成年片 | 99精品免费在线观看 | 久久精品国产亚洲aⅴ | 国产资源在线免费观看 | 中国一 片免费观看 | 一级片免费观看视频 | 91精品视频一区 | 国产亚洲精品美女 | 夜夜骑天天操 | 成人欧美一区二区三区黑人麻豆 | 亚洲黄色在线看 | 黄在线免费观看 | 久草精品电影 | 国产在线观看一区 | 国产成人久 | 久久久网址 | 国产精品一区二区在线观看 | av免费在线观看1 | 亚洲精品国产品国语在线 | 成人av免费在线播放 | 97免费在线视频 | 黄色大片免费网站 | 久久香蕉电影网 | 2024国产在线 | 国产精品igao视频网入口 | 久久久69| 免费在线播放视频 | 国产成人精品日本亚洲999 | 久久综合九色综合欧美狠狠 | 天天干,天天操,天天射 | 亚洲男人天堂2018 | 国产成人精品区 | 国内久久看 | 中文字幕欧美日韩va免费视频 | 欧美日韩国产亚洲乱码字幕 | 91久久一区二区 | 超级碰碰碰视频 | 91精品视频网站 | 91在线小视频 | 婷婷精品进入 | 国产精品a级 | 日韩在线观看一区二区 | av高清一区二区三区 | 久草在线最新 | 在线免费视频 你懂得 | 久久久久久久电影 | 超碰国产97| 国产精品久久99精品毛片三a | 亚洲日日夜夜 | 国产精品自在线 | 国产欧美三级 | 在线观看av网站 | 成人一级免费视频 | 麻豆精品视频在线 | 国产破处在线视频 | 在线蜜桃视频 | 亚洲首页 | 国产精品午夜av | 成人久久 | 欧美一二区在线 | 六月激情 | 国产精选在线观看 | 美女视频黄频大全免费 | 欧美日韩精品在线观看 | 免费色av | 国产在线播放一区二区三区 | 国产五月婷 | 手机在线永久免费观看av片 | 精品视频一区在线观看 | 免费国产一区二区 | 色视频一区 | 人人澡人人澡人人 | 天天做日日做天天爽视频免费 | 国产99久久久国产 | 成片视频在线观看 | 欧美激情视频一区 | 久久这里精品视频 | 日韩av网址在线 | 亚洲视频免费在线观看 | 久久久久高清 | 高清视频一区二区三区 | 日韩深夜在线观看 | 成人av动漫在线 | 午夜精品三区 | 午夜av影院 | 国产精品一区二区吃奶在线观看 | 免费看精品久久片 | 国产成人一区二区三区久久精品 | 欧美午夜剧场 | av在线播放亚洲 | 亚洲激情p | 欧美一区二区在线刺激视频 | 国产视频九色蝌蚪 | 国产精品中文在线 | 日本最新高清不卡中文字幕 | 欧美日韩三级在线观看 | 亚洲高清色综合 | 在线观看成人毛片 | 狠狠操欧美| 五月婷婷六月综合 | 9在线观看免费 | 久久国产精品免费视频 | 黄色一二级片 | 久久久久久高潮国产精品视 | 国产黄色成人av | 成人动图 | 九九爱免费视频 | 亚洲一区二区精品3399 | 国产少妇在线观看 | 午夜10000 | 精品国产亚洲在线 | 色偷偷88欧美精品久久久 | 国产精品精品久久久久久 | 日韩综合一区二区三区 | 日韩精品一区二区三区在线视频 | 国产又粗又硬又爽视频 | 久久久久久久久免费视频 | 久精品一区 | 日韩精品一区二区三区中文字幕 | 九九免费在线观看视频 | 91亚洲精品久久久中文字幕 | 国产第一页精品 | 91av电影在线观看 | 久久在线视频精品 | 日韩深夜在线观看 | 一区在线观看 | 欧美色图88 | 人人干干人人 | 视频 天天草 | 国产精品视频你懂的 | 深夜免费福利在线 | 国产精品99久久久精品 | 国产又粗又猛又黄 | 久久69精品久久久久久久电影好 | 免费日韩一级片 | 91精品国产91热久久久做人人 | 91成熟丰满女人少妇 | www.91av在线 | 国产只有精品 | 91麻豆精品国产午夜天堂 | 综合在线观看 | 欧美成人精品xxx | 少妇精69xxtheporn | 婷婷久久一区 | 亚洲视频免费在线观看 | 色播激情五月 | 99r在线视频 | 欧美一级免费片 | 日韩中文字幕免费视频 | 成人 国产 在线 | 日韩在线观看视频中文字幕 | 久久久久久久看片 | 亚洲综合欧美精品电影 | 日韩免费区| 久久免费在线视频 | 色综合小说 | 99精品国产99久久久久久97 | 最近2019中文免费高清视频观看www99 | 中文字幕在线观看三区 | 国产免费a| 精品视频久久久 | 九九99靖品| 国产在线欧美日韩 | 国产精品免费久久久 | 97**国产露脸精品国产 | 国产日韩精品一区二区在线观看播放 | 色婷婷狠狠18 | 国产美女在线免费观看 | 国产精品久久久网站 | 欧美最猛性xxxxx免费 | 久久伊99综合婷婷久久伊 | 精品高清美女精品国产区 | 日韩中文字幕亚洲一区二区va在线 | 亚洲狠狠丁香婷婷综合久久久 | 国产一二区在线观看 | 99精品国产99久久久久久福利 | 免费观看国产视频 | 色搞搞 | 成 人 黄 色 视频 免费观看 | www.看片网站| 特黄一级毛片 | 色午夜影院 | 超碰官网 | av免费在线观 | 国产免费一区二区三区最新6 | 日韩av成人在线观看 | 精品一区二区在线看 | a天堂免费 | 日韩xxxxxxxxx | 日韩经典一区二区三区 | 丁香婷婷综合色啪 | 视频高清 | 久久综合九色综合久99 | 国产欧美日韩一区 | 成人黄色电影在线观看 | 日韩中文字幕免费在线播放 | 人人干人人做 | 91精品婷婷国产综合久久蝌蚪 | 久久国产露脸精品国产 | 91精品国产一区二区在线观看 | 日韩色av色资源 | 中文字幕资源在线观看 | 久久久久久久久久久综合 | 欧美在线久久 | 人人澡超碰碰97碰碰碰软件 | 日本高清免费中文字幕 | 久久精品99北条麻妃 | 国产精品高 | 激情视频免费在线观看 | 99视频在线观看免费 | 99这里都是精品 | 2021国产视频 | 欧美一区二区在线免费观看 | 91中文字幕网 | 一区二区三区在线播放 | 丝袜一区在线 | 色操插| 99麻豆久久久国产精品免费 | 久久99视频免费 | 狠狠操91| 国产福利专区 | av在线免费观看黄 | 成年人免费看片 | av日韩国产 | 91精品婷婷国产综合久久蝌蚪 | 国产999精品久久久久久麻豆 | 成人av观看| 国产精品美女999 | 国产精品毛片 | 亚洲天堂网在线视频观看 | 黄色三级在线 | 久久网站免费 | 成人在线黄色电影 | 99在线视频观看 | 色人久久| 日韩电影一区二区三区在线观看 | 午夜精品一区二区三区免费视频 | 超碰在线最新 | 免费人人干 | 中文字幕在线日 | 黄色网址在线播放 | 在线观看网站av | 日韩精品亚洲专区在线观看 | 99久久婷婷 | 中文av字幕在线观看 | 97超碰伊人 | 久久观看最新视频 | 日韩a在线看 | 国产高清在线精品 | 在线va网站 | 欧美日韩视频精品 | 欧美激情精品久久久久久免费 | 色欧美88888久久久久久影院 | 国产精品 视频 | 91精品视频免费看 | 日韩免费在线视频 | 99色99| 91一区二区三区久久久久国产乱 | 最近更新好看的中文字幕 | 在线观看亚洲精品视频 | 久久精品免费播放 | 日韩动漫免费观看高清完整版在线观看 | 国产精品第一页在线观看 | 欧美久久久久久久 | 成人精品视频 | 亚洲资源在线观看 |