Gå til innhold

Ser ingen ting OpenGl


Anbefalte innlegg

hei

 

har et problem med en kode bit her.

får ikke vist noe annet enn en svart skjerm.

 

BOOL DisplayScene()
{
 SwapBuffers(hdc);
 // set up the view orientation
 glLoadIdentity();
 // clear the screen
 // clear screen and depth buffer
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();

 // enable blending
 glEnable(GL_BLEND);
 
 // render the heightmap
 RenderHeightMap(g_HeightMap);

 // enable read-only depth buffer
 glDepthMask(GL_FALSE);

 // set the blend function to what we use for transparency
 glBlendFunc(GL_SRC_ALPHA, GL_ONE);

 // set back to normal depth buffer mode (writable)
 glDepthMask(GL_TRUE);

 // disable blending
 glDisable(GL_BLEND);


 return TRUE;
} // end DisplayScene()

 

dette er hele funskjonen som dere ser hva er feilen som gjør at jeg ikke ser noe.

 

tror selv at jeg har feilplassert

SwapBuffers(hdc);

 

bruker også den etter at jeg har opretet vinduet. trenger jeg å gjøre det hele tiden? håper på et raskt svar.

 

Mvh. Fredrik

Lenke til kommentar
Videoannonse
Annonse

som det står i koden så er det en funksjon som heter renderheightmap();

 

her er den:

void RenderHeightMap(char pHeightMap[])
{
int X = 0, Y = 0;      // Create some variables to walk the array with.
int x, y, z;      	// Create some variables for readability
bool bSwitchSides = false;

// Make sure our height data is valid
if(!pHeightMap) return;  

// We want to render triangle strips
glBegin( GL_TRIANGLE_STRIP );  	

// Go through all of the rows of the height map
for ( X = 0; X <= MAP_SIZE; X += STEP_SIZE )
{
 // Chechk if we need to render the opposite way for this column
 if(bSwitchSides)
 {	
 	// Render a column of the terrain, for this current X.
 	// We start at MAP_SIZE and render down to 0.
 	for ( Y = MAP_SIZE; Y >= 0; Y -= STEP_SIZE )
 	{
   // Get the (X, Y, Z) value for the bottom left vertex  
   x = X;      	
   y = Height(pHeightMap, X, Y );	
   z = Y;      	

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  

   // Get the (X, Y, Z) value for the bottom right vertex  
   x = X + STEP_SIZE; 
   y = Height(pHeightMap, X + STEP_SIZE, Y ); 
   z = Y;

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  	
 	}
 }
 else
 {	
 	for ( Y = 0; Y <= MAP_SIZE; Y += STEP_SIZE )
 	{
   // Get the (X, Y, Z) value for the bottom right vertex  
   x = X + STEP_SIZE; 
   y = Height(pHeightMap, X + STEP_SIZE, Y ); 
   z = Y;

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);

   // Get the (X, Y, Z) value for the bottom left vertex  
   x = X;      	
   y = Height(pHeightMap, X, Y );	
   z = Y;      	

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  
 	}
 }

 // Switch the direction the column renders to allow the fluid tri strips
 bSwitchSides = !bSwitchSides;
}

// Stop rendering triangle strips
glEnd();
}

 

men hva med den swabbuffers når skal den brukes?

 

mvh. Fredrik

Lenke til kommentar

