Gå til innhold

Still spørsmål innen spill og grafikk programmering


Anbefalte innlegg

Videoannonse
Annonse

lurer bare på en liten ting, hva er kommandoen for å finne ut om en tast er trykket feks if(Pilned == 1) {XX=1} else {XX=2}?

 

For å skjekke om en tast er trykket ned burde du bruke en API til dette.

For eksempel Windows har en egen måte for å skjekke om en tast er trykket ned eller sluppet opp.

 

Her er et eksempel på hvordan du kan skjekke taste trykk på Windows

 

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   float xVel;

   int fwKeys;
   LPARAM keyData;

   switch (uMsg)
   {
   case WM_LBUTTONDOWN:        // venstre muse knapp
       break;

   case WM_RBUTTONDOWN:        // høyre muse knapp
       break;

   case WM_MOUSEMOVE:          // muse bevegelse
       break;

   case WM_KEYUP:      //Når knapp slipper opp
       fwKeys = (int)wParam;    
       keyData = lParam;          

       switch(fwKeys)
       {   
       case VK_LEFT:
           xVel += 0.5;
           break;

       default:
           break;
       }
       break;

   case WM_KEYDOWN: //Når knapp blir presset
       fwKeys = (int)wParam;    
       keyData = lParam;          

       switch(fwKeys)
       {
       case VK_ESCAPE:
           PostQuitMessage(0);
           break;
       case VK_LEFT:
           xVel -= 0.5;
           break;
       default:
           break;
       }

       break;

   default:
       break;
   }
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

Lenke til kommentar

Tror jeg har fått til X nå, men det funker ikke under virtualbox (OpenGL Warning: vboxCall failed with VBox status code)

Så jeg lurte på om noen med linux installert skikkelig hadde giddet å prøve? Programmet skal startes med mono TestProject.exe.

 

X tutorialen til Tapped hjalp, ettersom den forklarte hva forskjellige ting var, så takker!

 

Hmm, fungerte ikke hos meg i hvert fall.

 

mono TestProject.exe 

** (TestProject.exe:14854): WARNING **: The following assembly referenced from /home/bjaanes/Downloads/TestProject Geir/TestProject.exe could not be loaded:
    Assembly:   System.Windows.Forms    (assemblyref_index=2)
    Version:    2.0.0.0
    Public Key: b77a5c561934e089
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/home/bjaanes/Downloads/TestProject Geir/).


** (TestProject.exe:14854): WARNING **: Could not load file or assembly 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.

** (TestProject.exe:14854): WARNING **: Missing method EnableVisualStyles in assembly /home/bjaanes/Downloads/TestProject Geir/TestProject.exe, type System.Windows.Forms.Application

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

 

 

Aner ikke om det er en feil hos meg eller ikke... :p

Lenke til kommentar

jeg har brukt SFML en del selv, og kan virkelig anbefale dette. Dette er et multimedia/spill API som baserer seg på SDL og er derfor veldig enkelt å implementere både på windows og linux. Det har veldig god støtte for enkel grafikk, og i tillegg muligheter for å bruke openGL om det er ønskelig :)

  • Liker 1
Lenke til kommentar

jeg har brukt SFML en del selv, og kan virkelig anbefale dette. Dette er et multimedia/spill API som baserer seg på SDL og er derfor veldig enkelt å implementere både på windows og linux. Det har veldig god støtte for enkel grafikk, og i tillegg muligheter for å bruke openGL om det er ønskelig :)

 

Det er vel heller ment som et alternativ til SDL, som har stått litt i stampe de siste årene. Det virker som et bra alternativ, men har ikke prøvd det så mye.

Lenke til kommentar
  • 3 uker senere...

Jeg jobber med en grafikkmotor i C# som baserer seg på OpenGL for tiden. jeg har derimot kommet borti noe som dere kanskje har en mening eller en god idé angående. Nå har jeg fått til det aller meste grafiske, den kan laste .obj modeller, teksturer av flere typer (png, jpg, bmp, tif, gif og hdr), bruker quaternions, RK4 simulering, og har et hierarkisk scenegraph, ved siden av at alt kan serialiseres enkelt, og den bruker flere tråder. Men nå er jeg kommet borti materialer, som er siste som mangler før motoren faktisk kan brukes til å lage skikkelige spill med. Problemet er hvordan skal jeg få til lys dersom en kan skrive egne shaders?

 

Jeg har bare hatt én tanke som jeg synes er god, og det er å lage noe lignende UnrealED eller Mental Mill for å definere materialer. Ettersom dette fører til at jeg kan ganske enkelt legge til funksjoner for lys og skygge selv, pluss at hvem som helst kan klare å bruke den. Er det noen som har en enklere og/eller bedre idé?

Lenke til kommentar

Jeg jobber med en grafikkmotor i C# som baserer seg på OpenGL for tiden. jeg har derimot kommet borti noe som dere kanskje har en mening eller en god idé angående. Nå har jeg fått til det aller meste grafiske, den kan laste .obj modeller, teksturer av flere typer (png, jpg, bmp, tif, gif og hdr), bruker quaternions, RK4 simulering, og har et hierarkisk scenegraph, ved siden av at alt kan serialiseres enkelt, og den bruker flere tråder. Men nå er jeg kommet borti materialer, som er siste som mangler før motoren faktisk kan brukes til å lage skikkelige spill med. Problemet er hvordan skal jeg få til lys dersom en kan skrive egne shaders?

 

Jeg har bare hatt én tanke som jeg synes er god, og det er å lage noe lignende UnrealED eller Mental Mill for å definere materialer. Ettersom dette fører til at jeg kan ganske enkelt legge til funksjoner for lys og skygge selv, pluss at hvem som helst kan klare å bruke den. Er det noen som har en enklere og/eller bedre idé?

 

Vet ikke hva shadder du skal bruke, men prisippene skal da være de samme.

Nvidia cg, lys

Lenke til kommentar

 

Jeg har bare hatt én tanke som jeg synes er god, og det er å lage noe lignende UnrealED eller Mental Mill for å definere materialer. Ettersom dette fører til at jeg kan ganske enkelt legge til funksjoner for lys og skygge selv, pluss at hvem som helst kan klare å bruke den. Er det noen som har en enklere og/eller bedre idé?

 

Du kan benytte varabler (bool) som styrer rendringern

 

// i rendre metoden.
if(light_on)
 // rendre med lys
else
 // rendre uten

 

Da kan dette styres utenfra.

renderdevice->LightOn(true);

 

Tilsvarende for skygger. Det er slik det skal fungere i min motor.

Lenke til kommentar

 

Jeg har bare hatt én tanke som jeg synes er god, og det er å lage noe lignende UnrealED eller Mental Mill for å definere materialer. Ettersom dette fører til at jeg kan ganske enkelt legge til funksjoner for lys og skygge selv, pluss at hvem som helst kan klare å bruke den. Er det noen som har en enklere og/eller bedre idé?

 

Du kan benytte varabler (bool) som styrer rendringern

 

// i rendre metoden.
if(light_on)
 // rendre med lys
else
 // rendre uten

 

Da kan dette styres utenfra.

renderdevice->LightOn(true);

 

Tilsvarende for skygger. Det er slik det skal fungere i min motor.

Det er en mulighet. Det jeg tenker jeg gjør, er at hvert objekt blir rendret to ganger: en gang uten noe som helst lys eller skygge, og deretter med utelukkende med lys (med eventuelle normal maps) og stencil shadows. Lys- og skyggerendringen blir lagt i et eget buffer som deretter bare blendes rett over scenen som er rendret uten lys. Det er relativt simpelt, og ikke fryktelig krevende. Dessuten kan en ha så mange lys en vil uten at det går utover kompleksiteten til shaderen, og spillutvikleren trenger ikke tenke på lys og skygger overhode. Ulempen er visst at det krever mye videominne. Demoen jeg så rendret også til et normal map, men jeg ser ikke helt poenget med det. Kanskje for at utvikleren skal kunne skrive egne normal map effekter? Jeg vet ikke helt.

 

Ihvertfall: med denne metoden kan jeg relativt enkelt få til dynamiske skygger, og brukeren kan skrive en shader uten å måtte tenke på lys i det hele tatt.

Lenke til kommentar

Ser ut som du også har til mål og gjøre det lett for en utvikler og bruke motoren :)

 

Det eneste jeg ser for meg å rendre til et normal-map er jo at en trenger normalen for refleksjoner, lysbrytting gjennom objekter (glass, vann osv). Men trodde dette kunne gjøres med å laste et normal-map med objektet.

 

Men da jeg testet normal map, kalkulerte jeg normal-vektorer fra en tekstur. Kanskje like greit å gjøre dette i en shader?

Lenke til kommentar

Du må nesten ta det fra en tekstur. Det som skjer i deferred, er at hele scenen rendres til en egen frame som danner et normal map, som sikkert skal brukes for å forvrenge shading "teksturen" etter normal map som er rendret (eks dersom du ser en grusvei, så er det ikke ideelt at shadingen er helt flat, som ville blitt resultatet uten)

