Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> D3DXCreateSphere текстура 
V
    Опции темы
romanbiller
Дата 19.5.2013, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



Люди помогите плиз уже заколебался как отобразить текстуру на сфере???
вот код
Код

#include <Windows.h>
#include <tchar.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9mesh.h>
#include <d3dx9shape.h>
#include <MMSystem.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "winmm.lib")

TCHAR szWindowClass[] = _T("GPWDirectX");
TCHAR szWindowTitle[] = _T("Graphics programming with DirectX");

IDirect3D9 *g_pDirect = NULL;
IDirect3DDevice9 *g_pDevice = NULL;
ID3DXMesh *g_pMesh = NULL;
D3DXMATRIX g_mWorld, g_mView, g_mProjection;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
    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, hInstance, 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_NONE);
    g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

    //hr = D3DXCreateSphere(g_pDevice, 1.0f, 20, 20, &g_pMesh, NULL);
    //if (FAILED(hr))
    //{
    //}

    hr = D3DXCreateBox(g_pDevice, 2.0f, 2.0f, 2.0f, &g_pMesh, NULL);
    if (FAILED(hr))
    {
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));
    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);
            g_pDevice->BeginScene();

            UINT uTime = timeGetTime() % 5000;
            FLOAT fAngle = uTime * (2.0f * D3DX_PI) / 5000.0f;
            D3DXMatrixRotationX(&g_mWorld, fAngle);
            g_pDevice->SetTransform(D3DTS_WORLD, &g_mWorld);

            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);

            g_pMesh->DrawSubset(0);

            g_pDevice->EndScene();
            g_pDevice->Present(NULL, NULL, NULL, NULL);
        }
    }
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        g_pMesh->Release();
        g_pDevice->Release();
        g_pDirect->Release();
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

PM MAIL   Вверх
KaZepKa
Дата 20.5.2013, 03:15 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



Обязательно вручную рисовать сферу и текстуру наклеивать?
Если нет, то по моему проще нарисовать эту сферу в блендере или 3дс максе, наклеить там нужную текстуру, конвертировать модель в формат .X и грузануть её.
Еще если не ошибаюсь, то из-за какого-то g_pDevice->SetRenderState может не отображаться текстура, а просто пустая фигура.
PM MAIL   Вверх
romanbiller
Дата 21.5.2013, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



Короче поковырял ещё в инете наложить текстуру получилось да только получилась какая то муть

вот код
Код

#include <Windows.h>
#include <tchar.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9mesh.h>
#include <d3dx9shape.h>
#include <MMSystem.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "winmm.lib")

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 APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
    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, hInstance, 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_NONE);
    g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

    hr = D3DXCreateSphere(g_pDevice, 1.0f, 100, 100, &g_pTempMesh, NULL);
    if (FAILED(hr))
    {
    }

    hr = D3DXCreateTextureFromFile(g_pDevice, _T("C:\\Users\\Роман\\Documents\\Visual Studio 2010\\Projects\\Graphics programming with DirectX\\Debug\\earth.jpg"), &g_pTexture);
    if (FAILED(hr))
    {
    }

    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, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));
    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);
            g_pDevice->BeginScene();

            UINT uTime = timeGetTime() % 5000;
            FLOAT fAngle = uTime * (1.0f * D3DX_PI) / 5000.0f;
            D3DXMatrixRotationY(&g_mWorld, fAngle);
            g_pDevice->SetTransform(D3DTS_WORLD, &g_mWorld);

            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);
            
            g_pDevice->SetTexture(0, g_pTexture);

            g_pSphereMesh->DrawSubset(0);

            g_pDevice->EndScene();
            g_pDevice->Present(NULL, NULL, NULL, NULL);
        }
    }
    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;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}


мне кажется проблемма в этом участке кода
Код

        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++;
        }

я тупо содрал его из нета а разобраться в нем не могу
помогите кто чем.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  gpwdirectx.exe 613,00 Kb
PM MAIL   Вверх
EgoBrain
Дата 22.5.2013, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Вначале подумал что не отображается текстура изза отсутсвия освещения, потом вспомнил что освещение не влияет..
Что именно не устраивает в том, как сфера затекстурировалась, что за "муть"?

