|
|
Pagina 1 din 1
[
1
]
| Mesaj |
Info autor |
Postat la 28 Dec 2008 16:08:37 Subiect: intrebare legata de direct x
|
|
|
Fuzzball info:
|
Fuzzball:
Incerc sa fac un wrapper pentru un vertex buffer in directX . O clasa care sa imi permita sa stochez mai multe vertexuri intr-o matrice si apoi sa le desenez cu o functie.Programul de proba consta in desenarea unui triunghi pe ecran. Din pacate nu imi deseneaza niciun triunghi (ecranul e gol) Ceva de genu (am strans mai multe bucati de cod din mai multe fisiere intr-un singur loc): Cod sursă:
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; //from the D3DFVF_XYZRHW flag
DWORD color; //from the D3DFVF_DIFFUSE flag
};
CUSTOMVERTEX vertexA = { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), };
CUSTOMVERTEX vertexB = { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), };
CUSTOMVERTEX vertexC = { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), };
//----------------------------------------------------------------------------
//d3dDev este device-ul de la directX
//monstra de folosire a clasei CVertices
vertices = new CVertices( 3, //numarul de vertice
d3dDev );
vertices->AddVertex(vertexA);
vertices->AddVertex(vertexB);
vertices->AddVertex(vertexC);
//functie in care incarc in memorie verticele
vertices->LoadBuffer();
//functie care deseneaza verticele
vertices->DrawVertices();
functia LoadBuffer() obs: partea de jos comentata daca o decomentez si comentez prima parte atunci imi merge perfect ( deseneaza triunghiul pe ecran) Cod sursă:
int CVertices::LoadBuffer() //load the vertices into video memory
{
HRESULT result;
result = m_Dev->CreateVertexBuffer(m_number*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&t_buffer,
NULL);
assert( result == D3D_OK );
VOID* pVoid; //a void pointer
// lock t_buffer and load the vertices into it
t_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, m_points, sizeof(m_points));
t_buffer->Unlock();
return 1;
// // create the vertices using the CUSTOMVERTEX struct
// CUSTOMVERTEX t_vert[] =
// {
// { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
// { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
// { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
// };
//
// // create a vertex buffer interface called t_buffer
// m_Dev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
// 0,
// CUSTOMFVF,
// D3DPOOL_MANAGED,
// &t_buffer,
// NULL);
//
// VOID* pVoid; // a void pointer
//
// // lock t_buffer and load the vertices into it
// t_buffer->Lock(0, 0, (void**)&pVoid, 0);
// memcpy(pVoid, t_vert, sizeof(t_vert));
// t_buffer->Unlock();
//
// return 1 ;
}
functia DrawVertices() care este chemata in fiecare frame obs: partea de jos comentata daca o decomentez si comentez prima parte atunci imi merge perfect ( deseneaza triunghiul pe ecran) Cod sursă: int CVertices::DrawVertices() //call this per frame
{
HRESULT result;
m_Dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
m_Dev->BeginScene();
// select which vertex format we are using
result = m_Dev->SetFVF(CUSTOMFVF);
assert( result == D3D_OK );
// select the vertex buffer to display
result = m_Dev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));
assert( result == D3D_OK );
// copy the vertex buffer to the back buffer
result = m_Dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
assert( result == D3D_OK );
m_Dev->EndScene();
result = m_Dev->Present(NULL, NULL, NULL, NULL);
assert( result == D3D_OK );
//--------------------------------------------------------------------------------------------
// m_Dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//
// m_Dev->BeginScene();
//
// // select which vertex format we are using
// m_Dev->SetFVF(CUSTOMFVF);
//
// // select the vertex buffer to display
// m_Dev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));
//
// // copy the vertex buffer to the back buffer
// m_Dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
//
// m_Dev->EndScene();
//
// m_Dev->Present(NULL, NULL, NULL, NULL);
return 1;
} Eu nu stiu ce are , ma gandeam ca poate stiti voi.
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 28 Dec 2008 16:18:19 Subiect: < fara subiect >
|
|
|
c0mas info:
|
c0mas:
In ce ai postat nu pare sa fie nici o legatura (sau imi scapa mie) intre m_points (pe care il copiezi in buffer) si ceea ce initializezi tu.
Do what you love, money will follow!
|
Status:
Înregistrat pe: 19 Apr 2007 13:41:50
Vârsta: 35 ani
Mesaje: 337
Locatie: Bucuresti
Programator
Dream Builder Studios
|
| |
Postat la 28 Dec 2008 17:17:33 Subiect: < fara subiect >
|
|
|
boboS info:
|
boboS:
In functia AddVertex initializezi buferul ala m_points cu punctele care i le dai tu? Vad ca ai sarit functia aia. Posteaz-o.
"Noi ne facem ca muncim , ei se fac ca ne platesc"
|
Status:
Înregistrat pe: 03 Oct 2006 15:53:21
Vârsta: 25 ani
Mesaje: 961
Locatie: Galați
Programator
|
| |
Postat la 28 Dec 2008 18:13:30 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Am uitat sa postez AddVertex()-ul Aici e declaratia clasei CVertices Cod sursă:
class CVertices
{
private:
CUSTOMVERTEX* m_points; //array of vertices
int m_number; //current # of verts
int m_maxNumber; //max # of verts
LPDIRECT3DDEVICE9 m_Dev; //D3D device
LPDIRECT3DVERTEXBUFFER9 t_buffer; // the pointer to the vertex buffer
public:
CVertices( int maxNb, LPDIRECT3DDEVICE9 Dev );
int AddVertex( CUSTOMVERTEX vertex ); //add one vertex to the array , if return == 1 --> vertex was succesfully added , if return == 0 --> array is full
int AddVertex( POINT3D point3D, DWORD color);
void Initialize(); //reinitialize the array
int LoadBuffer(); //load the vertices into video memory
int DrawVertices();
~CVertices();
};
Si aici sunt constructorul si AddVertex(CUSTOMVERTEX vertex) Cod sursă: CVertices::CVertices( int maxNb , LPDIRECT3DDEVICE9 Dev )
{
t_buffer = NULL;
m_Dev = Dev;
m_points = new CUSTOMVERTEX[maxNb];
m_maxNumber = maxNb;
m_number = 0;
for( int i = 0 ; i = m_maxNumber)
{
return 0;
}
else
{
m_points[m_number].x = vertex.x;
m_points[m_number].y = vertex.y;
m_points[m_number].z = vertex.z;
m_points[m_number].rhw = vertex.rhw;
m_points[m_number].color = vertex.color;
m_number++;
return 1;
}
}
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 28 Dec 2008 18:14:50 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
nu stiu de ce nu a adaugat AddVertex() anyways Cod sursă:
//if return == 1 --> vertex was succesfully added , if return == 0 --> array is full
int CVertices::AddVertex( CUSTOMVERTEX vertex )
{
if (m_number >= m_maxNumber)
{
return 0;
}
else
{
m_points[m_number].x = vertex.x;
m_points[m_number].y = vertex.y;
m_points[m_number].z = vertex.z;
m_points[m_number].rhw = vertex.rhw;
m_points[m_number].color = vertex.color;
m_number++;
return 1;
}
}
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 28 Dec 2008 18:33:04 Subiect: < fara subiect >
|
|
|
boboS info:
|
boboS:
La constructor cu ce umpli primul element al bufferului? Ca nu il ai in paramentru. Si dupa ce faci asta tu ai incerementat m_number, ca dupaia cand il umpli sa fie indexat de la 1. adica m_number[1], [2] si [3].. in loc sa fie de la 0. Ia uitate, s-a postat corect codul de la constructor, ca pare cam suspect.. ce faci tu acolo in for-ul ala si apoi ca umpli primul element.? Scoate partea din constructor in care adaugi vertecsi..aia de la else..inclusiv partea in care imcrementezi indexul m_number.
Ultima editare efectuată de boboS pe 28 Dec 2008 18:33:37; 1 editări în total
"Noi ne facem ca muncim , ei se fac ca ne platesc"
|
Status:
Înregistrat pe: 03 Oct 2006 15:53:21
Vârsta: 25 ani
Mesaje: 961
Locatie: Galați
Programator
|
| |
Postat la 28 Dec 2008 18:44:06 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Hm , cred ca s-a amestecat codul de la AddVertex cu cel de la constructor cand am facut postarea Asta e adevaratul cod de la constructor Cod sursă: CVertices::CVertices( int maxNb , LPDIRECT3DDEVICE9 Dev )
{
t_buffer = NULL;
m_Dev = Dev;
m_points = new CUSTOMVERTEX[maxNb];
m_maxNumber = maxNb;
m_number = 0;
for( int i = 0 ; i < m_maxNumber ; i++ )
{
m_points[i].x = .0f;
m_points[i].y = .0f;
m_points[i].z = .0f;
m_points[i].rhw = .0f;
m_points[i].rhw = D3DCOLOR_XRGB(0, 0, 0);
}
}
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 29 Dec 2008 03:09:34 Subiect: < fara subiect >
|
|
|
raicuandi info:
|
raicuandi:
Hint: Cod sursă: memcpy(pVoid, m_points, sizeof(m_points));
Method 2: Move Your Mouse Pointer If you move your mouse pointer continuously while the data is being returned to Microsoft Excel, the query may not fail. Do not stop moving the mouse until all the data has been returned to Microsoft Excel.
|
Status:
Înregistrat pe: 24 Mar 2007 21:02:40
Vârsta: 22 ani
Mesaje: 514
Locatie: Adelaide, Australia
Programator
|
| |
Postat la 29 Dec 2008 10:27:13 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Nu-mi dau seama ce nu e in regula cu linia aia de cod.
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 29 Dec 2008 10:29:19 Subiect: < fara subiect >
|
|
|
Dark info:
|
Dark:
Eu nu inteleg ce vrei sa faci. In primul rind, e o groaza de cod inutil, de exemplu for-ul ala din constructor care poate fi inlocuit cu memset() si toata poliloghia aia cu atribuiri din AddVertex() care putea fi inlocuita cu: Cod sursă:
m_points[m_number] = vertex;
In al doilea rind, folosesti FVF-uri. Nu mai folosi FVF-uri, ca nu mai sint cool de vreo 6 ani. Foloseste vertex declarations. In al treilea rind, clasa ta nu face nimic. De ce ai vrea sa ai acest "wrapper", care maninca memorie degeaba tinind array-ul ala de vertecsi in el inainte de a-l da spre DirectX? In aplicatia ta o sa ai vertecsii de 4 ori in memorie absolut degeaba: o data in chestia de unde-i ia AddVertex(), o data in m_points, o data in buffer-ul facut de runtime pentru ca resursa e managed si inca o data in memoria video. De ce te complici cu toata chestia asta in loc sa ai 10 linii de cod care fac vertex bufferu', ii dau lock, il umplu si-i dau unlock? In al patrulea rind, cind ai o metoda numita AddVertex() ai gresit pe undeva. Vertecsii nu se adauga unul cite unul, cu cite un apel de functie, decit daca doresti sa-ti mearga incarcarea jocului incredibil de nasol. Faci vertex buffer-ul, lock, deschizi fisierul cu modelul, il citesti pe tot in pointerul returnat de lock si dai unlock. Gata. Daca nu incarci modele din fisier, generezi direct in pointerul returnat de lock. N-ai nevoie de buffere intermediare decit daca faci vreun neam de multithreading si trebuie sa ascunzi vreo latenta sau sa eviti vreo sincronizare, si chiar si atunci buffer-ul intermediar se elibereaza (sau refoloseste) imediat dupa unlock. In nici un caz nu merita sa ai o clasa care sa impacheteze un vertex buffer, pentru ca e doar un amarit de pointer pe care faci SetStreamSource(). In cele mai multe si sanatoase cazuri, ai o clasa care reprezinta un model, care contine pointerul spre vertex buffer, pointerul spre index buffer, pointerii spre shadere, pointerii spre texturi, pointerul spre vertex declaration, diversele flag-uri ale obiectului (transparent, shadow caster, bla bla) si metode pentru a incarca si desena modelul. N-ai AddVertex() si n-ai vertecsii inca o data intr-un buffer aiurea. PS: de ce pasezi "vertex" by value in AddVertex()? PS2 zis si LE: in linia aia e in neregula sizeof(), care da 4 (pe 32 de biti), nu dimensiunea array-ului, cum facea atunci cind foloseai un array static.
Ultima editare efectuată de Dark pe 29 Dec 2008 10:34:09; 4 editări în total
"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D. Autobaza
|
Status:
Înregistrat pe: 12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator
|
| |
Postat la 29 Dec 2008 12:47:11 Subiect: < fara subiect >
|
|
|
raicuandi info:
|
raicuandi:
Locatie: Asteroid of neverending rape and faggotry wtf...
Method 2: Move Your Mouse Pointer If you move your mouse pointer continuously while the data is being returned to Microsoft Excel, the query may not fail. Do not stop moving the mouse until all the data has been returned to Microsoft Excel.
|
Status:
Înregistrat pe: 24 Mar 2007 21:02:40
Vârsta: 22 ani
Mesaje: 514
Locatie: Adelaide, Australia
Programator
|
| |
Postat la 29 Dec 2008 14:37:27 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Aham , am notat neregulile si mersi de sfaturi. Intr-adevar , ai dreptate Dark cu memset si AddVertex() , sunt si eu la inceput  . Mersi de feedback. Deocamdata deabia incerc sa deslusesc tainele DirectX-ului , nu fac proiecte foarte mari si deaia nu am nevoie de cine ce chestie complicata. Vreau doar sa imi fie mai usor sa pun 4 puncte pe ecran de exemplu. Pentru alte modele stiu ca ar fi chinu de pe lume. ps: @raicuandi Pai mersi , daca puteam sa scriu si eu "Adelaide , Australia" si nu "Fucking Bucharest" , atunci scriam. Asa mi s-a parut mai interesant chestia aia cu asteroidul . T'was a joke , sper ca nu a deranjat pe nimeni.
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 29 Dec 2008 14:40:57 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Hm , cred ca m-am complicat inutil . Mai bine faceam doua functii atunci , una care incarca in memorie vertecsii si una care ii deseneaza. LE:Hm , am descoperit ca exista buton de edit. Acum am citit mesajul lui Dark in totalitate si am vazut ca a sugerat folosirea celor doua functii.
Ultima editare efectuată de Fuzzball pe 29 Dec 2008 14:47:57; 1 editări în total
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Postat la 29 Dec 2008 14:58:15 Subiect: < fara subiect >
|
|
|
Dark info:
|
Dark:
Cred ca raicuandi te intreba de unde vine aia cu locatia si/sau ce inseamna, ceea ce m-am intrebat si eu. Sper ca nu-i nimeni pe aici sa se ofenseze de asa ceva. Evident ca e o gluma, da' sint curios daca e o referinta la ceva sau e pur si simplu inventata.
"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D. Autobaza
|
Status:
Înregistrat pe: 12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator
|
| |
Postat la 29 Dec 2008 15:20:46 Subiect: < fara subiect >
|
|
|
Fuzzball info:
|
Fuzzball:
Nay , e inventata. Nu sunt violator in serie si chiar daca as fi nu cred ca as fi atat de subtil sa-mi tradez apucaturile printr-o locatie inexistenta.
Will code for food.
|
Status:
Înregistrat pe: 20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator
|
| |
Pagina 1 din 1
[
1
]
|
|
|