Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML + OpenGL] metoda draw z klasy RenderWindow i klasa sf::Text

Ostatnio zmodyfikowano 2012-09-16 06:47
Autor Wiadomość
yoogi
Temat założony przez niniejszego użytkownika
[SFML + OpenGL] metoda draw z klasy RenderWindow i klasa sf::Text
» 2012-09-09 17:44:39
Kiedy wyświetlam tekst, zamiast tekstu mam kawałki tekstury obiektu, a obiekt się nie wyświetla. Jest jakiś sposób na wyświetlenie sf::Text i grafiki OpenGL w tle ?
P-64720
Gabes
» 2012-09-09 18:46:56
C/C++
glClearColor(.9f,.9f,.9f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glPushMatrix(); //odkłada macierz aktualnego przekształcenia na stos
glLoadIdentity();
glOrtho( - 10, 10, - 10, 10, - 20, 20 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glScalef( 2.0, 2.0, 2.0 );
glTranslatef( 0, 0, - 2 );
glRotatef( x, 1, 1, 1 );
glBegin( GL_QUADS ); //itp.
glTexCoord2f( 0.0000f, 0.3333f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); //Góra
...//itd.
glEnd();
glMatrixMode( GL_PROJECTION );
glPopMatrix(); //zdejmuje ze stosu macierz przekształcenia
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
odłożyć na macierz przekształcenia, wyświetlić, zdjąć. Tekst wyświetlany normalnie
Tak zrobiłem w allegro5+OpenGL, chociaż lepiej byłoby tekst dać na jakiegoś Quada tzn. tekst na bitmape abitmape na Quada i dopiero wyświetlać na ekran bo tak tekst wyświetlany jest na pozycji z=0 i przenika przez obiekty.
P-64723
yoogi
Temat założony przez niniejszego użytkownika
» 2012-09-09 18:57:37
Nie rozumiem :) Mam coś takiego:

C/C++
sf::Text text;
text.setString( "asdf" );

//funkcje open gl

window.draw( text );
window.display();
P-64724
Gabes
» 2012-09-09 19:18:00
No jak utwórz ekran w opengl  wyświetl tekst dodaj obiekty 3D.Może wrzucę  gdzieś przykład, zasada będzie taka sama w SFML. http://www.sendspace.pl/file/a9f4c509de2605078cbbde9
P-64726
yoogi
Temat założony przez niniejszego użytkownika
» 2012-09-09 20:25:32
Dalej nie mogę wykombinować co jest źle, zrobiłem dokładnie tak jak u ciebie, a przynajmniej tak mi się wydaje. Wyświetlanie sceny OpenGL potem
C/C++
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
Potem tekst:
C/C++
sf::Text text;
text.setString( render.GetInfo() );
window.draw( text );
i na koniec wywalenie tego na ekran:
C/C++
window.display();
P-64731
Gabes
» 2012-09-09 20:30:58
Tekst powinien być po:
C/C++
glClearColor(.9f,.9f,.9f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
P-64732
yoogi
Temat założony przez niniejszego użytkownika
» 2012-09-09 20:59:20
Dalej to samo

OpenGlRender.h:
C/C++
#ifndef OpenGlRender_h
#define OpenGlRender_h

#include <stdio.h>
#include <string>

#include <SFML/OpenGL.hpp>

#include <GL/glu.h>
#include <GLa/GLAux.h>

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

#pragma comment(lib,"OpenGL32.lib")
#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"glu32.lib")

class OpenGlRender {
public:
    OpenGlRender( int w, int h );
    void Init();
    void Redraw( sf::RenderWindow * rw );
    void DrawCube();
    AUX_RGBImageRec * LoadBMP( char * Filename );
    int LoadGLTextures( char * filename );
    void SetLighting( bool enambled );
    bool GetLighting();
   
    void AddLightAmbient( GLfloat la, int index );
    void AddLightDiffuse( GLfloat ld, int index );
    void AddLightPosition( GLfloat lp, int index );
   
    std::string GetInfo();
    void DrawText( sf::RenderWindow * window );
private:
    int angle;
    GLuint filter;
    GLuint texture[ 3 ];
    int _w;
    int _h;
   
    bool bLighting;
   
    GLfloat LightAmbient[ 4 ];
    GLfloat LightDiffuse[ 4 ];
    GLfloat LightPosition[ 4 ];
};

#endif
OpenGlRender.cpp
C/C++
#include "OpenGlRender.h"

OpenGlRender::OpenGlRender( int w, int h )
{
    LoadGLTextures( "a.bmp" );
   
    Init();
    angle = 0;
    _w = w;
    _h = h;
   
    bLighting = false;
   
    filter = 1;
   
    LightAmbient[ 0 ] = 0.5f;
    LightAmbient[ 1 ] = 0.5f;
    LightAmbient[ 2 ] = 0.5f;
    LightAmbient[ 3 ] = 1.0f;
   
    LightDiffuse[ 0 ] = 1.0f;
    LightDiffuse[ 1 ] = 1.0f;
    LightDiffuse[ 2 ] = 1.0f;
    LightDiffuse[ 3 ] = 1.0f;
   
    LightPosition[ 0 ] = 0.0f;
    LightPosition[ 1 ] = 0.0f;
    LightPosition[ 2 ] = 2.0f;
    LightPosition[ 3 ] = 1.0f;
}

void OpenGlRender::Init()
{
    glEnable( GL_TEXTURE_2D );
    glShadeModel( GL_SMOOTH );
    glClearColor( 0.0f, 0.0f, 0.0f, 0.5f );
    glClearDepth( 1.0f );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
}

void OpenGlRender::Redraw( sf::RenderWindow * rw )
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    DrawText( rw );
   
    glLoadIdentity();
    gluPerspective( 45.0f,( GLfloat ) _w /( GLfloat ) _h, 0.1f, 100.0f );
    glScalef( 4.0, 4.0, 4.0 );
    glTranslatef( 0.0f, 0.0f, - 7.0f );
   
    glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient );
    glLightfv( GL_LIGHT1, GL_DIFFUSE, LightDiffuse );
    glLightfv( GL_LIGHT1, GL_POSITION, LightPosition );
    glEnable( GL_LIGHT1 );
   
    if( bLighting )
         glEnable( GL_LIGHTING );
    else
         glDisable( GL_LIGHTING );
   
    DrawCube();
}