Вот как структурирован код, это точно муть. Еще подключаешь кучу ненужных загловочных файлов, достаточно трёх (на самом деле дажу и двух):
Код

#include <Windows.h>
#include <tchar.h> //--Можно без многобойтовой кодирвоки обойтись--
#include <d3dx9.h>


Это сообщение отредактировал(а) EgoBrain - 22.5.2013, 01:22
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 22.5.2013, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Может ты имел ввиду побочный эффект растеризации текстуры при 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 ты пытаешься освободить ресурс текстуры, но не факт что она есть ;)

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  TexturedSphere.zip 109,89 Kb
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 22.5.2013, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



EgoBrain
Цитата

Что именно не устраивает в том, как сфера затекстурировалась, что за "муть"?

Отвечаю текстура наложилась просто она растянулась и перевернулась в верх тормашками
то же получается и с вашим примером если заменить текстуру

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  coffe.zip 722,25 Kb
PM MAIL   Вверх
kurlyak
Дата 11.6.2013, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 7.11.2007

Репутация: 1
Всего: 3



Блин, с годами умников на Винграде не меньше...

Код

LPD3DXMESH pMesh;
if(FAILED(D3DXCreateSphere(p_d3d_Device, 10, 10, 10, &pMesh, NULL))) return;
if(FAILED(pMesh->CloneMeshFVF(D3DXMESH_SYSTEMMEM, D3DVERTEX_FVF, p_d3d_Device, &g_pMeshSphere ))) return;
pMesh->Release();
pMesh = NULL;

DWORD *pAdjacency = new DWORD [g_pMeshSphere->GetNumFaces() * 3];
if(FAILED(g_pMeshSphere->GenerateAdjacency(0.001f, pAdjacency))) return;
if(FAILED(D3DXComputeNormals(g_pMeshSphere, pAdjacency))) return;


D3DVERTEX *v=0;

if(FAILED(g_pMeshSphere->LockVertexBuffer(0, (void**)&v))) return;
for (UINT i=0; i<g_pMeshSphere->GetNumVertices(); i++)
{
    
D3DXVECTOR3 p = v[i].p;
float theta = atan2f(p.z, p.x);
float phi = acosf(p.y / sqrtf(p.x*p.x+p.y*p.y+p.z*p.z));

v[i].tu = theta / (2.0f * D3DX_PI);
v[i].tv = phi / D3DX_PI;
    
    
}
if(FAILED(g_pMeshSphere->UnlockVertexBuffer())) return;

if(FAILED(g_pMeshSphere->GetVertexBuffer(&m_pSkyVB))) return;
if(FAILED(g_pMeshSphere->GetIndexBuffer(&m_pSkyIB))) return;
m_dwNumSkyVertices= g_pMeshSphere->GetNumVertices();
m_dwNumSkyFaces =g_pMeshSphere->GetNumFaces();



if(FAILED(D3DXCreateTextureFromFile( p_d3d_Device, ".\\Data\\Skybox.jpg", &g_pTexSphere ))) return;

}

void CSkybox::Draw()
{
if(FAILED(p_d3d_Device->SetRenderState(D3DRS_WRAP0, D3DWRAP_U))) return;

if(FAILED(p_d3d_Device->SetFVF( D3DVERTEX_FVF))) return;
if(FAILED(p_d3d_Device->SetTexture(0, g_pTexSphere))) return;
if(FAILED(p_d3d_Device->SetStreamSource( 0, m_pSkyVB, 0, sizeof(D3DVERTEX) ))) return;
if(FAILED(p_d3d_Device->SetIndices( m_pSkyIB ))) return;
                  
if(FAILED(p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumSkyVertices,
                                            0, m_dwNumSkyFaces ))) return;

    

if(FAILED(p_d3d_Device->SetRenderState(D3DRS_WRAP0, 0))) return;


}