funker det uten tekstur? er kamera rettet mot terrenget? hvorfor har du enabla blending uten å spesifisere hvordan ting skal blendes? kan du se noe hvis du bare tegner en vanlig trekant? hvorfor har du to måter å tegne terrenget? (// Chechk if we need to render the opposite way for this column) hvordan culler du? clockwise eller counter clock wise, og er lager du trekantene motsatt vei? prøv å tegn wireframe først til du ser at du funker, så kan du begynne å tenke på ting som teksturer og blending og sånn..

du burde også bruke vbo's (vertex buffer object) som er noe av det samme som vertex buffers i D3D siden glBegin(GL_TRIANGLESTRIP) glVertex3* er *utrolig* mye treigere.

og swapbuffers skal brukes når du vil bytte backbuffern med frontbuffern, altså når du er ferdig med all tegningen for den framen du skal vise

Endret av saboi
Lenke til kommentar

SwapBuffers flipper FrontBuffer og BackBuffer, så den skal etter glFlush(), som er den siste funksjonen du skal kalle (som gjør at alle tegnekommandoer som ligger i stacken blir utført før programmet går videre)

 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

(...)

glFlush();

SwapBuffers(HDC);

 

som saboi har sagt, bruk glDrawElements, eller glDrawBuffers (denne bruker jeg på terreng, siden alle trianglene er etter hverandre allikevel)

 

...og skal du tegne terreng, er octree å abefale, jeg kan tegner 1024x1024 terreng uten det minste hakking, fordi den deler opp terrenget på en nokså genial måte, og tegne kun det som synes i viewporten, ved å bruke frustum (forklart på gametutorials.com)

Lenke til kommentar
  • 1 måned senere...

hei igjen....

 

sorry at jeg drar frem en gammel post.

men har tankt litt.

 

denne koden

void RenderHeightMap(char pHeightMap[])
{
int X = 0, Y = 0;      // Create some variables to walk the array with.
int x, y, z;      	// Create some variables for readability
bool bSwitchSides = false;

// Make sure our height data is valid
if(!pHeightMap) return;  

// We want to render triangle strips
glBegin( GL_TRIANGLE_STRIP );  	

// Go through all of the rows of the height map
for ( X = 0; X <= MAP_SIZE; X += STEP_SIZE )
{
 // Chechk if we need to render the opposite way for this column
 if(bSwitchSides)
 {	
 	// Render a column of the terrain, for this current X.
 	// We start at MAP_SIZE and render down to 0.
 	for ( Y = MAP_SIZE; Y >= 0; Y -= STEP_SIZE )
 	{
   // Get the (X, Y, Z) value for the bottom left vertex  
   x = X;      	
   y = Height(pHeightMap, X, Y );	
   z = Y;      	

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  

   // Get the (X, Y, Z) value for the bottom right vertex  
   x = X + STEP_SIZE; 
   y = Height(pHeightMap, X + STEP_SIZE, Y ); 
   z = Y;

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  	
 	}
 }
 else
 {	
 	for ( Y = 0; Y <= MAP_SIZE; Y += STEP_SIZE )
 	{
   // Get the (X, Y, Z) value for the bottom right vertex  
   x = X + STEP_SIZE; 
   y = Height(pHeightMap, X + STEP_SIZE, Y ); 
   z = Y;

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);

   // Get the (X, Y, Z) value for the bottom left vertex  
   x = X;      	
   y = Height(pHeightMap, X, Y );	
   z = Y;      	

   // Set the current texture coordinate and render the vertex
   SetTextureCoord( (float)x, (float)z );
   glVertex3i(x, y, z);  
 	}
 }

 // Switch the direction the column renders to allow the fluid tri strips
 bSwitchSides = !bSwitchSides;
}

// Stop rendering triangle strips
glEnd();
}

 

vil si at den må telle seg frem til 1024. og det vil da si at jeg er heldig om jeg får en frame count på rundt 0,0001?

eller er jeg helt på bærtur?

 

med spørrende hilsen Fredrik

Lenke til kommentar

skjønner ikke helt spørsmålet ditt jeg..

 

men her er en kode for å generere en MxN grid, og det er ganske trivielt å slå opp i en heightmap-tabell som du bruker til y-verdien. det er dx da, men det er lett å "porte" til ogl: http://rafb.net/paste/results/ngZcfH41.html

 

legg merke til at det blir laget på xy-planet, så bare sett z-verdien til y-verdien, og y-verdien til heightmap-tabellen din

Lenke til kommentar

Litt vanskelig å skjønne spørsmålet ditt,

men hvis du tror det vil gå tregt pga at den på telle til 1024 for hver frame,

så skal ikke det være noe problem.

Husk at skjermen du ser på nå oppdateres 60+ ganger i sekundet,

og for hver oppdatering må den skrive til 1024*768 piksler (eller mer)

noe som er betydelig mer arbeid enn å telle til 1024.

Lenke til kommentar

void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )

 

den indices skal den peke til en array? ikke til en vector<class> name;

 

leste norsk bok som jeg angrer på. der ble den bare kalt kontainer. hva kaller dere den? en vector? vet hva en array er.

 

mvh. Fredrik

Lenke til kommentar
leste norsk bok som jeg angrer på. der ble den bare kalt kontainer. hva kaller dere den? en vector? vet hva en array er.

Sier konteiner når jeg snakker om konteinere generelt, og std::vector når jeg snakker om std::vector spesielt -- på samme måte som at jeg sier bil når jeg snakker om biler generelt, og Audi når jeg snakker om Audi spesielt.

Lenke til kommentar

int mitt_array[10];

 

Ser virkelig const GLvoid *indices ut som en deklarasjon som tar i mot noe av en type std::vector?

 

Tror i grunn det du driver med er rimelig bak mål om du ikke fatter hva dette med arrayer går ut på. Virker som om du ikke har fått med deg det grunnleggende og bare driver gjette-lek ... og i tillegg skal kombinere dette med en mulig begrenset kunnskap om OpenGL ..

 

All kunnskap er begrenset i starten, men en forutsetning for å kode (eller skaffe seg kunnskap om) OpenGL er kunnskap om (spesiellt) C'ish-måter å gjøre ting på. Jeg tror dette er noe som tikker rundt oppe i hodet ditt (altså du vet fra før av at det jeg sier stemmer) - men du velger å ignorere det og driver i stedet gjette-lek.

Endret av søpple
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...