void OpenGlRender::DrawCube()
{
    glBindTexture( GL_TEXTURE_2D, texture[ filter ] );
    glRotatef( 30, 1, 0, 0 );
    glRotatef(( GLfloat ) angle, 0, 1, 0 );
   
    angle++;
   
    glBegin( GL_QUADS );
    // Front Face
    glNormal3f( 0.0f, 0.0f, 1.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f );
    // Back Face
    glNormal3f( 0.0f, 0.0f, - 1.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f );
    // Top Face
    glNormal3f( 0.0f, 1.0f, 0.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f );
    // Bottom Face
    glNormal3f( 0.0f, - 1.0f, 0.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f );
    // Right face
    glNormal3f( 1.0f, 0.0f, 0.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f );
    // Left Face
    glNormal3f( - 1.0f, 0.0f, 0.0f );
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f );
    glEnd();
}

AUX_RGBImageRec * OpenGlRender::LoadBMP( char * Filename )
{
    FILE * File = NULL;
    if( !Filename )
         return NULL;
   
    File = fopen( Filename, "r" );
   
    if( File )
    {
        fclose( File );
        return auxDIBImageLoadA( Filename );
    }
    return NULL;
}

int OpenGlRender::LoadGLTextures( char * filename )
{
    int Status = FALSE;
    AUX_RGBImageRec * TextureImage[ 1 ];
    memset( TextureImage, 0, sizeof( void * ) * 1 );
    if( TextureImage[ 0 ] = LoadBMP( filename ) )
    {
        Status = TRUE;
        glGenTextures( 3, & texture[ 0 ] );
       
        glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data );
       
        glBindTexture( GL_TEXTURE_2D, texture[ 1 ] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data );
       
        glBindTexture( GL_TEXTURE_2D, texture[ 2 ] );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
        gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[ 0 ]->sizeX, TextureImage[ 0 ]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[ 0 ]->data );
    }
   
    if( TextureImage[ 0 ] )
    {
        if( TextureImage[ 0 ]->data )
             free( TextureImage[ 0 ]->data );
       
        free( TextureImage[ 0 ] );
    }
    return Status;
}

void OpenGlRender::SetLighting( bool enambled )
{
    bLighting = enambled;
}

bool OpenGlRender::GetLighting()
{
    return bLighting;
}

void OpenGlRender::AddLightAmbient( GLfloat la, int index )
{
    LightAmbient[ index ] += la;
}

void OpenGlRender::AddLightDiffuse( GLfloat ld, int index )
{
    LightDiffuse[ index ] += ld;
}

void OpenGlRender::AddLightPosition( GLfloat lp, int index )
{
    LightPosition[ index ] += lp;
}

std::string OpenGlRender::GetInfo()
{
    char tmp[ 1024 ];
    sprintf( tmp, "%.2f  %.2f  %.2f  %.2f \t %.2f  %.2f  %.2f  %.2f \t %.2f  %.2f  %.2f  %.2f\n",
    LightAmbient[ 0 ], LightAmbient[ 1 ], LightAmbient[ 2 ], LightAmbient[ 3 ],
    LightDiffuse[ 0 ], LightDiffuse[ 1 ], LightDiffuse[ 2 ], LightDiffuse[ 3 ],
    LightPosition[ 0 ], LightPosition[ 1 ], LightPosition[ 2 ], LightPosition[ 3 ] );
    return tmp;
}

void OpenGlRender::DrawText( sf::RenderWindow * window )
{
    sf::Text text;
    text.setString( GetInfo() );
    window->draw( text );
}

main.cpp:
C/C++
#pragma comment(lib,"sfml-window.lib")
#pragma comment(lib,"sfml-system.lib")
#pragma comment(lib,"sfml-graphics.lib")

#include "OpenGlRender.h"
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "OpenGL", sf::Style::Default, sf::ContextSettings( 32 ) );
    window.setVerticalSyncEnabled( true );
   
    OpenGlRender render( 800, 600 );
    render.SetLighting( false );
   
    bool running = true;
    while( running )
    {
        sf::Event ev;
        while( window.pollEvent( ev ) )
        if( ev.type == sf::Event::Closed )
             running = false;
        else if( ev.type == sf::Event::Resized )
             glViewport( 0, 0, ev.size.width, ev.size.height );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
             render.SetLighting( true );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
             render.SetLighting( false );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Q ) )
             render.AddLightAmbient( 0.01, 0 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
             render.AddLightAmbient( - 0.01, 0 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
             render.AddLightAmbient( 0.01, 1 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
             render.AddLightAmbient( - 0.01, 1 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::E ) )
             render.AddLightAmbient( 0.01, 2 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
             render.AddLightAmbient( - 0.01, 2 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::R ) )
             render.AddLightAmbient( 0.01, 3 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::F ) )
             render.AddLightAmbient( - 0.01, 3 );
       
       
       
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::T ) )
             render.AddLightDiffuse( 0.01, 0 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::G ) )
             render.AddLightDiffuse( - 0.01, 0 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Y ) )
             render.AddLightDiffuse( 0.01, 1 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::H ) )
             render.AddLightDiffuse( - 0.01, 1 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::U ) )
             render.AddLightDiffuse( 0.01, 2 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::J ) )
             render.AddLightDiffuse( - 0.01, 2 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::I ) )
             render.AddLightDiffuse( 0.01, 3 );
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::K ) )
             render.AddLightDiffuse( - 0.01, 3 );
       
        render.Redraw( & window );
        window.display();
    }
    return 0;
}
P-64733
yoogi
Temat założony przez niniejszego użytkownika
» 2012-09-16 06:47:07
http://wklej.org/id/829771/

W końcu się udało :)
P-65016
« 1 »
  Strona 1 z 1