А для ясности тебе romanbiller говорю печатными буквами - ни CreateBox ни CreateSphere в DirectX не работает так как бы хотелось ламеру. То есть бокс и сферу создает- но текстурные координаты нужно заполнять самостоятельно. То есть ты прав- локать вертексный буфер и запонять текст. координатами САМОСТОЯТЕЛЬНО. Код тебе я предоставил.
PM MAIL   Вверх
romanbiller
Дата 17.6.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



Всё получилось. Всем большущее спасибо отдельное спасибо kurlyak благодаря его примеру всё заработало.
PM MAIL   Вверх
EgoBrain
Дата 18.6.2013, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(romanbiller @  17.6.2013,  15:13 Найти цитируемый пост)
Всё получилось. Всем большущее спасибо отдельное спасибо kurlyak благодаря его примеру всё заработало. 

Да, вот только что толку, всё равно не понятно как с текстурными координатами на сложных поверхностях работать, что за формулы применены. Как прямоугольная картинка стала вдруг сферической, и причем тут смежности вершин...
 smile 

Это сообщение отредактировал(а) EgoBrain - 18.6.2013, 02:18
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 18.6.2013, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



Причём смежности не знаю сам да и если убрать вот этот кусок кода
Код

DWORD *pAdjacency = new DWORD [g_pMeshSphere->GetNumFaces() * 3];
if(FAILED(g_pMeshSphere->GenerateAdjacency(0.001f, pAdjacency))) return;

то всё равно будет работать ну а что происходит здесь
Код

float theta = atan2f(p.z, p.x);
float phi = acosf(p.y / sqrtf(p.x*p.x+p.y*p.y+p.z*p.z));
v[i].tu = theta / (2.0f * D3DX_PI);
v[i].tv = phi / D3DX_PI;

нужно поковырять и подумать хорошенко
PM MAIL   Вверх
romanbiller
Дата 18.6.2013, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.5.2013

Репутация: нет
Всего: нет



афигеть если убрать иэтот участок кода
Код

if(FAILED(D3DXComputeNormals(g_pMeshSphere, pAdjacency))) return;

тоже работает.

Чтож здесь вообще происходит
Код

DWORD *pAdjacency = new DWORD [g_pMeshSphere->GetNumFaces() * 3];
if(FAILED(g_pMeshSphere->GenerateAdjacency(0.001f, pAdjacency))) return;
if(FAILED(D3DXComputeNormals(g_pMeshSphere, pAdjacency))) return;


D3DVERTEX *v=0;

if(FAILED(g_pMeshSphere->LockVertexBuffer(0, (void**)&v))) return;
for (UINT i=0; i<g_pMeshSphere->GetNumVertices(); i++)
{
    
D3DXVECTOR3 p = v[i].p;
float theta = atan2f(p.z, p.x);
float phi = acosf(p.y / sqrtf(p.x*p.x+p.y*p.y+p.z*p.z));

v[i].tu = theta / (2.0f * D3DX_PI);
v[i].tv = phi / D3DX_PI;
    
    
}

Кто нибудь сможет с обяснением помоч???
PM MAIL   Вверх
EgoBrain
Дата 19.6.2013, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Значит смежности он использовал ради хорошего тона, а не для правильного координирования текстур. Смежности позволяют экономить память/такты, так как смежные треугольники имеют одни и теже координаты некоторых вершин, вобщем прочитай про смежности. По теме требуется заострить внимание на этом участке:
Код

D3DVERTEX *v=0;
if(FAILED(g_pMeshSphere->LockVertexBuffer(0, (void**)&v))) return;
for (UINT i=0; i<g_pMeshSphere->GetNumVertices(); i++)
{    
D3DXVECTOR3 p = v[i].p;
float theta = atan2f(p.z, p.x);
float phi = acosf(p.y / sqrtf(p.x*p.x+p.y*p.y+p.z*p.z));
v[i].tu = theta / (2.0f * D3DX_PI);
v[i].tv = phi / D3DX_PI;    
}

Здесь нужны знания линейной алгебры аркосинуса и аркосинуса и арктангенса..
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.