void GameObject2::Draw(){ //ゲームステージが無効ならリターン if (m_GameStgae.expired()){ return; } //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); auto pID3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ auto RenderStatePtr = Dev->GetRenderState(); auto Stage = m_GameStgae.lock(); auto ViewPtr = Stage->GetView(); //ビューからカメラを取り出す auto PtrCamera = ViewPtr->GetCamera(); //カメラの取得 Matrix4X4 View, Proj; View = PtrCamera->GetViewMatrix(); Proj = PtrCamera->GetProjMatrix(); //コンスタントバッファの設定 Texture3DConstantBuffer cb1; //行列の設定(転置する) cb1.Model = Matrix4X4EX::Transpose(m_WorldMatrix); cb1.View = Matrix4X4EX::Transpose(View); cb1.Projection = Matrix4X4EX::Transpose(Proj); //ライトの設定 //ステージから0番目のライトを取り出す auto PtrLight = ViewPtr->GetMultiLight()->GetLight(0); cb1.LightDir = PtrLight->GetDirectional(); cb1.LightDir.w = 1.0f; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(CBTexture3D::GetPtr()->GetBuffer(), 0, nullptr, &cb1, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionNormalTexture); UINT offset = 0; //頂点バッファの設定 pID3D11DeviceContext->IASetVertexBuffers(0, 1, m_VertexBuffer.GetAddressOf(), &stride, &offset); //インデックスバッファのセット pID3D11DeviceContext->IASetIndexBuffer(m_IndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pID3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //塗りつぶし処理(今回の画像はJPEGなので透明にしない) pID3D11DeviceContext->OMSetBlendState(RenderStatePtr->GetOpaque(), nullptr, 0xffffffff); //デプスステンシルは使用する pID3D11DeviceContext->OMSetDepthStencilState(RenderStatePtr->GetDepthDefault(), 0); //シェーダの設定 pID3D11DeviceContext->VSSetShader(VSTexture3D::GetPtr()->GetShader(), nullptr, 0); pID3D11DeviceContext->PSSetShader(PSTexture3D::GetPtr()->GetShader(), nullptr, 0); //リニアサンプラーを設定 ID3D11SamplerState* samplerState = RenderStatePtr->GetLinearClamp(); pID3D11DeviceContext->PSSetSamplers(0, 1, &samplerState); //テクスチャを設定 pID3D11DeviceContext->PSSetShaderResources(0, 1, m_ShaderResView.GetAddressOf()); //インプットレイアウトの設定 pID3D11DeviceContext->IASetInputLayout(VSTexture3D::GetPtr()->GetInputLayout()); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBTexture3D::GetPtr()->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullFront()); //描画 pID3D11DeviceContext->DrawIndexed(m_NumIndicis, 0, 0); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullBack()); //描画 pID3D11DeviceContext->DrawIndexed(m_NumIndicis, 0, 0); //後始末 Dev->InitializeStates(RenderStatePtr); }
// initialization taken from plugin h263-1998 in opal-2.8.0 bool VideoEncoderFfmpeg::InitEncoder(int bitrate, int fps, int width, int height, int fragsize, int *fragcount, const char *enc_params) { if (!VideoEncoder::InitEncoder(bitrate, fps, width, height, fragsize, fragcount, enc_params)) goto InitEncoder_ErrInitParent; avcodec_init(); avcodec_register_all(); // codec codec_ = avcodec_find_encoder(GetCodecId()); if (NULL == codec_) goto InitEncoder_ErrFindEncoder; // frame input_buffer_size_ = width * height * 3 / 2; input_buffer_ = static_cast<unsigned char *>( _aligned_malloc(input_buffer_size_, kMemAlign)); frame_ = avcodec_alloc_frame(); if (NULL == frame_) goto InitEncoder_ErrAllocFrame; frame_->data[0] = input_buffer_; frame_->data[1] = frame_->data[0] + width * height; frame_->data[2] = frame_->data[1] + width * height / 4; frame_->linesize[0] = width; frame_->linesize[1] = frame_->linesize[2] = width / 2; // context context_ = avcodec_alloc_context3(codec_); if (NULL == context_) goto InitEncoder_ErrAllocContext; context_->pix_fmt = PIX_FMT_YUV420P; context_->width = width; context_->height = height; context_->time_base.num = 1; context_->time_base.den = fps; context_->gop_size = param_video()->GetGopSize(); context_->flags = CODEC_FLAG_INPUT_PRESERVED | CODEC_FLAG_EMU_EDGE | CODEC_FLAG_PASS1 | GetFlags(); context_->mb_decision = FF_MB_DECISION_SIMPLE; context_->me_method = ME_EPZS; context_->max_b_frames = 0; // target bitrate context_->bit_rate = bitrate * 3 / 4; context_->bit_rate_tolerance = bitrate / 2; context_->rc_min_rate = 0; context_->rc_max_rate = bitrate; context_->rc_buffer_size = bitrate / 1000; /* ratecontrol qmin qmax limiting method 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax. */ context_->rc_qsquish = 0; // limit q by clipping context_->rc_eq = (char*) "1"; // rate control equation context_->rc_buffer_size = bitrate * 64; // temporal spatial trade off context_->max_qdiff = 10; // was 3 // max q difference between frames context_->qcompress = 0.5; // qscale factor between easy & hard scenes (0.0-1.0) context_->i_quant_factor = (float)-0.6; // qscale factor between p and i frames context_->i_quant_offset = (float)0.0; // qscale offset between p and i frames context_->me_subpel_quality = 8; context_->qmin = MIN_QUANT; context_->qmax = static_cast<int>(round ( (31.0 - MIN_QUANT) / 31.0 * GetTsto() + MIN_QUANT)); context_->qmax = min(context_->qmax, 31); // TODO: vedere come mapparli in ffmpeg 0.10.3 //context_->mb_qmin = context_->qmin; //context_->mb_qmax = context_->qmax; // Lagrange multipliers - this is how the context defaults do it: context_->lmin = context_->qmin * FF_QP2LAMBDA; context_->lmax = context_->qmax * FF_QP2LAMBDA; context_->debug = FF_DEBUG_RC | FF_DEBUG_PICT_INFO | FF_DEBUG_MV; // frammentazione if (fragsize > 0) { context_->opaque = GetOpaque(); context_->rtp_payload_size = 1; // if I leave 0, ffmpeg doesn't split at gobs, if I use a large value // ffmpeg aggregates gobs without inserting gob headers } if (0 != avcodec_open2(context_, codec_, &opts_)) { goto InitEncoder_ErrOpenCodec; } return true; InitEncoder_ErrOpenCodec: avcodec_close(context_); av_free(context_); context_ = NULL; InitEncoder_ErrAllocContext: av_free(frame_); frame_ = NULL; InitEncoder_ErrAllocFrame: codec_ = NULL; _aligned_free(input_buffer_); input_buffer_ = NULL; input_buffer_size_ = 0; InitEncoder_ErrFindEncoder: VideoEncoder::DestroyEncoder(); InitEncoder_ErrInitParent: return false; }
void SpriteBase::OnDraw() { auto TexPtr = App::GetApp()->GetResource<TextureResource>(m_TextureResName); auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); auto RenderState = Dev->GetRenderState(); //ワールド行列の決定 Mat4x4 World; World.affineTransformation2D( m_Scale, //スケーリング Vec2(0, 0), //回転の中心(重心) m_Rot, //回転角度 m_Pos //位置 ); //射影行列の決定 float w = static_cast<float>(App::GetApp()->GetGameWidth()); float h = static_cast<float>(App::GetApp()->GetGameHeight()); Mat4x4 Proj(XMMatrixOrthographicLH(w, h, -1.0, 1.0f)); //行列の合成 World *= Proj; //コンスタントバッファの準備 SpriteConstantBuffer sb; //エミッシブ加算。 sb.Emissive = m_Emissive; //行列の設定 sb.World = World; //コンスタントバッファの更新 pD3D11DeviceContext->UpdateSubresource(CBSprite::GetPtr()->GetBuffer(), 0, nullptr, &sb, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionColorTexture); UINT offset = 0; //頂点バッファのセット pD3D11DeviceContext->IASetVertexBuffers(0, 1, m_SquareMesh->GetVertexBuffer().GetAddressOf(), &stride, &offset); //インデックスバッファのセット pD3D11DeviceContext->IASetIndexBuffer(m_SquareMesh->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pD3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBSprite::GetPtr()->GetBuffer(); ID3D11Buffer* pNullConstantBuffer = nullptr; //頂点シェーダに渡す pD3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); //ピクセルシェーダに渡す pD3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //シェーダの設定 pD3D11DeviceContext->VSSetShader(VSPCTSprite::GetPtr()->GetShader(), nullptr, 0); pD3D11DeviceContext->PSSetShader(PSPCTSprite::GetPtr()->GetShader(), nullptr, 0); //インプットレイアウトの設定 pD3D11DeviceContext->IASetInputLayout(VSPCTSprite::GetPtr()->GetInputLayout()); //ブレンドステート switch (m_BlendState) { case BlendState::Opaque: pD3D11DeviceContext->OMSetBlendState(RenderState->GetOpaque(), nullptr, 0xffffffff); break; case BlendState::Trace: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAlphaBlendEx(), nullptr, 0xffffffff); break; case BlendState::Additive: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAdditive(), nullptr, 0xffffffff); break; } //デプスステンシルステート pD3D11DeviceContext->OMSetDepthStencilState(RenderState->GetDepthNone(), 0); //ラスタライザステート pD3D11DeviceContext->RSSetState(RenderState->GetCullBack()); //テクスチャとサンプラーの設定 ID3D11ShaderResourceView* pNull[1] = { 0 }; pD3D11DeviceContext->PSSetShaderResources(0, 1, TexPtr->GetShaderResourceView().GetAddressOf()); //ラッピングサンプラー ID3D11SamplerState* pSampler = RenderState->GetLinearWrap(); pD3D11DeviceContext->PSSetSamplers(0, 1, &pSampler); //描画 pD3D11DeviceContext->DrawIndexed(m_SquareMesh->GetNumIndicis(), 0, 0); //後始末 Dev->InitializeStates(); }