//************************************************************************************************************* void Star() { tmpvert[6] = tmpvert[24] = tmpvert[30] = (float)screenwidth / 4.0f - 0.5f; tmpvert[13] = tmpvert[19] = tmpvert[31] = (float)screenheight / 4.0f - 0.5f; texelsize.x = 4.0f / (float)screenwidth; texelsize.y = 4.0f / (float)screenheight; hdreffect->SetTechnique("star"); hdreffect->SetVector("texelsize", &texelsize); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); for( int i = 0; i < 4; ++i ) { hdreffect->SetInt("stardir", i); for( int j = 0; j < 3; ++j ) { int ind = (j % 2); device->SetRenderTarget(0, starsurfaces[i][ind]); device->SetTexture(0, (j == 0 ? dstargets[1] : startargets[i][1 - ind])); hdreffect->SetInt("starpass", j); hdreffect->CommitChanges(); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } } hdreffect->EndPass(); hdreffect->End(); // combine star textures hdreffect->SetTechnique("starcombine"); device->SetRenderTarget(0, blursurfaces[1]); device->SetTexture(0, startargets[0][0]); device->SetTexture(1, startargets[1][0]); device->SetTexture(2, startargets[2][0]); device->SetTexture(3, startargets[3][0]); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); }
void AutoExposure(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("AutoExposure"); g_pExposureEffect->SetTechnique(shader); Vector4 vMiddleGray(0.5f); Vector4 vMultiplierClamp(0.2f, 3.0f, 0.0f, 0.0f); D3DXHANDLE middlegray_var = g_pExposureEffect->GetParameterByName(NULL, "vMiddleGray"); D3DXHANDLE clamp_var = g_pExposureEffect->GetParameterByName(NULL, "vMultiplierClamp"); D3DXHANDLE image0_var = g_pExposureEffect->GetParameterByName(NULL, "Image"); D3DXHANDLE image1_var = g_pExposureEffect->GetParameterByName(NULL, "Image2"); g_pExposureEffect->SetVector(middlegray_var, (D3DXVECTOR4*)&vMiddleGray); g_pExposureEffect->SetVector(clamp_var, (D3DXVECTOR4*)&vMultiplierClamp); g_pExposureEffect->SetTexture(image0_var, g_pFrameBuffer[FULLSIZE]); g_pExposureEffect->SetTexture(image1_var, g_pFrameBuffer[LUMINANCE_TEMP]); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_ImageInfo); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); }
void ConverToLogLuminance(LPDIRECT3DTEXTURE9 pSource, sImageInfo *pInfo) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pFrameSurface[DOWNSAMPLED_256x256]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("LogLuminance"); g_pExposureEffect->SetTechnique(shader); D3DXHANDLE tablevar = g_pExposureEffect->GetParameterByName(NULL, "vLuminanceTable"); D3DXHANDLE imagevar = g_pExposureEffect->GetParameterByName(NULL, "Image"); Vector4 vTable(0.21f, 0.71f, 0.072f); g_pExposureEffect->SetVector(tablevar, (D3DXVECTOR4*)&vTable); g_pExposureEffect->SetTexture(imagevar, pSource); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(pInfo); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); }
static void WaterSimulation(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_HEIGHT2]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("WaterSimulation"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE heightmap_prev_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_prev"); D3DXHANDLE texturesize_var = g_pWaterEffect->GetParameterByName(NULL, "texture_size"); D3DXHANDLE damping_var = g_pWaterEffect->GetParameterByName(NULL, "fDamping"); Vector4 texturesize; texturesize[0] = 1.0f/(float)g_ImageInfo.m_iWidth; texturesize[1] = 1.0f/(float)g_ImageInfo.m_iHeight; texturesize[2] = (float)g_ImageInfo.m_iWidth; texturesize[3] = (float)g_ImageInfo.m_iHeight; g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_prev_var, g_pTextures[TEX_HEIGHT0]); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT1]); g_pWaterEffect->SetFloat(damping_var, 0.99f); g_pWaterEffect->SetVector(texturesize_var, (D3DXVECTOR4*)&texturesize); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
//************************************************************************************************************* void LensFlare() { texelsize.x = 2.0f / (float)screenwidth; texelsize.y = 2.0f / (float)screenheight; hdreffect->SetTechnique("ghost"); hdreffect->SetVector("texelsize", &texelsize); device->SetRenderTarget(0, ghostsurfaces[0]); device->SetTexture(0, dstargets[0]); device->SetTexture(1, dstargets[1]); device->SetTexture(2, dstargets[2]); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); tmpvert[6] = tmpvert[24] = tmpvert[30] = (float)screenwidth / 2.0f - 0.5f; tmpvert[13] = tmpvert[19] = tmpvert[31] = (float)screenheight / 2.0f - 0.5f; // 1 iteration only (not too spectatular...) hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); }
void CShaderManager::Render( ) { if( m_pD3DDevice == NULL || m_pObject == NULL ) return; LPD3DXEFFECT fxShader = GetShader( m_pObject->m_hShader ); if( fxShader == NULL ) { m_pObject->Render(); return; } UINT uiNumPasses = 0; fxShader->Begin( &uiNumPasses, 0 ); for( UINT iPass = 0; iPass < uiNumPasses; ++iPass ) { fxShader->BeginPass( iPass ); m_pObject->Render(); fxShader->EndPass(); } fxShader->End(); }
//************************************************************************************************************* void DownSample() { hdreffect->SetTechnique("downsample"); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); for( int i = 1; i < 5; ++i ) { device->SetRenderTarget(0, dssurfaces[i]); device->SetTexture(0, dstargets[i - 1]); texelsize.x = (float)(2 << i) / (float)screenwidth; texelsize.y = (float)(2 << i) / (float)screenheight; tmpvert[6] = tmpvert[24] = tmpvert[30] = (float)screenwidth / ((float)(2 << i)) - 0.5f; tmpvert[13] = tmpvert[19] = tmpvert[31] = (float)screenheight / ((float)(2 << i)) - 0.5f; hdreffect->SetVector("texelsize", &texelsize); hdreffect->CommitChanges(); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); }
static void AddImpulse(void) { static Vector4 vPosition(0.0f, 0.0f, 0.0f, 0.0f); //Vector4 vDiff = vPosition - g_vPosition; Vector4 vDiff = g_vPosition - vPosition; Vector4 vLength = vDiff.Length(); if ( vLength[0]<2.0f ) return; Vector4 vDir = vDiff / vLength; Vector4 vVec0(vDir[1],-vDir[0], 0.0f, 0.0f); Vector4 vVec1(vDir[0], vDir[1], 0.0f, 0.0f); vPosition = g_vPosition; Vector4 vVec0_old = g_orient_matrix[0]; Vector4 vVec1_old = g_orient_matrix[1]; Vector4 vVec0_new = VectorLerp(vVec0_old, vVec0, 0.2f); Vector4 vVec1_new = VectorLerp(vVec1_old, vVec1, 0.2f); vVec0_new.Normalize(); vVec1_new.Normalize(); Vector4 vVec2_new = Vector3CrossProduct(vVec0_new, vVec1_new); g_orient_matrix.Identity(); g_orient_matrix[0] = vVec0_new; g_orient_matrix[1] = vVec1_new; g_orient_matrix[2] = vVec2_new; LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_HEIGHT1]); device->SetDepthStencilSurface(NULL); Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix; world_matrix.Scale_Replace(g_fRippleSize, g_fRippleSize, 1.0f); world_matrix[3] = g_vPosition; Matrix4x4 wvp_matrix = g_orient_matrix * world_matrix * view_matrix * g_proj_matrix; D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("AddImpulse"); D3DXHANDLE wvp_matrix_var = g_pWaterEffect->GetParameterByName(NULL, "wvp_matrix"); D3DXHANDLE force_var = g_pWaterEffect->GetParameterByName(NULL, "fForce"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetMatrix(wvp_matrix_var, (D3DXMATRIX *)&wvp_matrix); g_pWaterEffect->SetFloat(force_var, 0.05f); g_pWaterEffect->Begin(NULL, 0); g_pWaterEffect->BeginPass(0); g_Model_DX9.Render(0); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); vPosition = g_vPosition; }
/**----------------------------------------------------------------------------- * 화면 그리기 *------------------------------------------------------------------------------ */ VOID Render() { UINT nPass; /// 후면버퍼와 Z버퍼 초기화 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(200,200,200), 1.0f, 0 ); g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, g_bWireframe ? D3DFILL_WIREFRAME : D3DFILL_SOLID ); /// 애니메이션 행렬설정 Animate(); /// 렌더링 시작 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { if( g_bUseVS ) // 정점 쉐이더를 사용하여 출력? { g_pEffect->SetFloat( "g_fTime", (float)(timeGetTime()) / 100 ); /// 정점선언값과 정점 설정 g_pd3dDevice->SetVertexDeclaration( g_pDecl ); g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MYVERTEX) ); /// fx출력에 사용할 테크닉 선정 g_pEffect->SetTechnique( "MyShader" ); /// fx를 사용한 출력개시 g_pEffect->Begin( &nPass, D3DXFX_DONOTSAVESTATE ); /// PASS 개수만큼 출력 for( int i = 0; i < nPass ; i++ ) { g_pEffect->BeginPass( i ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); g_pEffect->EndPass(); } /// fx를 사용한 출력종료 g_pEffect->End(); } else { // fx를 사용한뒤에는 이 값을 NULL로 해야 D3D고정 파이프라인을 사용할 수 있다. g_pd3dDevice->SetVertexShader( NULL ); g_pd3dDevice->SetPixelShader( NULL ); g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MYVERTEX) ); g_pd3dDevice->SetFVF( MYVERTEX::FVF ); g_pd3dDevice->SetTexture( 0, g_pTexture ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); /// MODULATE연산으로 색깔을 섞음 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); /// 첫번째 섞을색은 텍스쳐 색 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); /// 두번째 섞을색은 정점 색 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); /// alpha연산은 사용하지 않음 g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); } g_pd3dDevice->EndScene(); } /// 후면버퍼를 보이는 화면으로! g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
// 3D 물체등을 그린다. void RenderScene() { // 뷰 행렬을 만든다. D3DXMATRIXA16 matView; D3DXVECTOR3 vEyePt(gWorldCameraPosition.x, gWorldCameraPosition.y, gWorldCameraPosition.z); D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec); // 투영행렬을 만든다. D3DXMATRIXA16 matProjection; D3DXMatrixPerspectiveFovLH(&matProjection, FOV, ASPECT_RATIO, NEAR_PLANE, FAR_PLANE); // 프레임마다 0.4도씩 회전을 시킨다. gRotationY += 0.4f * PI / 180.0f; if (gRotationY > 2 * PI) { gRotationY -= 2 * PI; } // 월드행렬을 만든다. D3DXMATRIXA16 matWorld; D3DXMatrixRotationY(&matWorld, gRotationY); // 월드/뷰/투영행렬을 미리 곱한다. D3DXMATRIXA16 matWorldView; D3DXMATRIXA16 matWorldViewProjection; D3DXMatrixMultiply(&matWorldView, &matWorld, &matView); D3DXMatrixMultiply(&matWorldViewProjection, &matWorldView, &matProjection); // 쉐이더 전역변수들을 설정 gpEnvironmentMappingShader->SetMatrix("gWorldMatrix", &matWorld); gpEnvironmentMappingShader->SetMatrix("gWorldViewProjectionMatrix", &matWorldViewProjection); gpEnvironmentMappingShader->SetVector("gWorldLightPosition", &gWorldLightPosition); gpEnvironmentMappingShader->SetVector("gWorldCameraPosition", &gWorldCameraPosition); gpEnvironmentMappingShader->SetVector("gLightColor", &gLightColor); gpEnvironmentMappingShader->SetTexture("DiffuseMap_Tex", gpStoneDM); gpEnvironmentMappingShader->SetTexture("SpecularMap_Tex", gpStoneSM); gpEnvironmentMappingShader->SetTexture("NormalMap_Tex", gpStoneNM); gpEnvironmentMappingShader->SetTexture("EnvironmentMap_Tex", gpSnowENV); // 쉐이더를 시작한다. UINT numPasses = 0; gpEnvironmentMappingShader->Begin(&numPasses, NULL); { for (UINT i = 0; i < numPasses; ++i) { gpEnvironmentMappingShader->BeginPass(i); { // 구체를 그린다. gpTeapot->DrawSubset(0); } gpEnvironmentMappingShader->EndPass(); } } gpEnvironmentMappingShader->End(); }
HRESULT KG3DPointLightShadow::ExportToCubeSurface(KG3DRenderTargetTool* pTool,LPDIRECT3DSURFACE9 pDestSurface,BOOL bOutputDepth) { HRESULT hr = E_FAIL; KGLOG_PROCESS_ERROR(pTool); pTool->BeginNewRenderTarget(NULL,NULL,NULL); ////////////////////////////////////////////////////////////////////////// hr = g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0x00808080, 1, 0); KGLOG_COM_PROCESS_ERROR(hr); { D3DXVECTOR2 A(0,0); D3DXVECTOR2 C(m_vShadowMap.m_dwShadowmapSize,m_vShadowMap.m_dwShadowmapSize); if(bOutputDepth) { D3DXMATRIX matInv; D3DXMatrixInverse(&matInv,NULL,&m_vShadowMap.m_vCameraLight.GetProjectionMatrix()); LPD3DXEFFECT pShader = g_cGraphicsTool.GetDefaultShader(DEFST_LINEARDEPTHOUTPUT); pShader->SetMatrix("invProj",&matInv); pShader->SetTechnique("tec0"); UINT uPass = 0; pShader->Begin(&uPass,0); pShader->BeginPass(0); hr = g_pd3dDevice->BeginScene(); KGLOG_COM_PROCESS_ERROR(hr); g_cGraphicsTool.DrawScreenRect(&A,&C,0,0xFFFFFFFF,m_vShadowMap.m_lpSMShadowMap); hr = g_pd3dDevice->EndScene(); KGLOG_COM_PROCESS_ERROR(hr); pShader->EndPass(); pShader->End(); } else { g_cGraphicsTool.DrawScreenRect(&A,&C,0,0xFFFFFFFF,m_vShadowMap.m_lpSMColorMap); } } hr = S_OK; Exit0: pTool->EndNewRenderTarget(); pTool->ExportRenderData(pDestSurface,FALSE); return hr; }
void RenderFrameDX9(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->BeginScene(); AddImpulse(); WaterSimulation(); HeightmapToNormal(); device->SetRenderTarget(0, g_pMainFramebuffer); device->SetDepthStencilSurface(g_pMainDepthbuffer); device->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0x0, 1.0f, 0); RenderWater(); DrawObject(); SwapHeightmaps(); float x = -1.0f; float y = -1.0f; float w = 0.4f; float h = 0.4f; if ( g_iMode & 0x01 ) { DrawImage(g_pTextures[TEX_HEIGHT2], x, y, w, h, &g_ImageInfo); x+=w; } if ( g_iMode & 0x02 ) { D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("Heightmap"); D3DXHANDLE heightmap_var = g_pWaterEffect->GetTechniqueByName("heightmap_current"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_var, g_pTextures[TEX_HEIGHT2]); g_pWaterEffect->Begin(NULL, 0); g_pWaterEffect->BeginPass(0); GutDrawScreenQuad_DX9(x, y, w, h, &g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); x+=w; } if ( g_iMode & 0x04 ) { DrawImage(g_pTextures[TEX_NORMAL], x, y, w, h, &g_ImageInfo); x+=w; } device->EndScene(); device->Present( NULL, NULL, NULL, NULL ); }
//--------------------------------------------------------------------------------------- // シェーダ開始 //--------------------------------------------------------------------------------------- void BeginShader(int nTechnique) { if (nTechnique < 0 || nTechnique >= MAX_TECHNIQUE) { nTechnique = 0; } // テクニック設定 g_pFX->SetTechnique(g_hTech[nTechnique]); g_pFX->Begin(NULL, 0); // パス開始 g_pFX->BeginPass(0); }
// 3D 물체등을 그린다. void RenderScene() { // 뷰행렬 초기화. D3DXMATRIXA16 matView; // D3DXVECTOR3 vEyePt(0.0f, 0.0f, -200.0f); D3DXVECTOR3 vEyePt(gWorldCameraPosition.x, gWorldCameraPosition.y, gWorldCameraPosition.z); D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec); // 투영행렬 초기화. D3DXMATRIXA16 matProjection; D3DXMatrixPerspectiveFovLH(&matProjection, FOV, ASPECT_RATIO, NEAR_PLANE, FAR_PLANE); // 회전. gRotationY += ((0.4f * PI) / 180.0f); if (gRotationY > 2 * PI) gRotationY -= 2 * PI; // 월드행렬 초기화. D3DXMATRIXA16 matWorld; // D3DXMatrixIdentity(&matWorld); D3DXMatrixRotationY(&matWorld, gRotationY); // 쉐이더에 전달. gpTextureMappingShader->SetMatrix("gWorldMatrix", &matWorld); gpTextureMappingShader->SetMatrix("gViewMatrix", &matView); gpTextureMappingShader->SetMatrix("gProjectionMatrix", &matProjection); gpTextureMappingShader->SetVector("gWorldLightPosition", &gWorldLightPosition); gpTextureMappingShader->SetVector("gWorldCameraPosition", &gWorldCameraPosition); // gpTextureMappingShader->SetTexture("DiffuseMap_Tex", gpEarthDM); // 쉐이더 적용. UINT numPasses = 0; gpTextureMappingShader->Begin(&numPasses, NULL); for (UINT i = 0; i < numPasses; ++i) { gpTextureMappingShader->BeginPass(i); gpSphere->DrawSubset(0); gpTextureMappingShader->EndPass(); } gpTextureMappingShader->End(); }
//************************************************************************************************************* void BrightPass() { device->SetRenderTarget(0, dssurfaces[0]); device->SetTexture(0, scenetarget); tmpvert[6] = tmpvert[24] = tmpvert[30] = (float)screenwidth * 0.5f - 0.5f; tmpvert[13] = tmpvert[19] = tmpvert[31] = (float)screenheight * 0.5f - 0.5f; hdreffect->SetTechnique("brightpass"); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); // generate afterimage now device->SetRenderTarget(0, aftersurfaces[afterimagetex]); if( afterimage ) { device->SetTexture(0, afterimages[1 - afterimagetex]); device->SetTexture(1, dstargets[0]); hdreffect->SetTechnique("afterimage"); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); } else device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0); afterimagetex = 1 - afterimagetex; }
void DrawImage(LPDIRECT3DTEXTURE9 pSource1, sImageInfo *pInfo, float x0, float y0, float width, float height) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); g_pEffect->SetTechnique(g_pAddImageShader); D3DXHANDLE pTexture1Var = g_pEffect->GetParameterByName(NULL, "Image"); g_pEffect->SetTexture(pTexture1Var, pSource1); g_pEffect->Begin(NULL, 0); g_pEffect->BeginPass(0); DrawScreenQuad(pInfo, x0, y0, width, height); g_pEffect->EndPass(); g_pEffect->End(); }
void Manipulator::RenderSphere(LPD3DXEFFECT effect, const Matrix& projection, const Matrix& view, const D3DXVECTOR3& color, const Transform& world) { D3DXMATRIX wvp = world.GetMatrix() * view.GetMatrix() * projection.GetMatrix(); effect->SetMatrix(DxConstant::WordViewProjection, &wvp); effect->SetFloatArray(DxConstant::VertexColor, &color.x, 3); UINT nPasses = 0; effect->Begin(&nPasses, 0); for(UINT iPass = 0; iPass < nPasses; iPass++) { effect->BeginPass(iPass); m_sphere->DrawSubset(0); effect->EndPass(); } effect->End(); }
//************************************************************************************************************* void BlurTexture(LPDIRECT3DTEXTURE9 tex) { LPDIRECT3DSURFACE9 surface = NULL; LPDIRECT3DSURFACE9 blursurface = NULL; LPDIRECT3DTEXTURE9 blurtex = NULL; D3DXVECTOR4 texelsize(1.0f / SHADOWMAP_SIZE, 0, 0, 0); D3DSURFACE_DESC desc; tex->GetLevelDesc(0, &desc); if( desc.Format == D3DFMT_A8R8G8B8 ) blurtex = blurARGB8; // for convolution else blurtex = blurRGBA32F; // for others blurtex->GetSurfaceLevel(0, &blursurface); tex->GetSurfaceLevel(0, &surface); device->SetRenderTarget(0, blursurface); device->SetTexture(0, tex); device->SetVertexDeclaration(vertexdecl); boxblur5x5->SetVector("texelSize", &texelsize); boxblur5x5->Begin(NULL, 0); boxblur5x5->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, &vertices[0], 6 * sizeof(float)); std::swap(texelsize.x, texelsize.y); boxblur5x5->SetVector("texelSize", &texelsize); boxblur5x5->CommitChanges(); device->SetRenderTarget(0, surface); device->SetTexture(0, blurtex); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, &vertices[0], 6 * sizeof(float)); } boxblur5x5->EndPass(); boxblur5x5->End(); surface->Release(); blursurface->Release(); }
static void RenderParticle(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); int w, h; GutGetWindowSize(w, h); Matrix4x4 wvp_matrix = g_Control.GetObjectMatrix() * g_Control.GetViewMatrix() * g_proj_matrix; Vector4 ScreenSize( (float)w, (float)h, 0.0f, 0.0f); float fTanW = FastMath::Tan( FastMath::DegToRad(g_fFOV) ); device->SetRenderTarget(0, g_pMainFramebuffer); device->SetDepthStencilSurface(g_pMainDepthbuffer); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0x0, 1.0f, 0); D3DXHANDLE shader = g_pParticleRenderFX->GetTechniqueByName("RenderParticle"); D3DXHANDLE positiontex_var = g_pParticleRenderFX->GetParameterByName(NULL, "PositionTex"); D3DXHANDLE velocitytex_var = g_pParticleRenderFX->GetParameterByName(NULL, "VelocityTex"); D3DXHANDLE wvp_matrix_var = g_pParticleRenderFX->GetParameterByName(NULL, "wvp_matrix"); D3DXHANDLE tan_fov_var = g_pParticleRenderFX->GetParameterByName(NULL, "fTanW"); D3DXHANDLE screensize_var = g_pParticleRenderFX->GetParameterByName(NULL, "ScreenSize"); D3DXHANDLE diffusetex_var = g_pParticleRenderFX->GetParameterByName(NULL, "DiffuseTex"); g_pParticleRenderFX->SetTechnique(shader); g_pParticleRenderFX->SetTexture(positiontex_var, g_pTextures[TEX_POSITION1]); g_pParticleRenderFX->SetTexture(velocitytex_var, g_pTextures[TEX_VELOCITY1]); g_pParticleRenderFX->SetMatrix(wvp_matrix_var, (D3DXMATRIX*)&wvp_matrix); g_pParticleRenderFX->SetVector(screensize_var, (D3DXVECTOR4*)&ScreenSize); g_pParticleRenderFX->SetFloat(tan_fov_var, fTanW); g_pParticleRenderFX->SetTexture(diffusetex_var, g_pParticleTexture); int num_processed_particles = (g_num_particles / g_texture_width) * g_texture_width; if ( num_processed_particles ) { device->SetFVF(D3DFVF_TEX1); g_pParticleRenderFX->Begin(NULL,0); g_pParticleRenderFX->BeginPass(0); //device->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); device->DrawPrimitiveUP(D3DPT_POINTLIST, num_processed_particles, g_pParticleArray, sizeof(sParticle)); //device->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE); g_pParticleRenderFX->EndPass(); g_pParticleRenderFX->End(); } }
void ExpLuminance(LPDIRECT3DSURFACE9 pSurace, LPDIRECT3DTEXTURE9 pTexture, sImageInfo *pInfo) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, pSurace); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("ExpLuminance"); D3DXHANDLE image_var = g_pExposureEffect->GetParameterByName(NULL, "Image"); g_pExposureEffect->SetTechnique(shader); g_pExposureEffect->SetTexture(image_var, pTexture); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(pInfo); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); }
static void RenderWater(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("Water"); D3DXHANDLE normalmap_var = g_pWaterEffect->GetParameterByName(NULL, "NormalmapTex"); D3DXHANDLE watermap_var = g_pWaterEffect->GetParameterByName(NULL, "WaterTex"); D3DXHANDLE texcoordscale_var = g_pWaterEffect->GetParameterByName(NULL, "fTexcoordScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(normalmap_var, g_pTextures[TEX_NORMAL]); g_pWaterEffect->SetTexture(watermap_var, g_pWaterTexture); g_pWaterEffect->SetFloat(texcoordscale_var, 0.2f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
//************************************************************************************************************* void DrawScene(LPD3DXEFFECT effect) { D3DXMATRIX world; D3DXMATRIX inv; D3DXVECTOR4 uv(3, 3, 0, 0); D3DXMatrixScaling(&world, 5, 0.1f, 5); D3DXMatrixInverse(&inv, NULL, &world); effect->SetMatrix("matWorld", &world); effect->SetMatrix("matWorldInv", &inv); effect->SetVector("uv", &uv); effect->Begin(0, 0); effect->BeginPass(0); { device->SetTexture(0, texture2); shadowreceiver->DrawSubset(0); if( !drawsilhouette ) { device->SetTexture(0, texture1); uv.x = uv.y = 1; effect->SetVector("uv", &uv); for( int i = 0; i < NUM_OBJECTS; ++i ) { D3DXMatrixInverse(&inv, NULL, &objects[i].world); effect->SetMatrix("matWorld", &objects[i].world); effect->SetMatrix("matWorldInv", &inv); effect->CommitChanges(); objects[i].object->DrawSubset(0); } } } effect->EndPass(); effect->End(); }
void DrawImage(LPDIRECT3DTEXTURE9 pSource, float x0, float y0, float w, float h, sImageInfo *pInfo, bool bRedOnly = false) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pPostEffect->GetTechniqueByName(bRedOnly ? "DrawImageRedChannel" : "DrawImage"); D3DXHANDLE pTextureVar = g_pPostEffect->GetParameterByName(NULL, "Image"); g_pPostEffect->SetTechnique(shader); g_pPostEffect->SetTexture(pTextureVar, pSource); // 設定頂點資料格式 device->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1); g_pPostEffect->Begin(NULL, 0); g_pPostEffect->BeginPass(0); GutDrawScreenQuad_DX9(x0, y0, w, h, pInfo); g_pPostEffect->EndPass(); g_pPostEffect->End(); }
static void HeightmapToNormal(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_NORMAL]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("ConvertNormal"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE normalscale_var = g_pWaterEffect->GetParameterByName(NULL, "fNormalScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT2]); g_pWaterEffect->SetFloat(normalscale_var, 1.0f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
void CollisionMesh::DrawMesh(const Matrix& projection, const Matrix& view, const D3DXVECTOR3& color) { if(m_draw && m_geometry) { LPD3DXEFFECT shader = m_geometry->GetShader(); D3DXMATRIX wvp = m_world.GetMatrix() * view.GetMatrix() * projection.GetMatrix(); shader->SetMatrix(DxConstant::WordViewProjection, &wvp); shader->SetTechnique(DxConstant::DefaultTechnique); shader->SetFloatArray(DxConstant::VertexColor, &(color.x), 3); UINT nPasses = 0; shader->Begin(&nPasses, 0); for(UINT pass = 0; pass < nPasses; ++pass) { shader->BeginPass(pass); m_geometry->GetMesh()->DrawSubset(0); shader->EndPass(); } shader->End(); } }
void DrawImage(LPDIRECT3DTEXTURE9 pSource, sImageInfo *pInfo) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); // 計算貼圖像素的貼圖座標間距 int w = pInfo->m_iWidth; int h = pInfo->m_iHeight; float fTexelW = 1.0f/(float)w; float fTexelH = 1.0f/(float)h; // Direct3D9會偏移半個像素, 從貼圖座標來把它修正回來 Vector4 vTexoffset(fTexelW*0.5f, fTexelH*0.5f, 0.0f, 1.0f); Vertex_VT quad[4]; memcpy(quad, g_FullScreenQuad, sizeof(quad)); for ( int i=0; i<4; i++ ) { quad[i].m_Texcoord[0] += vTexoffset[0]; quad[i].m_Texcoord[1] += vTexoffset[1]; } D3DXHANDLE shader = g_pEffect->GetTechniqueByName("DrawImage"); D3DXHANDLE pTextureVar = g_pEffect->GetParameterByName(NULL, "Image"); g_pEffect->SetTechnique(shader); g_pEffect->SetTexture(pTextureVar, pSource); // 設定頂點資料格式 device->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1); g_pEffect->Begin(NULL, 0); g_pEffect->BeginPass(0); device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex_VT)); g_pEffect->EndPass(); g_pEffect->End(); }
void ExpLuminance(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pFrameSurface[LUMINANCE_TEMP]); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("ExpLuminance"); D3DXHANDLE image_var = g_pExposureEffect->GetParameterByName(NULL, "Image"); g_pExposureEffect->SetTechnique(shader); g_pExposureEffect->SetTexture(image_var, g_pFrameBuffer[LUMINANCE_CURRENT]); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image1x1); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); SwapRenderTarget(LUMINANCE_TEMP, LUMINANCE_CURRENT); }
void AdaptiveLuminance(void) { static int count = 0; LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); if ( count ) { device->SetRenderTarget(0, g_pFrameSurface[LUMINANCE_TEMP]); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("AdaptiveLuminance"); g_pExposureEffect->SetTechnique(shader); Vector4 vSpeed(0.03f); D3DXHANDLE speed_var = g_pExposureEffect->GetParameterByName(NULL, "vAdaptiveSpeed"); D3DXHANDLE image0_var = g_pExposureEffect->GetParameterByName(NULL, "Image"); D3DXHANDLE image1_var = g_pExposureEffect->GetParameterByName(NULL, "Image2"); g_pExposureEffect->SetVector(speed_var, (D3DXVECTOR4*)&vSpeed); g_pExposureEffect->SetTexture(image0_var, g_pFrameBuffer[LUMINANCE_PREVIOUS]); g_pExposureEffect->SetTexture(image1_var, g_pFrameBuffer[LUMINANCE_CURRENT]); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image1x1); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); } else { device->StretchRect(g_pFrameSurface[LUMINANCE_CURRENT], NULL, g_pFrameSurface[LUMINANCE_TEMP], NULL, D3DTEXF_POINT); } // copy //device->StretchRect(g_pFrameSurface[LUMINANCE_TEMP], NULL, g_pFrameSurface[LUMINANCE_PREVIOUS], NULL, D3DTEXF_POINT); SwapRenderTarget(LUMINANCE_TEMP, LUMINANCE_PREVIOUS); count++; }
//************************************************************************************************************* void AdaptLuminance(float dt) { char othertex = 4 + (5 - adapttex); // adapt luminance with time into other 1x1 texture (ping-pong them) device->SetRenderTarget(0, avglumsurfaces[othertex]); device->SetTexture(0, avglumtargets[adapttex]); // old adapted luminance device->SetTexture(1, avglumtargets[3]); // result of MeasureLuminance() hdreffect->SetTechnique("adaptluminance"); hdreffect->SetFloat("elapsedtime", dt); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); device->SetTexture(5, avglumtargets[othertex]); adapttex = othertex; }
//************************************************************************************************************* void Render(float alpha, float elapsedtime) { D3DXMATRIX vp, inv; D3DXVECTOR3 axis(0, 1, 0); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff6694ed, 1.0f, 0); device->SetTexture(0, tex); device->SetTexture(1, normalmap); D3DXMatrixMultiply(&vp, &view, &proj); D3DXMatrixInverse(&inv, NULL, &view); effect->SetVector("eyePos", (D3DXVECTOR4*)inv.m[3]); D3DXMatrixRotationAxis(&world, &axis, timeGetTime() / 1000.0f); D3DXMatrixInverse(&inv, NULL, &world); effect->SetMatrix("matWorld", &world); effect->SetMatrix("matWorldInv", &inv); effect->SetMatrix("matViewProj", &vp); if( SUCCEEDED(device->BeginScene()) ) { effect->Begin(NULL, 0); effect->BeginPass(0); { mesh->DrawSubset(0); } effect->EndPass(); effect->End(); device->EndScene(); } device->Present(NULL, NULL, NULL, NULL); }