📄 main.cpp
字号:
LPD3DXBUFFER pBuffer = NULL;
BYTE *pbyBits = NULL;
int texElemCount = w*h*4;
float *texData = new float[texElemCount];
D3DLOCKED_RECT rfTextureLock;
LPDIRECT3DSURFACE9 pSurf, pVectorTextureSurface;
PDIRECT3DTEXTURE9 pTex;
g_pD3DDevice->CreateTexture(h,w,0, NULL, D3DFMT_A32B32G32R32F, D3DPOOL_SYSTEMMEM, &pTex, NULL);
pTex->GetSurfaceLevel(0,&pSurf);
pColorMap->GetSurfaceLevel(0,&pVectorTextureSurface);
g_pD3DDevice->GetRenderTargetData(pVectorTextureSurface, pSurf);
pTex->LockRect(0, &rfTextureLock, NULL, D3DLOCK_READONLY); // lock whole region in the vector texture
float* pfTexture = (float*)rfTextureLock.pBits;
memcpy(texData,pfTexture,texElemCount*sizeof(float));
pTex->UnlockRect(0);
for(int i = 0 ; i < 4 ; i++ )
data[i] = texData[i];
delete texData;
SafeRelease(pSurf);
SafeRelease(pTex);
SafeRelease(pVectorTextureSurface);
SafeRelease( pBuffer );
}
bool RenderResult(LPDIRECT3DSURFACE9 &pSurface,int i,LPDIRECT3DVERTEXBUFFER9 &pBuffer,char * strTechName)
{
UINT nPasses;
if(g_pD3DDevice->SetRenderTarget(0,pSurface)!= D3D_OK )
MessageBox(NULL,"Failed!","Info",IDOK);
g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
g_pD3DDevice->BeginScene();
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->SetStreamSource(0, pBuffer,0, sizeof(CUSTOMVERTEX));
D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( strTechName );
g_pEffect->SetTechnique( hTechnique );
g_pEffect->SetTexture("ColorMapBestGene", g_pBestGene[i]);
g_pEffect->Begin( &nPasses, 0 );
g_pEffect->BeginPass(0);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
g_pEffect->EndPass();
g_pEffect->End();
g_pD3DDevice->EndScene();
return true;
}
bool RenderResult()
{
float resultData[DIM];
float fit[4];
for(int i = 0 ; i < DIM / 4 ; i++ )
{
RenderResult(g_pResultSurface[i],i,g_pBestBuffer,"TShader_ResultGene");
SaveResultTexture(resultData + i * 4,1,1,g_pResultTexture[i]);
}
SaveResultTexture(fit,1,1,g_pResultBestFitTexture);
FILE* flog = fopen("C:\\result.txt","a++");
if(FUCTION == FUCTION_1)
fprintf(flog,"测试函数:函数(1)\n");
else
fprintf(flog,"测试函数:函数(2)\n");
fprintf(flog,"种群大小: %d, 实际种群大小:%d, 维数%d\n",g_nPopSize, g_nHeight * g_nWidth,DIM);
fprintf(flog,"迭代次数: %d 编码长度: %d\n",g_nGeneration,g_nLChrom);
fprintf(flog,"交叉率: %0.2f, 变异率:%0.2f\n\n",g_pCross,g_pMutation);
for(i = 0 ; i < DIM ; i++)
{
fprintf(flog,"基因%d : %0.4f\n",i,resultData[i]);
}
fprintf(flog,"\n适应值: %0.4f 运行时间:%d\n\n\n",fit[0],t2 - t1);
fclose(flog);
return true;
}
bool Display()
{
if( g_bRender)
{
t1 = GetTickCount();
RenderFit();
RenderBest();
for(int j = 1 ; j < g_nGeneration ; j++ )
{
RenderSelect();
RenderCross();
RenderMutation();
RenderFit();
RenderBest();
//RenderResult();
}
t2 = GetTickCount();
RenderResult();
g_pD3DDevice->Present(0, 0, 0, 0);
char str[40];
sprintf(str,"%d",t2 - t1);
MessageBox(NULL,str,"Info",IDOK);
g_bRender = false;
}
else
{
g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
g_pD3DDevice->BeginScene();
g_pD3DDevice->EndScene();
g_pD3DDevice->Present(0, 0, 0, 0);
}
return true;
}
void CleanUp()
{
SafeRelease(g_pD3D);
SafeRelease(g_pD3DDevice);
SafeRelease(g_pBuffer);
SafeRelease(g_pEffect);
SafeRelease(g_pBackBuffer);
for(int i = 0 ; i < 20 ; i++)
{
SafeRelease(g_pSubBuffer[i]);
SafeRelease(g_pSubTexture[i]);
SafeRelease(g_pSubSurface[i]);
}
for(i = 0 ; i < DIM / 4 ; i++)
{
SafeRelease(g_pGeneTexture1[i]);
SafeRelease(g_pGeneTexture2[i]);
SafeRelease(g_pGeneSurface1[i]);
SafeRelease(g_pGeneSurface2[i]);
SafeRelease(g_pBestGeneTexture1[i]);
SafeRelease(g_pBestGeneSurface1[i]);
SafeRelease(g_pResultSurface[i]);
SafeRelease(g_pResultTexture[i]);
}
SafeRelease(g_pFitTexture);
SafeRelease(g_pFitSurface);
SafeRelease(g_pBestFitTexture1);
SafeRelease(g_pBestFitSurface1);
SafeRelease(g_pBestFitSurface2);
SafeRelease(g_pBestFitTexture2);
SafeRelease(g_pBestBuffer);
SafeRelease(g_pCrossCtrBuffer);
SafeRelease(g_pSelCtrSurface);
SafeRelease(g_pSelCtrTexture);
SafeRelease(g_pRandTexture);
SafeRelease(g_pCrsCtrSurface);
SafeRelease(g_pCrsCtrTexture);
SafeRelease(g_pPosTexture);
}
void Reset()
{
g_nHeight = 1;
g_nWidth = 1;
Num = 0;
SafeRelease(g_pBuffer);
for(int i = 0 ; i < 20 ; i++)
{
SafeRelease(g_pSubBuffer[i]);
SafeRelease(g_pSubTexture[i]);
SafeRelease(g_pSubSurface[i]);
}
for(i = 0 ; i < DIM / 4 ; i++)
{
SafeRelease(g_pGeneTexture1[i]);
SafeRelease(g_pGeneTexture2[i]);
SafeRelease(g_pGeneSurface1[i]);
SafeRelease(g_pGeneSurface2[i]);
SafeRelease(g_pBestGeneTexture1[i]);
SafeRelease(g_pBestGeneSurface1[i]);
SafeRelease(g_pBestGeneTexture2[i]);
SafeRelease(g_pBestGeneSurface2[i]);
SafeRelease(g_pResultSurface[i]);
SafeRelease(g_pResultTexture[i]);
}
SafeRelease(g_pFitTexture);
SafeRelease(g_pFitSurface);
SafeRelease(g_pBestFitTexture1);
SafeRelease(g_pBestFitSurface1);
SafeRelease(g_pBestFitSurface2);
SafeRelease(g_pBestFitTexture2);
SafeRelease(g_pBestBuffer);
SafeRelease(g_pCrossCtrBuffer);
SafeRelease(g_pSelCtrSurface);
SafeRelease(g_pSelCtrTexture);
SafeRelease(g_pRandTexture);
SafeRelease(g_pCrsCtrSurface);
SafeRelease(g_pCrsCtrTexture);
SafeRelease(g_pPosTexture);
}
void GameLoop()
{
//Enter the game loop
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
{
//Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Display();
if(g_bStopRun == false)
SendMessage(g_hWnd,WM_COMMAND,ID_RUN,NULL);
}
}
}
//The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch (wParam)
{
case VK_ESCAPE:
//User has pressed the escape key, so quit
DestroyWindow(hWnd);
return 0;
break;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_EXIT:
DestroyWindow(hWnd);
return 0;
case ID_RUN:
//g_bRender = true;
DialogBox(g_hInstance, (LPCTSTR)IDD_DIALOG ,hWnd, (DLGPROC)SetParamProc);
if(g_bRender == true)
{
Reset();
InitGA();
InitBuffer();
}
break;
}
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//Register the window class
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"SobleShader", NULL};
RegisterClassEx(&wc);
g_hInstance = hInst;
//Create the application's window
HWND hWnd = CreateWindow("SobleShader", "shader test program",
WS_OVERLAPPEDWINDOW, 300, 200, 400 , 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
HMENU hMenu = LoadMenu(wc.hInstance,MAKEINTRESOURCE(IDR_MENU1));
SetMenu(hWnd,hMenu);
g_hWnd = hWnd;
//Initialize Direct3D
if(SUCCEEDED(InitialiseD3D(hWnd)))
{
//Show our window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
GameLoop();
}
CleanUp();
UnregisterClass("DX Project 3", wc.hInstance);
return 0;
}
char sPopsize[20], sGeneration[20],sPcross[20],sMutation[20];
int recordFuction = IDC_FUCTION_1;
int bFirst = true;
LRESULT CALLBACK SetParamProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
if(bFirst)
{
strcpy(sPopsize,"200");
strcpy(sGeneration,"100");
strcpy(sPcross,"0.4");
strcpy(sMutation,"0.05");
bFirst = false;
}
SetWindowText(GetDlgItem(hDlg,IDC_DIM),"8");
SetWindowText(GetDlgItem(hDlg,IDC_LCHROM),"24");
SetWindowText(GetDlgItem(hDlg,IDC_POPSIZE),sPopsize);
SetWindowText(GetDlgItem(hDlg,IDC_GENERATION),sGeneration);
SetWindowText(GetDlgItem(hDlg,IDC_PCROSS),sPcross);
SetWindowText(GetDlgItem(hDlg,IDC_PMUTATION),sMutation);
CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2, recordFuction) ;
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
GetWindowText(GetDlgItem(hDlg,IDC_POPSIZE),sPopsize,20);
GetWindowText(GetDlgItem(hDlg,IDC_GENERATION),sGeneration,20);
GetWindowText(GetDlgItem(hDlg,IDC_PCROSS),sPcross,20);
GetWindowText(GetDlgItem(hDlg,IDC_PMUTATION),sMutation,20);
g_nPopSize = StrToInt(sPopsize);
g_nGeneration = StrToInt(sGeneration);
g_pCross = (float)atof(sPcross);
g_pMutation = (float)atof(sMutation);
EndDialog(hDlg, LOWORD(wParam));
g_bStopRun = false;
g_bRender = true;
return TRUE;
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
g_bStopRun = true;
g_bRender = false;
return TRUE;
case IDC_FUCTION_1:
FUCTION = FUCTION_1;
recordFuction = IDC_FUCTION_1;
CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2, IDC_FUCTION_1) ;
break;
case IDC_FUCTION_2:
FUCTION = FUCTION_2;
recordFuction = IDC_FUCTION_2;
CheckRadioButton (hDlg, IDC_FUCTION_1, IDC_FUCTION_2, IDC_FUCTION_2) ;
break;
};
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -