void DiGBuffer::Create() { // create RTs DiString gbName; gbName = "_gb_0"; DiTexturePtr tex; tex = DiAssetManager::GetInstance().CreateOrReplaceAsset<DiTexture>(gbName); tex->SetDimensions(0,0); tex->SetAdaptedRT(mParentWnd->GetRenderBuffer()); tex->SetViewportScale(DiVec2(1,1)); tex->SetFormat(PF_A32B32G32R32F); tex->SetResourceUsage(RU_NONE); tex->SetUsage(TU_RENDER_TARGET); tex->CreateTexture(); tex->SetAddressing(AM_BORDER); DiRenderTarget* rt = tex->GetRenderTarget(); rt->SetShouldUpdate(false); //rt->SetDepthBufferPool(DiDepthBuffer::POOL_DEFAULT); //rt->AttachDepthBuffer(mParentWnd->GetRenderBuffer()->GetDepthBuffer()); mTexture.push_back(tex); mRenderTargets.push_back(rt); // create materials mMaterial = DiMaterial::QuickCreate("gbuffer.vsh","gbuffer.psh"); mMaterial->SetDepthWrite(TRUE); mMaterial->SetDepthCheck(TRUE); }
void DiPostEffectPass::BuildTexture( int scale, DiPixelFormat format ) { DiString texname = mPassName + "_t"; mQuadScale = scale; mTexture = DiAssetManager::GetInstance().CreateOrReplaceAsset<DiTexture>(texname); mTexture->SetDimensions(0,0); mTexture->SetAdaptedRT(mParent->GetPostEffectManager( )->GetRenderWindow()->GetRenderBuffer()); mTexture->SetViewportScale(DiVec2(1,1)); mTexture->SetFormat(format); mTexture->SetResourceUsage(RU_NONE); mTexture->SetUsage(TU_RENDER_TARGET); mTexture->CreateTexture(); mTexture->SetAddressing(AM_BORDER); mRenderTarget = mTexture->GetRenderTarget(); mRenderTarget->SetShouldUpdate(false); mRenderTarget->SetDepthBufferPool(0); }
void DiMaterial::LoadShader(const DiString& vsname, const DiString& psname) { if (!DiShaderManager::GetInstancePtr()) return; // no need to release these pointers since we have shader manager mVertexShader = DiShaderManager::GetInstance().LoadShader(vsname, SHADER_VERTEX, mShaderFlag); mPixelShader = DiShaderManager::GetInstance().LoadShader(psname, SHADER_PIXEL , mShaderFlag); mVSName = vsname; mPSName = psname; mShaderParameter->LoadParameters(); if(mShaderFlag & SHADER_FLAG_SHADOW_RECEIVER) { mShaderParameter->WriteTexture2D("shadowMap", "_shad_tex_0"); mShaderParameter->WriteFloat2("invShadowMapSize", DiVec2(1/1024.0f, 1/1024.0f)); // todo } }
void DiSprite::UpdateGeometry(DiRenderTarget* rt) { if (mQuads.empty()) { mPrimitiveCount = 0; return; } if (!rt) return; ReleaseSourceData(); auto vb = Driver->CreateVertexBuffer(); if (!vb) return; mSourceData.push_back(vb); mVerticesNum = 6 * mQuads.size(); mPrimitiveCount = 2 * mQuads.size(); uint32 vertSize = (3 + 2) * sizeof(float) + sizeof(ARGB); mSourceData[0]->Create(mVerticesNum*vertSize); uint8* lockedData = DI_NEW uint8[mVerticesNum*vertSize]; uint32 w = (uint32)(rt->GetWidth() * rt->GetViewport().mWidth); uint32 h = (uint32)(rt->GetHeight() * rt->GetViewport().mHeight); DiVec2 invScreenSize; invScreenSize = DiVec2(1.0f / (float)w, 1.0f / (float)h); DiVec2 posAdjust(1, -1); float* dest = (float*)lockedData; if (!mMaterial || mMaterial->HasTexture()) { for (auto it = mQuads.begin(); it != mQuads.end(); ++it) { DiQuadElement quad = *it; DiVec2 topLeft, bottomRight, topLeftUv, bottomRightUv; quad.top *= -1; quad.bottom *= -1; if (!quad.absCoord) { quad.left *= (float)w; quad.right *= (float)w; quad.top *= (float)h; quad.bottom *= (float)h; } topLeft = (DiVec2((float)quad.left, (float)quad.top)/*+DiVec2(0.5f,0.5f)*/) * invScreenSize*2; bottomRight = (DiVec2((float)quad.right, (float)quad.bottom)/*+DiVec2(0.5f,0.5f)*/) * invScreenSize*2; topLeft -= posAdjust; bottomRight -= posAdjust; topLeftUv = DiVec2((float)quad.leftUv, (float)quad.topUv); bottomRightUv = DiVec2((float)quad.rightUv, (float)quad.bottomUv); *dest++ = topLeft.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topLeftColor; dest++; *dest++ = topLeftUv.x; *dest++ = topLeftUv.y; *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomLeftColor; dest++; *dest++ = topLeftUv.x; *dest++ = bottomRightUv.y; *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topRightColor; dest++; *dest++ = bottomRightUv.x; *dest++ = topLeftUv.y; *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topRightColor; dest++; *dest++ = bottomRightUv.x; *dest++ = topLeftUv.y; *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomLeftColor; dest++; *dest++ = topLeftUv.x; *dest++ = bottomRightUv.y; *dest++ = bottomRight.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomRightColor; dest++; *dest++ = bottomRightUv.x; *dest++ = bottomRightUv.y; } } else { for (auto it = mQuads.begin(); it != mQuads.end(); ++it) { DiQuadElement quad = *it; quad.top *= -1; quad.bottom *= -1; if (!quad.absCoord) { quad.left *= (float)w; quad.right *= (float)w; quad.top *= (float)h; quad.bottom *= (float)h; } DiVec2 topLeft, bottomRight, topLeftUV, bottomRightUV; topLeft = (DiVec2((float)quad.left, (float)quad.top)) * invScreenSize*2; bottomRight = (DiVec2((float)quad.right, (float)quad.bottom)) * invScreenSize*2; topLeft -= posAdjust; bottomRight -= posAdjust; *dest++ = topLeft.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topLeftColor; dest++; dest += 2; *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomLeftColor; dest++; dest += 2; *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topRightColor; dest++; dest += 2; *dest++ = bottomRight.x; *dest++ = topLeft.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.topRightColor; dest++; dest += 2; *dest++ = topLeft.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomLeftColor; dest++; dest += 2; *dest++ = bottomRight.x; *dest++ = bottomRight.y; *dest++ = 0.0f; *((ARGB*)dest) = quad.bottomRightColor; dest++; dest += 2; } } mSourceData[0]->WriteData(0, mVerticesNum*vertSize, lockedData); DI_DELETE[] lockedData; mSourceData[0]->SetStride(vertSize); }