Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не отображается кубик. ранее все работало, пожалуйста помогите! 
V
    Опции темы
v_enom
Дата 6.5.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



пожалуйста помогите запустить простое отображение кубика с помощью индексной буферизации.
Да этого получалось все сделать, а теперь не знаю почему не отображается объект, только фон и окно.
Отследить где ошибка тоже не получается...


классы:
Код

#pragma once
#include "main.h"
#include "D3DSettings.h"
#include "InitialSettings.h"
#include "Object3D.h"

class GameApplication
{
    MSG                        msg;    
    HWND                    hWnd;             // Main window HWND

    char*                    errorMessage;      // текст сообщения об ошибке
    
    // акнивно ли устройств
    bool                    isLostDevice;      // Is the 3d device currently lost ?
    bool                    isActive;          // Is the application active ?
    ulong                    lastFrameRate;

    // direct 3d интерфейс
    LPDIRECT3D9             pD3D;             // Direct3D Object
    LPDIRECT3DDEVICE9       pD3DDevice;       // Direct3D Device Object
    
    D3DFILLMODE             fillMode;         // режим заливки    

    // объекты-члены других классов
    InitialSettings            *initial;            // объект инициализирующий DirectX
    Object3D                *objectsArray;        // сами 3D объекты
    int                        objectsNumber;        // число 3d фигур

public:
    GameApplication(void);
    ~GameApplication(void);

    
    int  Initialize(HINSTANCE hInstance);            // инициализация всех устройств
    int  BegingGameProcess();                        // начало начало игрового процесса
    int  ReleaseInterfaces();


protected:

    int  Animate();                                    // использование матриц поворотов и анимация
    int  CreateDisplay(HINSTANCE hInstance);        // задаем параметры дисплея
    int  BuildObjects();                            // строим компаненты
    void ClearAndShatDown();                        // заверешение игрового процесса и освобождение ресурсов
    
        // задаем состояния для D3D
    void SetupGameState();            
    void SetupRenderStates();


        //Вспомогательные функции
    int  ActiveteFrame();                            // функция отрисовки кадров


    
};


#pragma once
#include "main.h"
#include "Mesh.h"


class Object3D
{
public:
    Mesh*            pMesh;
    D3DXMATRIX        mtrxWorld;



    int CreateBox(LPDIRECT3DDEVICE9 pD3DDevice);
    int AnimateObject(LPDIRECT3DDEVICE9 pD3DDevice);
    Object3D(void);

    ~Object3D(void);
};


#pragma once
#include "main.h"
#include "Vertex.h"
class Mesh
{
public:

    ulong                   vertexCount;          // Number of vertices stored
    Vertex                  *pVerteces;             // Simple temporary vertex array.
    ulong                   indexCount;              // Number of indices stored
    ushort                 *pIndeces;             // Simple temporary index array


    LPDIRECT3DVERTEXBUFFER9        pVertexBuffer;    // Vertex Buffer to be Rendered
    LPDIRECT3DINDEXBUFFER9        pIndexBuffer;     // Index Buffer to be Rendered
    

    Mesh(void);
    ~Mesh(void);

    int  AddVerteces(ulong vertexNumber);                // функция выделяет новое место в массиве вершин pVerteces
    int  AddIndeces(ulong indexNumber);                    // функция выделяет новое место в массиве индексов
    void FormBox(LPDIRECT3DDEVICE9 pD3DDevice);            // просто создает кубик
    void ReleaseOldBuffers();                            // освобождает буферные интерфейсы
    int  BuildBuffers(LPDIRECT3DDEVICE9 pD3DDevice);    // заполняет буферы
    int  VertexBufCreateInMemory(LPDIRECT3DDEVICE9 pD3DDevice);
    int  IndexBufCreateInMemory(LPDIRECT3DDEVICE9 pD3DDevice);
};


#pragma once
#include "main.h"
 class Vertex
{
public:
    float x;
    float y;
    float z;
    ulong color;
    
    Vertex(void);
    Vertex(float x,float y,float z, double color);
    ~Vertex(void);
    
};



#pragma once

#include "main.h"
class InitialSettings
{
protected:
    WNDCLASSEX                windowsclass;        // класс окна    
    MSG                        msg;    
    HWND                    hWnd;                 // Main window HWND

// интерфейсы
    LPDIRECT3D9                pD3D;
    LPDIRECT3DDEVICE9        pD3DDevice;

    D3DDISPLAYMODE            Display;
    D3DPRESENT_PARAMETERS    Direct3DParametr;    
 

static    LRESULT CALLBACK MainWinProc (HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam );
void    SetDisplayParametrs();        // установка параметров дисплея
void    DeleteInterfaces();


public:
    InitialSettings(void);
    ~InitialSettings(void);
    // Get-методы
    HWND                GetHWND() {return hWnd;};
    LPDIRECT3DDEVICE9    GetD3Device() {return pD3DDevice;};
    LPDIRECT3D9            GetD3D() {return pD3D;};

    // другие открытые методы
    int        CreateWindowClass(HINSTANCE hInstance);                        // создает класс окна
    int        CreateDisplay();                                            // создает интерфейсы Direct3D и Диспля

};




Добавлено через 1 минуту и 59 секунд
Код



#include "main.h"
#include "GameApplication.h"


LRESULT CALLBACK MainWinProc (HWND hwnd,
                              UINT msg,
                              WPARAM wparam,
                              LPARAM lparam
                              )
{
    switch(msg)
    {
     case WM_PAINT:
        {

            ValidateRect(hwnd,NULL); // проприсовка всей клиентской области окна. NULL - проприсовка по-умолчанию
            break; 
        }
     case WM_DESTROY: 
         {
            
             PostQuitMessage(0);
        
         return 0;
         }

    }

    return (DefWindowProc(hwnd,msg,wparam,lparam));
}






int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR  lpCmdLine, int nShowCmd)
{



    GameApplication *gameAppl = new GameApplication[1];
    
    
    gameAppl->Initialize(hInstance);
    
    gameAppl->BegingGameProcess();        
        
    

    
// завершение работы программы
    
    delete[] gameAppl;
    gameAppl = NULL;
    return 1;

}



#include "GameApplication.h"

GameApplication::GameApplication(void)
{

    isLostDevice  = false;
    lastFrameRate = 0;
    fillMode      = D3DFILL_SOLID;
    errorMessage = new char[255];
}

GameApplication::~GameApplication(void)
{

if(errorMessage)    
    delete[] errorMessage;
    errorMessage = NULL;

if(objectsArray)    
    delete[] objectsArray;
    objectsArray = NULL;

if(initial)
    delete initial;
    initial    = NULL;

ReleaseInterfaces();
       
}


 // инициализация устройств
int GameApplication::Initialize(HINSTANCE hInstance)
{
    
     // Create the primary display device
    if (!CreateDisplay(hInstance)) 
            { 
                ClearAndShatDown();
                return false; 
            }

    // Build Objects
    if (!BuildObjects()) 
            { 
                ClearAndShatDown(); 
                return false;
            }



    // Set up all required game states
    SetupGameState();

    // Setup our rendering environment
    SetupRenderStates();

    return 1;
}


// начало игрового процесса
int GameApplication::BegingGameProcess()
{

    ShowWindow(hWnd,SW_SHOWDEFAULT);    
        UpdateWindow(hWnd);
        ZeroMemory(&msg,sizeof(msg));

        // обработка ошибок        
        while(msg.message!=WM_QUIT)
        {
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
            }
        
        else
                {
                    
                    ActiveteFrame();
                    
                }
        }
    return 1;
}





//----------------------------------------------------------------------------
//  Все закрытые функции:
//        ClearAndShatDown()
//        CreateDisplay()
//        BuildObjects()
//        SetupGameState()
//        SetupRenderStates()
//----------------------------------------------------------------------------

// завершение  и освобождение ресусов
void GameApplication::ClearAndShatDown()
{
        try
    {
            if(pD3DDevice)
            {
                pD3DDevice->Release();
                pD3DDevice = NULL;
            }

            if(pD3D)
            {
                pD3D->Release();
                pD3D = NULL;
            }
    }
    catch(...){}
    
}
int GameApplication::CreateDisplay(HINSTANCE hInstance)
{// задает параметры дисплея

    initial = new InitialSettings();

    if(!initial->CreateWindowClass(hInstance))
    {
         errorMessage = "не удалось создать окно программы";
         return 0;
    
    }


    if(!initial->CreateDisplay())
    {
         errorMessage = "не удалось установить парамтеры Direct3D";
         return 0;
    
    }
    else
    {
        hWnd = initial->GetHWND();

        
        pD3D = initial->GetD3D();
        pD3D->AddRef();

        
        pD3DDevice = initial->GetD3Device();
        pD3DDevice->AddRef();

        
        
        
    }

    
    
    return 1;
}

int  GameApplication::BuildObjects()
{// создает объекты
    
    objectsNumber = 1;

    objectsArray = new Object3D[objectsNumber];
    objectsArray[0].CreateBox(pD3DDevice);

        

    return 1;
}

void GameApplication::SetupGameState()
{// задает все игровые параметры

}

void GameApplication::SetupRenderStates()
{ // задает все параметры рендеринга

 // Setup our D3D Device initial states 
    pD3DDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
   // pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
    pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

    // Setup option dependant states
   // pD3DDevice->SetRenderState( D3DRS_FILLMODE, fillMode );                

    // Setup our vertex FVF code
    pD3DDevice->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE );


// включить альфа-блендинг и допустить альфа-смешивание
    pD3DDevice ->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
    // так определяется состояние смешивания
    pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
    pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

 // отключить отсечение direct3D
    pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);     // чтобы видеть все стороны объекта. D3DRS_CULLMODE - режим отсечения; 
                                                                      // D3DCULL_NONE  - запрет этого самого отсечения
                                                                      

}

int GameApplication::ActiveteFrame()
{ // функция отрисовки кадров

    pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(50,50,0),1.0f,0);
    Animate();
    pD3DDevice->BeginScene();
    ////////////////////////////
    
    for(int i=0;i<objectsNumber;i++)
    {
            // буфер вершин связываем с потоком данных устройства.            
            pD3DDevice->SetStreamSource(0,    objectsArray[i].pMesh->pVertexBuffer,0,sizeof(Vertex));
            // функция устанавливает формат вершин. 
            pD3DDevice->SetFVF(D3DFVF_FORMAT_DEFAULT);    
            // формат индексов
            pD3DDevice->SetIndices(objectsArray[i].pMesh->pIndexBuffer);            

            // вывод примитивов    
            pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,12,0,36);
    }
    
    ////////////////////////////
    pD3DDevice->EndScene();

pD3DDevice->Present(NULL,NULL,NULL,NULL);
    return 1;
}

int GameApplication::Animate()
{


    for(int i=0;i<objectsNumber;i++)
    {
        objectsArray[i].AnimateObject(pD3DDevice);
        
    }

    return 1;
}

int GameApplication::ReleaseInterfaces()
{
    try
    {
    if(pD3DDevice)
        pD3DDevice->Release();
        pD3DDevice = NULL;
    
    if(pD3D)
        pD3D->Release();
        pD3D = NULL;
    }
    catch(...){}

    

    return 1;
}





Добавлено через 3 минуты и 5 секунд
Код



#include "InitialSettings.h"

InitialSettings::InitialSettings(void)
{
    hWnd          = NULL;   
   
}

InitialSettings::~InitialSettings(void)
{
    hWnd          = NULL;
    DeleteInterfaces();
  
}



//----------------------------------------------------------------------
// MainWinProc
//----------------------------------------------------------------------
LRESULT CALLBACK InitialSettings::MainWinProc (HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam )
{

    switch(msg)
    {
     case WM_PAINT:
        {

            ValidateRect(hwnd,NULL); // проприсовка всей клиентской области окна. NULL - проприсовка по-умолчанию
            break; 
        }
     case WM_DESTROY: 
         {
             /*if(gameObject!=NULL)
                gameObject->DeleteDirect3D();*/
             PostQuitMessage(0);
        
         return 0;
         }

    }

    return (DefWindowProc(hwnd,msg,wparam,lparam));
}

int InitialSettings::CreateWindowClass(HINSTANCE hInstance)
{
    
    windowsclass.cbSize = sizeof(WNDCLASSEX);    
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hInstance;
    windowsclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    windowsclass.hCursor =  LoadCursor(NULL,IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    
    // регистрируем  класс
    if(!RegisterClassEx(&windowsclass)) return 0;        

    // можно создать окно
    if(!(hWnd = CreateWindowEx(NULL,"WINDOWSCLASS","Form Terrain from map",WS_OVERLAPPEDWINDOW | WS_VISIBLE,    0,0,1024,768,NULL,NULL,hInstance,NULL)))
       return 0;
    ZeroMemory(&msg,sizeof(msg));

    

    return 1;
}



int InitialSettings::CreateDisplay()
{// функция создания интерефйсов и дисплея

     pD3D = Direct3DCreate9( D3D_SDK_VERSION );
     if(!pD3D) 
     {// сбой          
         return 0;
     }


     if(FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display)))   // D3DADAPTER_DEFAULT - первичный адаптер по-умолчанию,
            {                                                                // Display - указатель на структуру D3DDISPLAYMODE с характеристиками,
                // сбой...                                                    // т.е. pMode
                return 0;                                                // FAILD - макрос проверки кода на наличие сбоя,                                            
            }
    


     
                                                                            
     
     // устанавливаем параметры дисплея.
     SetDisplayParametrs();
    


    if(FAILED( pD3D->CreateDevice(D3DADAPTER_DEFAULT,                // первичный адаптер, т.е. моя видяха
                                D3DDEVTYPE_HAL,                            // влияет на использования акселлерации видяхи. _HAL - используется.
                                hWnd,                                    // дискриптор главного окна
                                D3DCREATE_HARDWARE_VERTEXPROCESSING,    // обработка вершин. Программно.
                                &Direct3DParametr,                        // используем наши параметры
                                &pD3DDevice)))                        // результат от функции CreateDevice();
        {
        // сбой...
            return 0; 
        }

    return 1;
}



void InitialSettings::SetDisplayParametrs()
{// устанавливаем параметры дисплея.
    
    ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr));                    // Direct3DParametr - то что нам нужно очистить
                                                                            // sizeof(Direct3DParametr) - размер того, что надо очищать. Т.е. все поля D3DPRESENT_PARAMETER.

    Direct3DParametr.Windowed = true;                                        // видеорежим приложения, true - оконный режим 500х400 из в функции CreateWindowEx();
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;                    // для определения обмена буферов.
    Direct3DParametr.BackBufferFormat = Display.Format;                        // формат заднего буфера.

}


void InitialSettings::DeleteInterfaces()
{
    try
    {
            if(pD3DDevice)
            {
                pD3DDevice->Release();
                pD3DDevice = NULL;
            }

            if(pD3D)
            {
                pD3D->Release();
                pD3D = NULL;
            }
    }
    catch(...){}
}



#include "Object3D.h"

Object3D::Object3D(void)
{
}

Object3D::~Object3D(void)
{
    if(pMesh)
        delete pMesh;
        pMesh = NULL;
}


int Object3D::CreateBox(LPDIRECT3DDEVICE9 pD3DDevice)
{
pMesh = new Mesh();
pMesh->FormBox(pD3DDevice);


return 1;
}



