コード例 #1
0
ファイル: render.cpp プロジェクト: kihx/rasterizer
	void RenderingContext::DrawInternal( const std::shared_ptr<IMesh>& mesh, PrimitiveType primitiveType /*= PrimitiveType::Triangles */ )
	{
		Assert( m_inputAssembler );
		Assert( m_vertexShader );
		Assert( m_rasterizer );
		Assert( m_pixelShader );
		Assert( m_outputMerger );

		// input assembler stage
		if ( IsFixedPipelineMode() )
		{
			m_inputAssembler->BindFixedPipelineOutputStreamSource( m_vertexShader->OutputStreamSource() );
		}
		std::shared_ptr<VertexShaderInputStream> vpInput = m_inputAssembler->Process( mesh );
		//printf( "\nVertexShaderInputStream Size: %d\n", vpInput->Size() );

		// vertex processor stage
		std::shared_ptr<RasterizerInputStream> raInput = m_vertexShader->Process( vpInput );
		//printf( "RasterizerInputStream Size: %d\n", raInput->Size() );

		// rasterizer stage
		raInput->SetPrimitiveType( primitiveType );
		m_rasterizer->SetCullMode( GetCullMode() );
		std::shared_ptr<PixelShaderInputStream> ppInput = m_rasterizer->Process( raInput );
		//printf( "PixelShaderInputStream Size: %d\n", ppInput->Size() );

		// pixel processor stage
		std::shared_ptr<OutputMergerInputStream> omInput = m_pixelShader->Process( ppInput );
		//printf( "OutputMergerInputStream Size: %d\n", 0 );
		
		// output merger stage
		m_outputMerger->Process( omInput );
		// Note that the output stream of the output merger is meaningless
		// because the output merger directly write data on render targets and a depth-stencil buffer, or a unordered resource view.
	}
コード例 #2
0
ファイル: MeshEntity.cpp プロジェクト: alanzw/JimEngine
void MeshObject::Render()
{
    traceIn(MeshObject::Render);

    LoadVertexBuffer(mesh->VertBuffer);
    LoadIndexBuffer(mesh->IdxBuffer);

    for(DWORD i=0;i<mesh->nSections;i++)
    {
        DrawSection &section  = mesh->SectionList[i];
        Material    *material = MaterialList[i];

        if(!material)
            continue;

        if(material->GetEffect() == GetActiveEffect())
            material->LoadParameters();

        if(material->GetFlags() & MATERIAL_TWOSIDED)
        {
            GSCullMode cullMode;
            cullMode = GetCullMode();
            SetCullMode(GS_NEITHER);
            GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
            SetCullMode(cullMode);
        }
        else
            GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
    }

    traceOut;
}
コード例 #3
0
ファイル: MeshEntity.cpp プロジェクト: alanzw/JimEngine
void MeshEntity::QuickRender()
{
    traceInFast(MeshEntity::QuickRender);

    if(!mesh)
        return;

    if(GetActiveEffect())
        LoadEffectData();
    else
    {
        MatrixPush();
        MatrixMultiply(invTransform);
        if(bHasScale) MatrixScale(scale);
    }

    LoadVertexBuffer(VertBuffer);
    LoadIndexBuffer(mesh->IdxBuffer);

    for(DWORD i=0;i<mesh->nSections;i++)
    {
        DrawSection &section  = mesh->SectionList[i];
        Material    *material = MaterialList[i];

        if(!material)
            continue;

        if(material->effect == GetActiveEffect())
            material->LoadParameters();

        if(material->flags & MATERIAL_TWOSIDED)
        {
            GSCullMode cullMode;
            cullMode = GetCullMode();
            SetCullMode(GS_NEITHER);
            GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
            SetCullMode(cullMode);
        }
        else
            GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
    }

    if(GetActiveEffect())
        ResetEffectData();
    else
        MatrixPop();

    traceOutFast;
}
コード例 #4
0
ファイル: MeshEntity.cpp プロジェクト: alanzw/JimEngine
void MeshEntity::RenderInitialPass()
{
    traceInFast(MeshEntity::RenderInitialPass);

    profileSegment("MeshEntity::RenderInitialPass");

    if(!mesh)
        return;

    LoadEffectData();

    LoadVertexBuffer(VertBuffer);       
    LoadIndexBuffer(mesh->IdxBuffer);

    for(DWORD i=0;i<mesh->nSections;i++)
    {
        DrawSection &section  = mesh->SectionList[i];
        Material    *material = MaterialList[i];

        if(material && section.numFaces)
        {
            if(material->effect == GetActiveEffect())
            {
                material->LoadParameters();

                if(material->flags & MATERIAL_TWOSIDED)
                {
                    GSCullMode cullMode;
                    cullMode = GetCullMode();
                    SetCullMode(GS_NEITHER);
                    Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
                    SetCullMode(cullMode);
                }
                else
                    Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
            }
        }
    }

    ResetEffectData();

    traceOutFast;
}
コード例 #5
0
ファイル: MeshEntity.cpp プロジェクト: alanzw/JimEngine
void MeshEntity::RenderLightmaps()
{
    traceInFast(MeshEntity::RenderLightmaps);

    if(!mesh || !bLightmapped)
        return;

    LoadEffectData();

    LoadVertexBuffer(VertBuffer);       
    LoadIndexBuffer(mesh->IdxBuffer);

    HANDLE param[3];

    param[0] = level->GetLightmapU();//GetActiveEffect()->GetParameterByName(TEXT("lightmapU"));
    param[1] = level->GetLightmapV();//GetActiveEffect()->GetParameterByName(TEXT("lightmapV"));
    param[2] = level->GetLightmapW();//GetActiveEffect()->GetParameterByName(TEXT("lightmapW"));

    if(lightmap.X)
    {
        GetActiveEffect()->SetTexture(param[0], lightmap.X);
        GetActiveEffect()->SetTexture(param[1], lightmap.Y);
        GetActiveEffect()->SetTexture(param[2], lightmap.Z);
    }
    else
    {
        //actually it should never get here
        Texture *black = GetTexture(TEXT("Base:Default/black.tga"));
        GetActiveEffect()->SetTexture(param[0], black);
        GetActiveEffect()->SetTexture(param[1], black);
        GetActiveEffect()->SetTexture(param[2], black);
    }

    for(DWORD i=0;i<mesh->nSections;i++)
    {
        DrawSection &section  = mesh->SectionList[i];
        Material    *material = MaterialList[i];

        if(material && section.numFaces)
        {
            if(material->effect == GetActiveEffect())
            {
                material->LoadParameters();

                if(material->flags & MATERIAL_TWOSIDED)
                {
                    GSCullMode cullMode;
                    cullMode = GetCullMode();
                    SetCullMode(GS_NEITHER);
                    Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
                    SetCullMode(cullMode);
                }
                else
                    Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3);
            }
        }
    }

    ResetEffectData();

    traceOutFast;
}