Problemet blir at dette gjør det mer komplisert å skrive shaders, fordi en nesten må skrive en egen shader kun for å danne normal maps... jeg får kalle dette en lighting shader, men jeg tror jeg må tenke så det knaker for å få dette til...

 

Hvordan har du tenkt til å løse lys/skygger i din motor?

Lenke til kommentar

Du må nesten ta det fra en tekstur. Det som skjer i deferred, er at hele scenen rendres til en egen frame som danner et normal map, som sikkert skal brukes for å forvrenge shading "teksturen" etter normal map som er rendret (eks dersom du ser en grusvei, så er det ikke ideelt at shadingen er helt flat, som ville blitt resultatet uten)

Problemet blir at dette gjør det mer komplisert å skrive shaders, fordi en nesten må skrive en egen shader kun for å danne normal maps... jeg får kalle dette en lighting shader, men jeg tror jeg må tenke så det knaker for å få dette til...

 

Hvordan har du tenkt til å løse lys/skygger i din motor?

 

Har litt igjen før jeg skal begynne med lys/skygger.

Men planen er å rendre scenen fra lyskilden sin posisjon til et textur. Texturen brukes i neste steg til å danne skygger. Dette skal sammen med en lysmodel f.eks det jeg la ut link for tidligere.

Mulig dette blir komplisert med bruk av flere lyskilder.

 

Men er fortsatt litt usikker på hvordan det er å bruke flere shaddere på samme model. Er det bare å laste dem inn? Alle som blir lastet er aktive helt til de blir deaktivert?

Lenke til kommentar

Du kan kun ha en aktiv shader av gangen (glUseProgram)

Skal du bruke flere må du rendre samme objektet flere ganger (multi pass)

 

 

Det var nesten for enkelt til å være sant, synd det av og til tar lang tid å finne ut hvor enkelt det kan gjøres..

Endret av Zolo
Lenke til kommentar

Hømmm jeg har problemer med OpenGL 3.2... glGetUniformLocation returnerer alltid -1 som skal bety at uniformen ikke er definert i programmet.

 

projection_uniform = active_shader.GetUniformType<MatrixUniform, Matrix>("projection_mat");

Som alt i alt kaller glGetUniformLocation(program_handle, "projection_mat") hvor "projection_mat" blir gjort om til en 0 terminert ASCII string. Shaderen blir kompilert og lenket uten feil.

 

Dette er shaderne jeg bruker:

<?xml version="1.0" encoding="UTF-8"?>
<material>
<VertexShader>
#version 140

uniform mat4 projection_mat;
uniform mat4 modelview_mat;


in vec3 in_position;
in vec2 in_texcoord;
in vec3 in_normal;

out vec4 position;

void main()
{	
	position = vec4(in_position, 1) * modelview_mat * projection_mat;
} 
</VertexShader>

<FragmentShader>
#version 140

in vec4 position;	

out vec4 out_frag;

void main()
{
	out_frag = vec4(1, 0, 0, 0);	
}
</FragmentShader>
</material>

 

edit: glGetAttribLocation fungerer heller ikke :/

Det som er snodig er at kompilering går fint, ingen feilmeldinger på hverken kompilering eller linking...

edit2:

GL_ACTIVE_UNIFORMS og GL_ACTIVE_ATTRIBUTES er 0... Programmet linker riktig, alt ser fint ut.. JEG FATTER IKKE HVA SOM ER I VEIEN! Men det ser ut til at jeg gjør noe feil i shaderen, ikke i OpenGL kall...

Endret av GeirGrusom
Lenke til kommentar

Prøver å lage en simpel videospiller med å bruke ffmpeg sin libavcodec (sitter i Linux, men vil helst ha det multi-platform), men sliter med å vise bilde på skjermen på en god måte. Så langt bruker jeg SDL sin YV12 overlay, sammen med timere for å holde FPSen stødig, og scaling med swscale og det funker sånn tålelig greit, men det tar altfor mye CPU, og selv Core i7-en min må jobbe greit :)

 

Tenkte på OpenGL, men forstår ikke mye av det. Har forsåvidt skjønt at man kan lage en svær texture av bildet, skalere det slik man vil (i hardware?), og vise det på skjermen.

 

Hvordan gjøres timing med OpenGL? Er det samme greia her at man bruker timere, og flusher til skjermen når det trengs, eller blir dette et callback-design der OpenGL spør etter en ny render når det passer, også gir man callbacken en ferdig dekodet frame? Støtter OpenGL vanlig YV12/YUV420P?

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...