Может ты имел ввиду побочный эффект растеризации текстуры при CULLMODE_NONE? Я чучуть подправил код и изменил параметр линковщика чтобы программа вызвала консоль для вывода инфы, нажатием на клавишу 'c', переключаешь CULLMODE от 0 до 2, здесь требуется обход треугольников по часовой стрелке - "D3DCULLMODE_CW".
| Код | #include <Windows.h> #include <tchar.h> #include <d3dx9.h> #include <iostream> #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "winmm.lib")
using namespace std;
DWORD cm = 0;
TCHAR szWindowClass[] = _T("GPWDirectX"); TCHAR szWindowTitle[] = _T("Graphics programming with DirectX"); IDirect3D9 *g_pDirect = NULL; IDirect3DDevice9 *g_pDevice = NULL; ID3DXMesh *g_pTempMesh, *g_pSphereMesh = NULL; IDirect3DTexture9 *g_pTexture = NULL; D3DXMATRIX g_mWorld, g_mView, g_mProjection; struct CUSTOMVERTEX { FLOAT x, y, z; FLOAT nx, ny, nz; FLOAT tu, tv; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int main() { WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szWindowClass; wc.lpszMenuName = NULL; wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_OWNDC; if (!RegisterClass(&wc)) { return 0; } HWND hWnd = CreateWindow(szWindowClass, szWindowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, NULL, NULL); if (!hWnd) { return 0; } g_pDirect = Direct3DCreate9(D3D_SDK_VERSION); if (g_pDirect == NULL) { } D3DDISPLAYMODE dm; HRESULT hr = g_pDirect->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm); if (FAILED(hr)) { } D3DPRESENT_PARAMETERS pp; ZeroMemory(&pp, sizeof(D3DPRESENT_PARAMETERS)); pp.BackBufferFormat = dm.Format; pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.Windowed = TRUE; hr = g_pDirect->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &g_pDevice); if (FAILED(hr)) { } g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //g_pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); hr = D3DXCreateSphere(g_pDevice, 1.0f, 25, 25, &g_pTempMesh, NULL); if (FAILED(hr)) { } hr = D3DXCreateTextureFromFile(g_pDevice, _T("coffe.jpg"), &g_pTexture); if (FAILED(hr)) { MessageBox(0, "Not texture", "ERROR", MB_OK | MB_ICONERROR); } g_pTempMesh->CloneMeshFVF(g_pTempMesh->GetOptions(), D3DFVF_CUSTOMVERTEX, g_pDevice, &g_pSphereMesh); CUSTOMVERTEX *cv; g_pSphereMesh->LockVertexBuffer(0, (void **)&cv); if (SUCCEEDED(hr)) { int nCount = g_pSphereMesh->GetNumVertices(); for (int i = 0; i < nCount; i++) { cv->tu = asinf(cv->nx) / D3DX_PI + 0.5f; cv->tv = asinf(cv->ny) / D3DX_PI + 0.5f; cv++; } } g_pSphereMesh->UnlockVertexBuffer(); g_pTempMesh->Release(); ShowWindow(hWnd, 1); UpdateWindow(hWnd); MSG msg; ZeroMemory(&msg, sizeof(MSG));
static float lastTime = (float)timeGetTime();
while (msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); D3DXMatrixLookAtLH(&g_mView, &D3DXVECTOR3(0.0f, 0.0f, -10.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); g_pDevice->SetTransform(D3DTS_VIEW, &g_mView); D3DXMatrixPerspectiveFovLH(&g_mProjection, D3DX_PI / 4, 1.0f, 1.0f, 100.0f); g_pDevice->SetTransform(D3DTS_PROJECTION, &g_mProjection); float currTime = (float)timeGetTime(); float timeDelta = (currTime - lastTime) * 0.001f; static FLOAT fAngle = .0f; fAngle += timeDelta;
if( fAngle >= 6.28f ) fAngle = 0.0f;
g_pDevice->BeginScene();
g_pDevice->SetTexture(0, g_pTexture);
D3DXMatrixRotationY(&g_mWorld, fAngle); D3DXMATRIX trans; D3DXMatrixTranslation(&trans, 1.25f, .0f, .0f); g_mWorld = g_mWorld * trans;
g_pDevice->SetTransform(D3DTS_WORLD, &g_mWorld);
g_pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
g_pSphereMesh->DrawSubset(0);
D3DXMatrixRotationY(&g_mWorld, fAngle); D3DXMatrixTranslation(&trans, -1.25f, .0f, .0f); g_mWorld = g_mWorld * trans;
g_pDevice->SetTransform(D3DTS_WORLD, &g_mWorld); g_pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
g_pSphereMesh->DrawSubset(0);
g_pDevice->EndScene(); g_pDevice->Present(NULL, NULL, NULL, NULL);
system("cls"); cout<<"lastTime = "<<lastTime<<endl<<"fAngle = "<<fAngle<<endl<<"timeDelta = "<<timeDelta<<endl<<"CULLMODE = "<<cm;
lastTime = currTime;
//Sleep(100); } } return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: g_pTexture->Release(); g_pSphereMesh->Release(); g_pDevice->Release(); g_pDirect->Release(); PostQuitMessage(0); break;
case WM_KEYDOWN: switch(wParam) { case 0x43: if(cm < 2) cm++; else cm = 0;
g_pDevice->SetRenderState(D3DRS_CULLMODE, cm);
g_pDevice->GetRenderState(D3DRS_CULLMODE, &cm); //--Всё честно, получаем текущий режим рендеринга, который будет выведен в консоль--
break; } default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
|
Программе нужен файл coffe.jpg в текущей директории.
З.Ы. Не забывай перед использованием ресурсов делать проверки на их существование. Так, например, при получении окном сообщения WM_DESTROY ты пытаешься освободить ресурс текстуры, но не факт что она есть ;) |