//---------------------------------------------------------------------------- bool WireMeshWindow::CreateScene() { std::string path = mEnvironment.GetPath("WireMesh.hlsl"); std::shared_ptr<VertexShader> vshader(ShaderFactory::CreateVertex(path)); if (!vshader) { return false; } std::shared_ptr<GeometryShader> gshader(ShaderFactory::CreateGeometry( path)); if (!gshader) { return false; } std::shared_ptr<PixelShader> pshader(ShaderFactory::CreatePixel(path)); if (!pshader) { return false; } std::shared_ptr<ConstantBuffer> parameters( new ConstantBuffer(3 * sizeof(Vector4<float>), false)); Vector4<float>* data = parameters->Get<Vector4<float>>(); data[0] = Vector4<float>(0.0f, 0.0f, 1.0f, 1.0f); // mesh color data[1] = Vector4<float>(0.0f, 0.0f, 0.0f, 1.0f); // edge color data[2] = Vector4<float>((float)mXSize, (float)mYSize, 0.0f, 0.0f); vshader->Set("WireParameters", parameters); gshader->Set("WireParameters", parameters); pshader->Set("WireParameters", parameters); std::shared_ptr<ConstantBuffer> cbuffer( new ConstantBuffer(sizeof(Matrix4x4<float>), true)); vshader->Set("PVWMatrix", cbuffer); std::shared_ptr<VisualEffect> effect(new VisualEffect(vshader, pshader, gshader)); VertexFormat vformat; vformat.Bind(VA_POSITION, DF_R32G32B32_FLOAT, 0); MeshFactory mf; mf.SetVertexFormat(vformat); mMesh = mf.CreateSphere(16, 16, 1.0f); mMesh->SetEffect(effect); mMesh->Update(); SubscribeCW(mMesh, cbuffer); return true; }
//---------------------------------------------------------------------------- void PerformanceAMDWindow::CreateScene() { struct Vertex { Vector3<float> position; Vector2<float> tcoord; }; VertexFormat vformat; vformat.Bind(VA_POSITION, DF_R32G32B32_FLOAT, 0); vformat.Bind(VA_TEXCOORD, DF_R32G32_FLOAT, 0); unsigned int const numTriangles = 1024; unsigned int const numVertices = 3 * numTriangles; std::shared_ptr<VertexBuffer> vbuffer(new VertexBuffer(vformat, numVertices)); // Randomly generate positions and texture coordinates. std::mt19937 mte; std::uniform_real_distribution<float> unirnd(0.0f, 1.0f); std::uniform_real_distribution<float> symrnd(-1.0f, 1.0f); Vertex* vertex = vbuffer->Get<Vertex>(); for (unsigned int i = 0; i < numVertices; ++i) { for (int j = 0; j < 3; ++j) { vertex[i].position[j] = symrnd(mte); } for (int j = 0; j < 2; ++j) { vertex[i].tcoord[j] = unirnd(mte); } } // The vertices are not indexed. Each consecutive triple is a triangle. std::shared_ptr<IndexBuffer> ibuffer(new IndexBuffer(IP_TRIMESH, numTriangles)); // Use a standard texture effect. std::shared_ptr<Texture2Effect> effect(new Texture2Effect( mProgramFactory, mBlurredTexture, SamplerState::MIN_L_MAG_L_MIP_P, SamplerState::CLAMP, SamplerState::CLAMP)); mPVWMatrix = effect->GetPVWMatrixConstant(); mTriangles.reset(new Visual(vbuffer, ibuffer, effect)); SubscribeCW(mTriangles, mPVWMatrix); EnableObjectMotion(); }
//---------------------------------------------------------------------------- bool StructuredBuffersWindow::CreateScene() { // Create the shaders and associated resources HLSLDefiner definer; definer.SetInt("WINDOW_WIDTH", mXSize); std::shared_ptr<VertexShader> vshader(ShaderFactory::CreateVertex( mEnvironment.GetPath("StructuredBuffers.hlsl"), definer)); if (!vshader) { return false; } std::shared_ptr<PixelShader> pshader(ShaderFactory::CreatePixel( mEnvironment.GetPath("StructuredBuffers.hlsl"), definer)); if (!pshader) { return false; } std::shared_ptr<ConstantBuffer> cbuffer(new ConstantBuffer( sizeof(Matrix4x4<float>), true)); vshader->Set("PVWMatrix", cbuffer); // Create the pixel shader and associated resources. std::string path = mEnvironment.GetPath("StoneWall.png"); std::shared_ptr<Texture2> baseTexture(WICFileIO::Load(path, false)); pshader->Set("baseTexture", baseTexture); std::shared_ptr<SamplerState> baseSampler(new SamplerState()); baseSampler->filter = SamplerState::MIN_L_MAG_L_MIP_P; baseSampler->mode[0] = SamplerState::CLAMP; baseSampler->mode[1] = SamplerState::CLAMP; pshader->Set("baseSampler", baseSampler); mDrawnPixels.reset(new StructuredBuffer(mXSize*mYSize, sizeof(Vector4<float>))); mDrawnPixels->SetUsage(Resource::SHADER_OUTPUT); mDrawnPixels->SetCopyType(Resource::COPY_BIDIRECTIONAL); memset(mDrawnPixels->GetData(), 0, mDrawnPixels->GetNumBytes()); pshader->Set("drawnPixels", mDrawnPixels); // Create the visual effect for the square. std::shared_ptr<VisualEffect> effect(new VisualEffect(vshader, pshader)); // Create a vertex buffer for a single triangle. The PNG is stored in // left-handed coordinates. The texture coordinates are chosen to reflect // the texture in the y-direction. struct Vertex { Vector3<float> position; Vector2<float> tcoord; }; VertexFormat vformat; vformat.Bind(VA_POSITION, DF_R32G32B32_FLOAT, 0); vformat.Bind(VA_TEXCOORD, DF_R32G32_FLOAT, 0); std::shared_ptr<VertexBuffer> vbuffer(new VertexBuffer(vformat, 4)); Vertex* vertex = vbuffer->Get<Vertex>(); vertex[0].position = Vector3<float>(0.0f, 0.0f, 0.0f); vertex[0].tcoord = Vector2<float>(0.0f, 1.0f); vertex[1].position = Vector3<float>(1.0f, 0.0f, 0.0f); vertex[1].tcoord = Vector2<float>(1.0f, 1.0f); vertex[2].position = Vector3<float>(0.0f, 1.0f, 0.0f); vertex[2].tcoord = Vector2<float>(0.0f, 0.0f); vertex[3].position = Vector3<float>(1.0f, 1.0f, 0.0f); vertex[3].tcoord = Vector2<float>(1.0f, 0.0f); // Create an indexless buffer for a triangle mesh with two triangles. std::shared_ptr<IndexBuffer> ibuffer(new IndexBuffer(IP_TRISTRIP, 2)); // Create the geometric object for drawing. Translate it so that its // center of mass is at the origin. This supports virtual trackball // motion about the object "center". mSquare.reset(new Visual(vbuffer, ibuffer, effect)); mSquare->localTransform.SetTranslation(-0.5f, -0.5f, 0.0f); mSquare->Update(); // Enable automatic updates of pvw-matrices and w-matrices. SubscribeCW(mSquare, cbuffer); // The structured buffer is written in the pixel shader. This texture // will receive a copy of it so that we can write the results to disk // as a PNG file. mDrawnPixelsTexture = new Texture2(DF_R8G8B8A8_UNORM, mXSize, mYSize); return true; }