int Object3D::AnimateObject(LPDIRECT3DDEVICE9 pD3DDevice)
{

    D3DXMATRIX worldMatrix;
    D3DXMATRIX worldMatrixRotation;
    D3DXMATRIX worldMatrixTranslation;

    D3DXMATRIX viewMatrix;
    D3DXMATRIX projectionMatrix;

    D3DXMATRIX worldMatrixX, worldMatrixY, worldMatrixZ, worldMatrixT;
    //float angle = 0.0f;

    //UINT Time;
    //// получаем время
    //Time = timeGetTime()%5000; 
    //// получаем угол вращения в радианах
    //FLOAT Angle =  Time* (2.0f*D3DX_PI)/5000.0f ;

    
    D3DXMatrixRotationZ(&worldMatrixRotation, 0); 

    pD3DDevice->SetTransform(D3DTS_WORLD,&worldMatrixRotation);

    D3DXMatrixTranslation(&worldMatrixTranslation, 0, 0, 0);


    D3DXMatrixMultiply(&worldMatrix,&worldMatrixRotation,&worldMatrixTranslation);
    
    mtrxWorld = worldMatrix;

    pD3DDevice->SetTransform(D3DTS_WORLD,&worldMatrix);
    //pDirect3dDevice->SetTransform(D3DTS_WORLD,&worldMatrix);


    // устанавливаем вид камеры
    D3DXMatrixLookAtLH(&viewMatrix, &D3DXVECTOR3(0.0f,0.0f,-22.0f),&D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
    pD3DDevice->SetTransform(D3DTS_VIEW,&viewMatrix);

    // устанавливаем проекцию
    D3DXMatrixPerspectiveFovLH(&projectionMatrix,D3DX_PI/4,1,1,100.f);
    pD3DDevice->SetTransform(D3DTS_PROJECTION,&projectionMatrix);
return 1;
}




Добавлено через 4 минуты и 33 секунды
Код

#include "Mesh.h"

Mesh::Mesh(void)
{
 vertexCount = 0;
 indexCount = 0;

 pVerteces = NULL;
 pIndeces = NULL;
 pVertexBuffer = NULL;
 pIndexBuffer = NULL;
}

Mesh::~Mesh(void)
{

    if( pVerteces)
        delete[] pVerteces;
    pVerteces = NULL;    
    
    
    if(pIndeces)
        delete[] pIndeces;
    pIndeces = NULL;

    
ReleaseOldBuffers();    
    
}


void Mesh::ReleaseOldBuffers()
{// освобождает буферные интерфейсы

    if(pVertexBuffer)
        pVertexBuffer->Release();
    pVertexBuffer = NULL;
    if(pIndexBuffer)
        pIndexBuffer->Release();
    pIndexBuffer = NULL;
}
int Mesh::AddVerteces(ulong newVertexNumber)
    { // функция выделяет новое место в массиве вершин pVerteces

        Vertex* tempArray;
        tempArray = new Vertex[vertexCount+newVertexNumber];
        if(pVertexBuffer)
            {
                memcpy(tempArray,pVerteces,sizeof(Vertex));                
                    delete[] pVerteces;
                    pVerteces = NULL;
            }
        

        pVerteces = tempArray;
        vertexCount+=newVertexNumber;


    return 1;
    }
int Mesh::AddIndeces(ulong newIndexNumber)
    {
        
    // функция выделяет новое место в массиве индексов
        
    ushort * pIndexBuffer = NULL;
    
    // Allocate new resized array
    if (!( pIndexBuffer = new USHORT[ indexCount + newIndexNumber ] )) return -1;

    // Если буфер уже был создан ранее, то его увеличим
    if ( pIndeces )
    {
        // Copy old data into new buffer
        memcpy( pIndexBuffer, pIndeces, indexCount * sizeof(USHORT) );      
        delete []pIndeces;
    } 
    
    pIndeces = pIndexBuffer;
    indexCount += newIndexNumber;

    


        return 1;
    }
int Mesh::BuildBuffers(LPDIRECT3DDEVICE9 pD3DDevice)
{// функция формирует буферы индексов и вершин


    // освобождает буферные интерфейсы
    ReleaseOldBuffers();



VertexBufCreateInMemory(pD3DDevice);
IndexBufCreateInMemory(pD3DDevice);

    return 1;
}


PM MAIL   Вверх
v_enom
Дата 7.5.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



стоит быть внимательнее с параметрами рендеринга, особенно со смешиванием. Неправильное его использование (сам не заметил, что было включено альфа-смешивание) может повредить работать

Код

// включить альфа-блендинг и допустить альфа-смешивание
//    pD3DDevice ->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
    // так определяется состояние смешивания
//    pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
//    pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




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


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

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