Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[erledigt] Splashscreen (transparent) mit OpenGL (win32)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 25.11.2011, 16:26    Titel: [erledigt] Splashscreen (transparent) mit OpenGL (win32) Antworten mit Zitat

Der Titel beinhaltet schon die Frage, ist es in/mit FB bzw. allgemein eigentlich möglich einen Splashscreen zu initiieren und eine transparent farbe zu setzen/wählen/nutzen? mit dem effekt das diese dann eben nicht sichtbar (Transparent) sind?!

Beschreibungen aus der FB-Hilfe sind... sehr 'wage'

Zitat:

*Wenn das Stencil Buffer Flag (&h1000) gesetzt ist, wird ein Stencil Buffer (Schablonenpuffer) erstellt.
Dieser Buffer wird verwendet, um Pixel zu maskieren, d.h. die Farbe bestimmter Pixel durch
eine andere Farbe zu ersetzen oder diese erst gar nicht zu zeichnen.
Man kann dieses Flag nur setzen, wenn man OpenGL verwendet.

*Das Splashscreen-Flag (&h10) bewirkt dasselbe wie das Rahmen-Flag.
Zusätzlich ist die transparente Farbe (modusabhängig) in diesem Fall
tatsächlich transparent, d.h. der Desktop bzw. die Fenster, die sich hinter
dem FreeBASIC-Gfx-Fenster befinden, sind 'durch das Gfx-Fenster hindurch' sichtbar.
Siehe PUT (Grafik) für die Transparenzfarben.
Sinnvollerweise wird dieses Flag nicht mit dem Vollbild-Flag kombiniert.
Ein Klick auf transparente Flächen wird von SCREENEVENT nicht erkannt;
nur 'solide Flächen' werden für die Ereigniserkennung beachtet. Es ist auch möglich,
'durch das Fenster hindurch' Elemente anzuklicken, die sich hinter transparenten Flächen befinden.
Das Splashscreen-Flag existiert erst seit FreeBASIC v0.17.


Ein simpler Versuch:
Code:

#Include "GL/glu.bi"

const screen_width = 800
const screen_height = 600

screenres screen_width,screen_height,32,,&h02 OR &h10 OR &h1000'FB.GFX_OPENGL
   
glViewport 0, 0, screen_width, screen_height
glMatrixMode (GL_PROJECTION)
glLoadIdentity                         
gluPerspective 45.0, screen_width/screen_height, 0.1, 100.0   
glMatrixMode (GL_MODELVIEW)
glLoadIdentity               
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
glLoadIdentity()

glBegin(GL_TRIANGLES)
    glColor3f (1.0f, 0.0f, 1.0f)
    glVertex3f (-0.5f,  1.0f, -3.0f)
    glVertex3f ( 0.5f,  1.0f, -3.0f)
    glVertex3f (-0.0f, -1.0f, -3.0f)
glEnd()
   

do
    flip
loop until asc(inkey)


Habs mal mit der Löschfarbe 1.0f, 0.0f, 1.0f versucht gehabt die ja eigentlich der Farbe &hFF00FF entsprechen sollte, jedoch ohne effekt (ebenfalls mit alpha 1.0f und 0.0f)
Auch bei'm Zeichnen von Objekten zeigt die Farbe dabei keine auswirkung...
_________________


Zuletzt bearbeitet von Eternal_pain am 12.03.2013, 01:43, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 26.11.2011, 17:03    Titel: Antworten mit Zitat

Nope. Das musst du händisch machen, also in einem Backbuffer rendern, transparent machen und auf den Screen blitten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 28.11.2011, 13:02    Titel: Antworten mit Zitat

In FB hatte ich mal einen pseudo Splashscreen gebastelt.
http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/splash-window-49.html
Mit einer WinAPI-Funktion kann ich das auch transparent machen.

Code:
'FB_Splash.bas ------- by Volta
#Include "windows.bi"
Dim As Integer breit, hoch, ff, bAlpha=120
Dim As String dateiname = "DeinSplash.bmp"
ff = Freefile
Open dateiname For Binary As #ff
  Get #ff, 19, breit 'Breite aus der BMP-Datei holen
  Get #ff, 23, hoch  'Höhe aus der BMP-Datei holen
Close #ff
ScreenRes breit, hoch, 32,,&h10 'ein Splash-Window
ScreenControl 2, ff  'Fensterhandle
SetLayeredWindowAttributes(Cast(HWND,ff), 0, bAlpha, LWA_ALPHA)
BLoad dateiname, 0
Sleep 5000, 1             '5 Sekunden lang anzeigen

Screen 18,32
Print "verdisch.."
Sleep 3000


EDIT
nur mit FBGfx-Mitteln kann ich leider unter Win7 keine transparenten Fenster, wie in der Hilfe beschrieben, erstellen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 28.11.2011, 18:03    Titel: Antworten mit Zitat

Danke Volta, das klappt ja auch alles recht gut auf FBGFX, so hab ich zB auch das Fenster-Design mit DashIt aufgebaut, nur wollte ich gern ein eigenes Fenster-Layout auch gern unter OpenGL erstellen und das geht scheinbar nicht ganz so einfach, vermute das genau hierfür dieser Stencil-Buffer da ist, hab mich die Tage aber nicht wieter mit beschäftigt und noch nicht rausgefunden wie ich diesen zu nutzen habe...

Zitat:
nur mit FBGfx-Mitteln kann ich leider unter Win7 keine transparenten Fenster, wie in der Hilfe beschrieben, erstellen.


hab im moment leider (noch) kein win7 drauf, nur XP.
Da würde mich ehrlich gesagt mal interessieren wie zB mein DashIt auf Win7 dann aussieht wenn es unter Win7 denn eigentlich nicht funktioniert??
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 03.03.2013, 16:45    Titel: Antworten mit Zitat

hat evtl schon jemand rausgefunden wie man den Hintergrund Transparent bekommt. Hab mir die Tuts im Portal reingezogen und google gequält. aber nichts Transparentes hinbekommen. Aber irgendwie muss es doch gehen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 03.03.2013, 16:56    Titel: Antworten mit Zitat

Wie schon im anderen Thread, ist das nicht mal so einfach wie mit der FBGFX. Und (jedenfalls) für mich nicht ganz trivial wie ich zunächst dachte...
Hier sollte man erwägen ob sich der Nutzen mit dem Aufwand lohnt... mMn nicht. Aber nun denn...

http://forum.qbasic.at/viewtopic.php?p=102404#102404
Hier mit Dank an Volta (Screenshot vom Desktop...)
http://forum.qbasic.at/viewtopic.php?p=102404#102404

hier ein C Code den ich irgend woher habe (nicht getestet):
Code:

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <windowsx.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

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

#include <assert.h>
#include <tchar.h>

#ifdef  assert
#define verify(expr) if(!expr) assert(0)
#else verify(expr) expr
#endif

const TCHAR szAppName[]=_T("TransparentGL");
const TCHAR wcWndName[]=_T("WS_EX_LAYERED OpenGL");

HDC hDC;           
HGLRC m_hrc;       
int w(240);
int h(240);

HDC pdcDIB;                 
HBITMAP hbmpDIB;           
void *bmp_cnt(NULL);       
int cxDIB(0);
int cyDIB(0);   
BITMAPINFOHEADER BIH;       


BOOL initSC()
{
    glEnable(GL_ALPHA_TEST);       
    glEnable(GL_DEPTH_TEST);       
    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);         
    glEnable(GL_LIGHT0);           

    glEnable(GL_BLEND);             
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0, 0, 0, 0);

    return 0;
}

void resizeSC(int width,int height)
{
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glMatrixMode(GL_MODELVIEW );
    glLoadIdentity();
}

BOOL renderSC()
{   
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glPushMatrix();

    glColor3f(0, 1, 1);
    glBegin(GL_TRIANGLES);                              // Drawing Using Triangles
        glColor3f(1.0f,0.0f,0.0f);                      // Set The Color To Red
        glVertex3f( 0.0f, 1.0f, 0.0f);                  // Top
        glColor3f(0.0f,1.0f,0.0f);                      // Set The Color To Green
        glVertex3f(-1.0f,-1.0f, 0.0f);                  // Bottom Left
        glColor3f(0.0f,0.0f,1.0f);                      // Set The Color To Blue
        glVertex3f( 1.0f,-1.0f, 0.0f);                  // Bottom Right
    glEnd();

    glPopMatrix();
    glFlush();

    return 0;
}

// DIB -> hDC
void draw(HDC pdcDest)
{
    assert(pdcDIB);

    verify(BitBlt(pdcDest, 0, 0, w, h, pdcDIB, 0, 0, SRCCOPY));
}

void CreateDIB(int cx, int cy)
{
    assert(cx > 0);
    assert(cy > 0);

    cxDIB = cx ;
    cyDIB = cy ;

    int iSize = sizeof(BITMAPINFOHEADER);   
    memset(&BIH, 0, iSize);

    BIH.biSize = iSize;
    BIH.biWidth = cx;   
    BIH.biHeight = cy; 
    BIH.biPlanes = 1;   
    BIH.biBitCount = 24;   
    BIH.biCompression = BI_RGB;

    if(pdcDIB)
        verify(DeleteDC(pdcDIB));

    pdcDIB = CreateCompatibleDC(NULL);
    assert(pdcDIB);

    if(hbmpDIB)
        verify(DeleteObject(hbmpDIB));

    hbmpDIB = CreateDIBSection(
        pdcDIB,         
        (BITMAPINFO*)&BIH, 
        DIB_RGB_COLORS,     
        &bmp_cnt,       
        NULL,
        0);

    assert(hbmpDIB);
    assert(bmp_cnt);

    if(hbmpDIB)
        SelectObject(pdcDIB, hbmpDIB);
}

BOOL CreateHGLRC()
{
    DWORD dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_BITMAP;

    PIXELFORMATDESCRIPTOR pfd ;
    memset(&pfd,0, sizeof(PIXELFORMATDESCRIPTOR)) ;
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;                       
    pfd.dwFlags =  dwFlags ;               
    pfd.iPixelType = PFD_TYPE_RGBA ;       
    pfd.cColorBits = 24 ;                   
    pfd.cDepthBits = 32 ;                   
    pfd.iLayerType = PFD_MAIN_PLANE ;       

   int PixelFormat = ChoosePixelFormat(pdcDIB, &pfd);
   if (PixelFormat == 0){
      assert(0);
      return FALSE ;
   }

   BOOL bResult = SetPixelFormat(pdcDIB, PixelFormat, &pfd);
   if (bResult==FALSE){
      assert(0);
      return FALSE ;
   }

   m_hrc = wglCreateContext(pdcDIB);
   if (!m_hrc){
      assert(0);
      return FALSE;
   }

   return TRUE;
}

LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;

    switch(msg)
    {
        case WM_ERASEBKGND:
            return 0;
        break;

        case WM_CREATE:
        break;

        case WM_DESTROY:
            if(m_hrc)
            {
                wglMakeCurrent(NULL, NULL);
                wglDeleteContext(m_hrc) ;
            }
            PostQuitMessage(0) ;
        break;

        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            renderSC(); // OpenGL -> DIB
            draw(hDC);  // DIB -> hDC
            EndPaint(hWnd, &ps);
        break;

        case WM_SIZE:
            w = LOWORD(lParam); h = HIWORD(lParam);         
            wglMakeCurrent(NULL, NULL);
            wglDeleteContext(m_hrc);

            CreateDIB(w, h);
            CreateHGLRC();
            verify(wglMakeCurrent(pdcDIB, m_hrc));

            initSC();
            resizeSC(w, h);
            renderSC();
        break;

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

    return 0;
}

int WINAPI _tWinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str,int nWinMode)
{   
    WNDCLASSEX wc;
    memset(&wc, 0, sizeof(wc));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowFunc;
    wc.cbClsExtra  = 0;
    wc.cbWndExtra  = 0;
    wc.hInstance = hThisInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW);
    wc.lpszClassName = szAppName;

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, _T("RegisterClassEx - failed"), _T("Error"), MB_OK | MB_ICONERROR);
        return FALSE;
    }

    HWND hWnd = CreateWindowEx(WS_EX_LAYERED, szAppName, wcWndName,
                    WS_VISIBLE | WS_POPUP, 200, 150, w, h,
                    NULL, NULL, hThisInst, NULL);
    if(!hWnd){
        MessageBox(NULL, _T("CreateWindowEx - failed"), _T("Error"), MB_OK | MB_ICONERROR);
        return FALSE;
    }

    verify(SetLayeredWindowAttributes(hWnd, 0x0, 0, LWA_COLORKEY));

    MSG msg;
    while(1)
    {
        while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
            if (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else return 0;
        }
    }

    return (FALSE);
}


Spätestens jetzt kannst Du Dir immer noch überlegen ob sich der Aufwand lohnt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 03.03.2013, 17:09    Titel: Antworten mit Zitat

ja ich dachte das es vielleicht mit openb3d nicht möglich oder nicht so einfach wäre, das es aber mit opengl direkt grundsätzlich gehen würde. wenn auch nicht ganz so simple wie man es sich immer erhofft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 09.03.2013, 16:58    Titel: Antworten mit Zitat

Ich hab mich (unter anderen wegen der neuerdings häufig auftretenen Fragen deswegen) nochmal bisschen mit beschaeftigt...

Die Idee: ein zweites Fenster mittels winapi zu erzeugen mit gültigem OpenGL Context wärend ich mit FreeBASIC ein gewöhnliches Grafikfenster bzw ein Spashscreen erzeuge... funzt super.. mehr oder weniger

muss ich bei 'screenptr' wegen des direkten schreiben der pixel noch was beachten, denn das bild das ich in mein FBScreen mittels glReadPixels bekomme ist nicht ganz richtig....


Hab mir den Spass gemacht und mal was bei Youtube hochgeladen...
http://www.youtube.com/watch?v=hWdueKMI29k

EDIT (hat sich erledigt)
hier meine ScreenGL_win32.bi
Code:
#include "windows.bi"
#include "GL\gl.bi"

#Define ScreenGLInit Win32_OGL.CreateGLWindow()
#Define ScreenGLclose Win32_OGL.KillGLWindow()
#Define ScreenGLUpdate Win32_OGL.UpdateGLScene()

Namespace Win32_OGL
    Dim h_RC       as HGLRC     
    Dim h_DC       as HDC       
    Dim h_Wnd      as HWND     
    Dim h_Instance as HINSTANCE
    Dim wmClass    as String*7

    Dim Win_title  as String
    Dim Win_width  as Integer
    Dim Win_height as Integer
    Dim Win_bits   as Integer


    Declare Sub KillGLWindow()
    Declare Function CreateGLWindow () as BOOL
    Declare Function WndProc        (byval h_Wnd   as HWND, _
                                     byval u_Msg   as UINT, _
                                     byval w_Param as WPARAM, _
                                     byval l_Param as LPARAM) as LRESULT
                                     
    Function UpdateGLScene() as Integer
        Dim wm_msg as MSG       
       
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
            TranslateMessage(@wm_msg)
            DispatchMessage(@wm_msg)           
        End If
       
        SwapBuffers(Win32_OGL.h_DC)                       
       
        screenlock
            glReadPixels(0,0,Win_width,Win_height, &h80E1, GL_UNSIGNED_BYTE, Screenptr)
        screenunlock
       
        Return TRUE
    End Function

    Sub KillGLWindow()
        If (h_RC) Then
            If wglMakeCurrent(NULL,NULL)=0 Then
                MessageBox(NULL, "Entfernen des DC und RC fehlgeschlagen.", _
                "Fehler",MB_OK OR MB_ICONINFORMATION)
            End If
   
            If wglDeleteContext(h_RC)=0 Then
                MessageBox(NULL, "Entfernen des RC fehlgeschlagen.", _
                "Fehler...",MB_OK OR MB_ICONINFORMATION)
                h_RC=NULL
            End If

            If h_DC Then
                If ReleaseDC(h_Wnd,h_DC)=0 Then
                    MessageBox(NULL, "Freigabe des Device Context fehlgeschlagen.", _
                    "Fehler",MB_OK OR MB_ICONINFORMATION)
                    h_DC=NULL
                End If
            End If

            If h_Wnd Then
                If DestroyWindow(h_Wnd)=0 Then
                    MessageBox(NULL, "Konnte hWnd nicht löschen.", _
                    "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
                    h_Wnd=NULL
                End If
            End If

            If UnregisterClass(strptr(wmClass),h_Instance)=0 Then
                MessageBox(NULL, "Konnte Klasse nicht entfernen.", _
                "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
                h_Instance=NULL
            End If
        End If
       
        Win_width  = 0
        Win_height = 0
        Win_bits   = 0
        h_RC       =  NULL
        h_DC       =  NULL
        h_Wnd      =  NULL
        h_Instance =  NULL
    End Sub       


    Function CreateGLWindow () as BOOL
        Win_title = "OpenGL"
        h_RC      = NULL
        h_DC      = NULL
        h_Wnd     = NULL
 
        If Screenptr Then
            ScreenInfo Win_width,Win_height,Win_bits
        Else
            MessageBox(NULL,"Initialisierung fehlgeschlagen.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End if
       
        Dim PixelFormat as GLuint
        Dim wc          as WNDCLASS
        Dim dwExStyle   as DWORD
        Dim dwStyle     as DWORD
        Dim WindowRect  as RECT
        wmClass="OpenGL"+chr(0)

        WindowRect.left=0
        WindowRect.right=Win_width
        WindowRect.top=0
        WindowRect.bottom=Win_height

        Dim dmScreenSettings as DEVMODE

        h_Instance = GetModuleHandle(NULL)

        wc.style = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
        wc.lpfnWndProc = @WndProc
        wc.cbClsExtra = 0
        wc.cbWndExtra = 0
        wc.hInstance = h_Instance
        wc.hIcon = LoadIcon(NULL, IDI_WINLOGO)
        wc.hCursor = LoadCursor(NULL, IDC_ARROW)
        wc.hbrBackground = NULL
        wc.lpszMenuName = NULL
        wc.lpszClassName = strptr(wmClass)

        If RegisterClass(@wc)=0 Then
            MessageBox(NULL, "Konnte die Fensterklasse nicht registrieren.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        ELSE
            dwExStyle = WS_EX_APPWINDOW OR WS_EX_WINDOWEDGE
            dwStyle   = WS_OVERLAPPEDWINDOW
        End If

        AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
   
        h_Wnd=CreateWindowEx(dwExStyle, _
        strptr(wmClass), Win_title, _
        WS_EX_TOOLWINDOW, _
        0, 0, Win_Width, _
        Win_Height, _
        NULL, NULL, h_Instance, NULL)
       
        If h_Wnd=0 Then
            KillGLWindow()
       
            MessageBox(NULL, "Fenster konnte nicht erstellt werden.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
       
            Return FALSE
        End If

        Static pfd as PIXELFORMATDESCRIPTOR
       
        pfd.nsize      = len(PIXELFORMATDESCRIPTOR)
        pfd.nVersion   = 1
        pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
        pfd.iPixelType = PFD_TYPE_RGBA
        pfd.cColorBits = Win_bits
        pfd.cDepthBits = 16
        pfd.iLayerType = PFD_MAIN_PLANE

        h_DC=GetDC(h_Wnd)
       
        If h_DC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen DC erstellen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        PixelFormat=ChoosePixelFormat(h_DC,@pfd)
        If PixelFormat=0 Then
           
            KillGLWindow()
            MessageBox(NULL,"Konnte kein passendes Pixelformat finden.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
           
            Return FALSE
        End If

        If SetPixelFormat(h_DC,PixelFormat,@pfd)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte Pixelformat nicht setzen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        h_RC=wglCreateContext(h_DC)
        If h_RC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen Rendering Context bekommen.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If


        If wglMakeCurrent(h_DC,h_RC)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte den Rendering Context nicht aktivieren.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        ShowWindow(h_Wnd,SW_HIDE)
                 
        Return TRUE
    End Function

    Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, _
                     byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
                 
        Select Case (u_Msg)
            Case WM_SYSCOMMAND
                Select Case (w_Param)
                    Case SC_SCREENSAVE
                        Return 0
                    Case SC_MONITORPOWER
                        Return 0
                End Select
            Case WM_CLOSE
                PostQuitMessage(0)
                Return 0
        End Select
   
        Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)
    End Function
End Namespace ''Win32_OGL

Sub setPerspective(byval fieldOfView as Single, byval aspect as Single, byval zNear as Single, byval zFar as Single)
    Dim as Single fH, fW
    fH = tan( fieldOfView / 360.0f * (ATN(1)*4)) * zNear
    fW = fH * aspect
    glFrustum( -fW, fW, -fH, fH, zNear, zFar )
End Sub                                     



und hier was zum testen...

Code:

#include "ScreenGL_win32.bi"

CONST Deg2Rad = ATN(1)/45

Sub Kreis(byval mitteX as Single, byval mitteY as Single, byval radius as Single, byval Segmente as Integer = 16)
    Dim as Single Winkel, WinkelpS, WinkelR, Sx, Sy
    'Winkelschritt (per Segment)
    WinkelpS = 360/Segmente
   
    'Anfangswinkel auf 0
    Winkel = 0
   
    glBegin GL_TRIANGLE_FAN
        'mitte
        glVertex3f( mitteX, mitteY, 0.0 )
           
        For s as Integer = 0 to Segmente
            'Winkel in Bogenmaß
            WinkelR = Deg2Rad*Winkel
   
            Sx = mitteX + cos(WinkelR) * radius
            Sy = mitteY + sin(WinkelR) * radius
 
            glVertex3f( Sx, Sy, 0.0 )
   
            'Winkel für nächstes Segment erhöhen
            Winkel += WinkelpS
        Next s
   
    glEnd()
End Sub       

screenres 800,600,32,, &h10
ScreenGLInit
       
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
setPerspective(45.0f,cast(GLfloat,800/600),0.1f,100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
   
glShadeModel(GL_SMOOTH)
glClearColor(1.0f, 0.0f, 1.0f, 0.0f)
glClearDepth(1.0f)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
   
Dim OpenGLVersion as String = *glGetString(GL_VENDOR)
OpenGLVersion += ", " + *glGetString(GL_VERSION)

Do

    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef 0.0, 0.0, -6.0
   
    glColor3f 0.2,0.0,0.9
    Kreis(1.1,0,0.5)
   
    ScreenGLUpdate
    screenlock
        Draw String (10,10),OpenGLVersion
    screenunlock
   
    sleep 10
Loop until multikey(&h01)'ESC
       
ScreenGLClose

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 10.03.2013, 15:57    Titel: Antworten mit Zitat

super sache - danke

hab jetzt ein wenig damit rum gespielt und 2 probleme

1. ich habe immer ein schwarzen balken unten und rechts am rand
2. beide objekte drehen sich - doch leider die pyramide um den kreis herum. habs dann mit glpushmatrix versucht, doch jetzt ist die pyramide gar nicht mehr zu sehen.

Code:

#include "ScreenGL_win32.bi"

CONST Deg2Rad = ATN(1)/45
DIM shared AS SINGLE PyraXDrehw, PyraYDrehw, PyraZDrehw :'<------------------------ für Pyramide per Tasten drehen
DECLARE SUB Pyramide (was AS STRING, StrPara AS STRING, Para1 AS SINGLE, Para2 AS SINGLE, Para3 AS SINGLE)

Sub Kreis(byval mitteX as Single, byval mitteY as Single, byval radius as Single, byval Segmente as Integer = 30)
    Dim as Single Winkel, WinkelpS, WinkelR, Sx, Sy
    'Winkelschritt (per Segment)
    WinkelpS = 360/Segmente
   
    'Anfangswinkel auf 0
    Winkel = 0
    glrotatef PyraXDrehw, 1, 0, 1
    glBegin GL_TRIANGLE_FAN
        'mitte
        glVertex3f( mitteX, mitteY, 0.0 )
           
        For s as Integer = 0 to Segmente
            'Winkel in Bogenmaß
            WinkelR = Deg2Rad*Winkel
   
            Sx = mitteX + cos(WinkelR) * radius
            Sy = mitteY + sin(WinkelR) * radius
 
            glVertex3f( Sx, Sy, 0.0 )
   
            'Winkel für nächstes Segment erhöhen
            Winkel += WinkelpS
        Next s
   
    glEnd()
End Sub       

screenres 1024,600,32,, &h10
ScreenGLInit
       
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
setPerspective(45.0f,1024/600,0.1f,100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
   
glShadeModel(GL_SMOOTH)
glClearColor(1.0f, 0.0f, 1.0f, 0.0f)
glClearDepth(1.0f)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
   
Dim OpenGLVersion as String = *glGetString(GL_VENDOR)
OpenGLVersion += ", " + *glGetString(GL_VERSION)

Pyramide("SetzLaengen" , "", 1, 1,  1)
Pyramide("SetzFarbe1"  , "", 1, 0, 0)
Pyramide("SetzFarbe2"  , "", 0, 1, 0)
Pyramide("SetzFarbe3"  , "", 0, 0, 1)
Pyramide("SetzFarbe4"  , "", 1, 1, 0)
Pyramide("SetzFarbe5"  , "", 1, 0.1, 1)

Do

    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
   
    glPushMatrix :'<--------zusätzlicher Zettel unterschieben
    glColor3f 0.2,0.0,0.9
    glTranslatef 0.0, 0.0, -6.0
    Kreis(0,0,0.5)
    glPopMatrix :'<---------zusätzlichen Zettel wegschmeißen

    glPushMatrix :'<--------zusätzlicher Zettel unterschieben
    glTranslatef -2.0, 0.0, -1.0
    PyraXDrehw=PyraXDrehw+1
    Pyramide("BeschreibungsListe"  , "", PyraXDrehw, 0, 0) :'<-----die erste Pyramide
    glPopMatrix :'<---------zusätzlichen Zettel wegschmeißen
   
    ScreenGLUpdate
    screenlock
        Draw String (10,10),OpenGLVersion
    screenunlock
   
    sleep 10
Loop until multikey(&h01)'ESC
       
ScreenGLClose
END

'-------------------------
SUB Pyramide(was AS STRING, StrPara AS STRING, Para1 AS SINGLE, Para2 AS SINGLE, Para3 AS SINGLE)
   'Pyramide erstellen, Grundfläche/Quadrat = auf Höhe 0, seitlich mittig auf X- und Z-Achse Positioniert
   'Grundflächengroesse = XLaenge x ZLaenge, Höhe Pyramide = ZLaenge
   STATIC AS SINGLE XLaenge, YLaenge, ZLaenge
   STATIC AS SINGLE Farbe1Rot, Farbe1Gruen, Farbe1Blau
   STATIC AS SINGLE Farbe2Rot, Farbe2Gruen, Farbe2Blau
   STATIC AS SINGLE Farbe3Rot, Farbe3Gruen, Farbe3Blau
   STATIC AS SINGLE Farbe4Rot, Farbe4Gruen, Farbe4Blau
   STATIC AS SINGLE Farbe5Rot, Farbe5Gruen, Farbe5Blau
   STATIC AS INTEGER ZaehlerX, ZaehlerZ                   :'ForNext-Zählvars, ggf. rekursiver aufruf dieser Sub, drum STATIC
   SELECT CASE UCASE(was)
      CASE "SETZLAENGEN"  : XLaenge   = Para1 : YLaenge     = Para2 : ZLaenge     = Para3
      CASE "SETZFARBE1"   : Farbe1Rot = Para1 : Farbe1Gruen = Para2 : Farbe1Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE2"   : Farbe2Rot = Para1 : Farbe2Gruen = Para2 : Farbe2Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE3"   : Farbe3Rot = Para1 : Farbe3Gruen = Para2 : Farbe3Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE4"   : Farbe4Rot = Para1 : Farbe4Gruen = Para2 : Farbe4Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE5"   : Farbe5Rot = Para1 : Farbe5Gruen = Para2 : Farbe5Blau  = Para3 :'der Boden/Quadrat
      CASE "BESCHREIBUNGSLISTE"
         'die OpenGL-Beschreibungsliste zum Anzeigen der Pyramide erstellen
         glrotatef Para1, 1, 0, 0    :'<----------- um X-Achse drehen
         glrotatef Para2, 0, 1, 0    :'<----------- um Y-Achse drehen
         glrotatef Para3, 0, 0, 1    :'<----------- um Z-Achse drehen

         glBegin GL_QUADS
            'der Boden der Pyramide als Quadrat, auf Höhe 0(Y-Achse),
            'seitliche Ausrichtungen = Quadratmitte = X-Achsenmitte und Z-Achsenmitte
            'damit Zentriert sitzt, für 1.Punkt einfach halbe Kantenlänge von 0 Abziehen, für 2. dazuaddieren
            'Reihenfolge Eckpunktangabe gegen Uhrzeigersinn VON UNTEN her gesehen (unten=Außenseite später)
            glColor3f  Farbe5Rot        , Farbe5Gruen      , Farbe5Blau
            glVertex3f 0-(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
         glEnd
         glBegin GL_TRIANGLES
            '   Dreieckseite 1 =an Kante 1.+2.Quadratpunkt
            glColor3f  Farbe1Rot        , Farbe1Gruen      , Farbe1Blau
            glVertex3f 0-(XLaenge/2)    , 0       , 0-(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0       , 0+(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 2 =an Kante 2.+3.Quadratpunkt
            glColor3f  Farbe2Rot        , Farbe2Gruen      , Farbe2Blau
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 3 =an Kante 3.+4.Quadratpunkt
            glColor3f  Farbe3Rot        , Farbe3Gruen      , Farbe3Blau
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 4 =an Kante 3.+1.Quadratpunkt
            glColor3f  Farbe4Rot        , Farbe4Gruen      , Farbe4Blau
            glVertex3f 0-(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
         glEnd
      CASE ELSE
         'Hier kommen alle SUB-Aufrufe an, welche als
         'was-Parameter einen Eintrag haben, der hier
         'nicht ausgewertet wurde.
         'Tippfehler vom Programmierer????
   END SELECT
END SUB
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2013, 16:12    Titel: Antworten mit Zitat

glPushMatrix speichert die Aktuelle Matrix, in dem Fall auf 0,0,0
dann setzt du die translate, den kreis und setzt zurück auf 0,0,0 mit PopMatrix

dann die pyramide... die ist mit translate -2,0,-1 einfach zu nah am viewport
setz mal bei gltranslate -2.0,0.0,-6.0

Ich versuche gerade noch ein wenig zu verbessern und optimieren (vermutlich noch nicht fertig) ausserdem hätte ich auch gern noch eine X11 unterstützung (wegen Linux)

Aber ein paar minimale Änderungen sind bereits drin (sowie ein Debugmode)
Hier aktuell der Code der #screengl_win32.bi'
Code:

#include once "windows.bi"
#include once "GL\gl.bi"

#Define ScreenGLInit Win32_OGL.CreateGLWindow()
#Define ScreenGLInit_DBG Win32_OGL.CreateGLWindow(1)
#Define ScreenGLClose Win32_OGL.KillGLWindow()
#Define ScreenGLUpdate Win32_OGL.UpdateGLScene()

Namespace Win32_OGL
    Dim h_RC       as HGLRC     
    Dim h_DC       as HDC       
    Dim h_Wnd      as HWND     
    Dim h_Instance as HINSTANCE
    Dim wmClass    as String*7

    Dim Win_title  as String
    Dim Win_width  as Integer
    Dim Win_height as Integer
    Dim Win_bits   as Integer


    Declare Sub KillGLWindow()
    Declare Function CreateGLWindow (byval Debugmode as Integer=0) as BOOL
    Declare Function WndProc        (byval h_Wnd   as HWND, _
                                     byval u_Msg   as UINT, _
                                     byval w_Param as WPARAM, _
                                     byval l_Param as LPARAM) as LRESULT
                                     
    Function UpdateGLScene() as Integer
        Static wm_msg as MSG       
       
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
            TranslateMessage(@wm_msg)
            DispatchMessage(@wm_msg)           
        End If
       
        SwapBuffers(Win32_OGL.h_DC)                       
       
        'Copy GL to fbgfx
        glReadPixels(0,0,Win_width,Win_height, &h80E1, GL_UNSIGNED_BYTE, Screenptr)
       
        Return TRUE
    End Function

    Sub KillGLWindow()
        If (h_RC) Then
            If wglMakeCurrent(NULL,NULL) = 0 Then MessageBox(NULL, "Entfernen des DC und RC fehlgeschlagen."    , "ERROR", MB_OK OR MB_ICONINFORMATION)
            If wglDeleteContext(h_RC)    = 0 Then MessageBox(NULL, "Entfernen des RC fehlgeschlagen."           , "ERROR", MB_OK OR MB_ICONINFORMATION) : h_RC  = NULL
            If h_DC Then
                If ReleaseDC(h_Wnd,h_DC) = 0 Then MessageBox(NULL, "Freigabe des Device Context fehlgeschlagen.", "ERROR", MB_OK OR MB_ICONINFORMATION) : h_DC  = NULL
            End If
            If h_Wnd Then
                If DestroyWindow(h_Wnd)  = 0 Then MessageBox(NULL, "Konnte hWnd nicht löschen."                 , "ERROR", MB_OK OR MB_ICONINFORMATION) : h_Wnd = NULL
            End If

            If UnregisterClass(strptr(wmClass),h_Instance) = 0 Then
                MessageBox(NULL, "Konnte Klasse nicht entfernen.", "ERROR", MB_OK OR MB_ICONINFORMATION) : h_Instance = NULL
            End If
        End If
       
        h_RC       = NULL : h_DC       = NULL : h_Wnd      = NULL : h_Instance = NULL
        Win_width  = NULL : Win_height = NULL : Win_bits   = NULL
    End Sub       


    Function CreateGLWindow (byval Debugmode as Integer=0) as BOOL
        Win_title = "OpenGL" : h_RC      = NULL : h_DC      = NULL : h_Wnd     = NULL
 
        If Screenptr Then
            ScreenInfo Win_width,Win_height,Win_bits
        Else
            MessageBox(NULL,"Initialisierung fehlgeschlagen.", "ERROR", MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End if
       
        Dim PixelFormat as GLuint
        Dim wc          as WNDCLASS
        Dim dwExStyle   as DWORD
        Dim dwStyle     as DWORD
        Dim WindowRect  as RECT
        wmClass="OpenGL"+chr(0)

        WindowRect.left = 0 : WindowRect.right  = Win_width
        WindowRect.top  = 0 : WindowRect.bottom = Win_height

        Dim dmScreenSettings as DEVMODE

        h_Instance = GetModuleHandle(NULL)

        wc.style = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
        wc.lpfnWndProc = @WndProc
        wc.cbClsExtra = 0
        wc.cbWndExtra = 0
        wc.hInstance = h_Instance
        wc.hIcon = LoadIcon(NULL, IDI_WINLOGO)
        wc.hCursor = LoadCursor(NULL, IDC_ARROW)
        wc.hbrBackground = NULL
        wc.lpszMenuName = NULL
        wc.lpszClassName = strptr(wmClass)

        If RegisterClass(@wc)=0 Then
            MessageBox(NULL, "Konnte die Fensterklasse nicht registrieren.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        ELSE
            dwExStyle = WS_EX_APPWINDOW OR WS_EX_WINDOWEDGE
            dwStyle   = WS_OVERLAPPEDWINDOW
        End If

        AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
   
        h_Wnd=CreateWindowEx(dwExStyle, _
        strptr(wmClass), Win_title, _
        WS_EX_TOOLWINDOW, _
        0, 0, Win_Width, _
        Win_Height, _
        NULL, NULL, h_Instance, NULL)
       
        If h_Wnd=0 Then
            KillGLWindow()
       
            MessageBox(NULL, "Fenster konnte nicht erstellt werden.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
       
            Return FALSE
        End If

        Static pfd as PIXELFORMATDESCRIPTOR
       
        pfd.nsize      = len(PIXELFORMATDESCRIPTOR)
        pfd.nVersion   = 1
        pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
        pfd.iPixelType = PFD_TYPE_RGBA
        pfd.cColorBits = Win_bits
        pfd.cDepthBits = 16
        pfd.iLayerType = PFD_MAIN_PLANE

        h_DC=GetDC(h_Wnd)
       
        If h_DC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen DC erstellen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        PixelFormat=ChoosePixelFormat(h_DC,@pfd)
        If PixelFormat=0 Then
           
            KillGLWindow()
            MessageBox(NULL,"Konnte kein passendes Pixelformat finden.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
           
            Return FALSE
        End If

        If SetPixelFormat(h_DC,PixelFormat,@pfd)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte Pixelformat nicht setzen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        h_RC=wglCreateContext(h_DC)
        If h_RC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen Rendering Context bekommen.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If


        If wglMakeCurrent(h_DC,h_RC)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte den Rendering Context nicht aktivieren.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        If Debugmode Then
            ShowWindow(h_Wnd,SW_SHOW)
        Else
            ShowWindow(h_Wnd,SW_HIDE)
        End If
                 
        Return TRUE
    End Function

    Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, _
                     byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
                 
        Select Case (u_Msg)
            Case WM_SYSCOMMAND
                Select Case (w_Param)
                    Case SC_SCREENSAVE
                        Return 0
                    Case SC_MONITORPOWER
                        Return 0
                End Select
            Case WM_CLOSE
                PostQuitMessage(0)
                Return 0
        End Select
   
        Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)
    End Function
End Namespace ''Win32_OGL

Sub setPerspective(byval fieldOfView as Single, byval aspect as Single, byval zNear as Single, byval zFar as Single)
    Dim as Single fH, fW
    fH = tan( fieldOfView / 360.0f * (ATN(1)*4)) * zNear
    fW = fH * aspect
    glFrustum( -fW, fW, -fH, fH, zNear, zFar )
End Sub                                     


und hier dein Beispiel mit den anpassungen:
Code:

#include "ScreenGL_win32.bi"

CONST Deg2Rad = ATN(1)/45
DIM shared AS SINGLE PyraXDrehw, PyraYDrehw, PyraZDrehw :'<------------------------ für Pyramide per Tasten drehen
DECLARE SUB Pyramide (was AS STRING, StrPara AS STRING, Para1 AS SINGLE, Para2 AS SINGLE, Para3 AS SINGLE)

Sub Kreis(byval mitteX as Single, byval mitteY as Single, byval radius as Single, byval Segmente as Integer = 30)
    Dim as Single Winkel, WinkelpS, WinkelR, Sx, Sy
    'Winkelschritt (per Segment)
    WinkelpS = 360/Segmente
   
    'Anfangswinkel auf 0
    Winkel = 0
    glrotatef PyraXDrehw, 1, 0, 1
    glBegin GL_TRIANGLE_FAN
        'mitte
        glVertex3f( mitteX, mitteY, 0.0 )
           
        For s as Integer = 0 to Segmente
            'Winkel in Bogenmaß
            WinkelR = Deg2Rad*Winkel
   
            Sx = mitteX + cos(WinkelR) * radius
            Sy = mitteY + sin(WinkelR) * radius
 
            glVertex3f( Sx, Sy, 0.0 )
   
            'Winkel für nächstes Segment erhöhen
            Winkel += WinkelpS
        Next s
   
    glEnd()
End Sub       

screenres 1024,600,32',, &h10
'ScreenGLInit
ScreenGLInit_DBG '' "Debugmode" zeigt das OpenGL Fenster
       
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
setPerspective(45.0f,1024/600,0.1f,100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
   
glShadeModel(GL_SMOOTH)
glClearColor(1.0f, 0.0f, 1.0f, 0.0f)
glClearDepth(1.0f)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
   
Dim OpenGLVersion as String = *glGetString(GL_VENDOR)
OpenGLVersion += ", " + *glGetString(GL_VERSION)

Pyramide("SetzLaengen" , "", 1, 1,  1)
Pyramide("SetzFarbe1"  , "", 1, 0, 0)
Pyramide("SetzFarbe2"  , "", 0, 1, 0)
Pyramide("SetzFarbe3"  , "", 0, 0, 1)
Pyramide("SetzFarbe4"  , "", 1, 1, 0)
Pyramide("SetzFarbe5"  , "", 1, 0.1, 1)

Do

    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
   
    glPushMatrix :'<--------zusätzlicher Zettel unterschieben
    glColor3f 0.2,0.0,0.9
    glTranslatef 0.0, 0.0, -6.0
    Kreis(0,0,0.5)
    glPopMatrix :'<---------zusätzlichen Zettel wegschmeißen

    glPushMatrix :'<--------zusätzlicher Zettel unterschieben
    glTranslatef -2.0, 0.0, -6.0
    PyraXDrehw=PyraXDrehw+1
    Pyramide("BeschreibungsListe"  , "", PyraXDrehw, 0, 0) :'<-----die erste Pyramide
    glPopMatrix :'<---------zusätzlichen Zettel wegschmeißen
   
    screenlock 'die Änderung an der ScreenGLUpdate erfordert das diese zwischen screenlock stehen MUSS!
        ScreenGLUpdate
        Draw String (10,10),OpenGLVersion
    screenunlock
   
    sleep 10
Loop until multikey(&h01)'ESC
       
ScreenGLClose
END

'-------------------------
SUB Pyramide(was AS STRING, StrPara AS STRING, Para1 AS SINGLE, Para2 AS SINGLE, Para3 AS SINGLE)
   'Pyramide erstellen, Grundfläche/Quadrat = auf Höhe 0, seitlich mittig auf X- und Z-Achse Positioniert
   'Grundflächengroesse = XLaenge x ZLaenge, Höhe Pyramide = ZLaenge
   STATIC AS SINGLE XLaenge, YLaenge, ZLaenge
   STATIC AS SINGLE Farbe1Rot, Farbe1Gruen, Farbe1Blau
   STATIC AS SINGLE Farbe2Rot, Farbe2Gruen, Farbe2Blau
   STATIC AS SINGLE Farbe3Rot, Farbe3Gruen, Farbe3Blau
   STATIC AS SINGLE Farbe4Rot, Farbe4Gruen, Farbe4Blau
   STATIC AS SINGLE Farbe5Rot, Farbe5Gruen, Farbe5Blau
   STATIC AS INTEGER ZaehlerX, ZaehlerZ                   :'ForNext-Zählvars, ggf. rekursiver aufruf dieser Sub, drum STATIC
   SELECT CASE UCASE(was)
      CASE "SETZLAENGEN"  : XLaenge   = Para1 : YLaenge     = Para2 : ZLaenge     = Para3
      CASE "SETZFARBE1"   : Farbe1Rot = Para1 : Farbe1Gruen = Para2 : Farbe1Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE2"   : Farbe2Rot = Para1 : Farbe2Gruen = Para2 : Farbe2Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE3"   : Farbe3Rot = Para1 : Farbe3Gruen = Para2 : Farbe3Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE4"   : Farbe4Rot = Para1 : Farbe4Gruen = Para2 : Farbe4Blau  = Para3 :'ein Dreieck
      CASE "SETZFARBE5"   : Farbe5Rot = Para1 : Farbe5Gruen = Para2 : Farbe5Blau  = Para3 :'der Boden/Quadrat
      CASE "BESCHREIBUNGSLISTE"
         'die OpenGL-Beschreibungsliste zum Anzeigen der Pyramide erstellen
         glrotatef Para1, 1, 0, 0    :'<----------- um X-Achse drehen
         glrotatef Para2, 0, 1, 0    :'<----------- um Y-Achse drehen
         glrotatef Para3, 0, 0, 1    :'<----------- um Z-Achse drehen

         glBegin GL_QUADS
            'der Boden der Pyramide als Quadrat, auf Höhe 0(Y-Achse),
            'seitliche Ausrichtungen = Quadratmitte = X-Achsenmitte und Z-Achsenmitte
            'damit Zentriert sitzt, für 1.Punkt einfach halbe Kantenlänge von 0 Abziehen, für 2. dazuaddieren
            'Reihenfolge Eckpunktangabe gegen Uhrzeigersinn VON UNTEN her gesehen (unten=Außenseite später)
            glColor3f  Farbe5Rot        , Farbe5Gruen      , Farbe5Blau
            glVertex3f 0-(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
         glEnd
         glBegin GL_TRIANGLES
            '   Dreieckseite 1 =an Kante 1.+2.Quadratpunkt
            glColor3f  Farbe1Rot        , Farbe1Gruen      , Farbe1Blau
            glVertex3f 0-(XLaenge/2)    , 0       , 0-(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0       , 0+(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 2 =an Kante 2.+3.Quadratpunkt
            glColor3f  Farbe2Rot        , Farbe2Gruen      , Farbe2Blau
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0-(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 3 =an Kante 3.+4.Quadratpunkt
            glColor3f  Farbe3Rot        , Farbe3Gruen      , Farbe3Blau
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0-(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
            '   Dreieckseite 4 =an Kante 3.+1.Quadratpunkt
            glColor3f  Farbe4Rot        , Farbe4Gruen      , Farbe4Blau
            glVertex3f 0-(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0+(XLaenge/2)    , 0  , 0+(ZLaenge/2)
            glVertex3f 0                , YLaenge , 0
         glEnd
      CASE ELSE
         'Hier kommen alle SUB-Aufrufe an, welche als
         'was-Parameter einen Eintrag haben, der hier
         'nicht ausgewertet wurde.
         'Tippfehler vom Programmierer????
   END SELECT
END SUB


Edit:
ach ja, zum schwarzen Balken kann ich leider nichts sagen... bei mir ist dieser nicht... kannst mal ein screen machen bitte?
Edit2:
gerade mit XP in einer VM getestet... da ist der seltsame Balken, ich guck mal woran es liegen könnte...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 10.03.2013, 16:34    Titel: Antworten mit Zitat

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2013, 16:44    Titel: Antworten mit Zitat

Müsste erstmal so gehen, XP arbeitet scheinbar etwas anders mit fenstern als Win7....






Code:
#include once "windows.bi"
#include once "GL\gl.bi"

#Define ScreenGLInit Win32_OGL.CreateGLWindow()
#Define ScreenGLInit_DBG Win32_OGL.CreateGLWindow(1)
#Define ScreenGLClose Win32_OGL.KillGLWindow()
#Define ScreenGLUpdate Win32_OGL.UpdateGLScene()

Namespace Win32_OGL
    Dim h_RC       as HGLRC     
    Dim h_DC       as HDC       
    Dim h_Wnd      as HWND     
    Dim h_Instance as HINSTANCE
    Dim wmClass    as String*7

    Dim Win_title  as String
    Dim Win_width  as Integer
    Dim Win_height as Integer
    Dim Win_bits   as Integer


    Declare Sub KillGLWindow()
    Declare Function CreateGLWindow (byval Debugmode as Integer=0) as BOOL
    Declare Function WndProc        (byval h_Wnd   as HWND, _
                                     byval u_Msg   as UINT, _
                                     byval w_Param as WPARAM, _
                                     byval l_Param as LPARAM) as LRESULT
                                     
    Function UpdateGLScene() as Integer
        Static wm_msg as MSG       
       
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
            TranslateMessage(@wm_msg)
            DispatchMessage(@wm_msg)           
        End If
       
        SwapBuffers(Win32_OGL.h_DC)                       
       
        'Copy GL to fbgfx
        glReadPixels(0,0,Win_width,Win_height, &h80E1, GL_UNSIGNED_BYTE, Screenptr)
       
        Return TRUE
    End Function

    Sub KillGLWindow()
        If (h_RC) Then
            If wglMakeCurrent(NULL,NULL) = 0 Then MessageBox(NULL, "Entfernen des DC und RC fehlgeschlagen."    , "ERROR", MB_OK OR MB_ICONINFORMATION)
            If wglDeleteContext(h_RC)    = 0 Then MessageBox(NULL, "Entfernen des RC fehlgeschlagen."           , "ERROR", MB_OK OR MB_ICONINFORMATION) : h_RC  = NULL
            If h_DC Then
                If ReleaseDC(h_Wnd,h_DC) = 0 Then MessageBox(NULL, "Freigabe des Device Context fehlgeschlagen.", "ERROR", MB_OK OR MB_ICONINFORMATION) : h_DC  = NULL
            End If
            If h_Wnd Then
                If DestroyWindow(h_Wnd)  = 0 Then MessageBox(NULL, "Konnte hWnd nicht löschen."                 , "ERROR", MB_OK OR MB_ICONINFORMATION) : h_Wnd = NULL
            End If

            If UnregisterClass(strptr(wmClass),h_Instance) = 0 Then
                MessageBox(NULL, "Konnte Klasse nicht entfernen.", "ERROR", MB_OK OR MB_ICONINFORMATION) : h_Instance = NULL
            End If
        End If
       
        h_RC       = NULL : h_DC       = NULL : h_Wnd      = NULL : h_Instance = NULL
        Win_width  = NULL : Win_height = NULL : Win_bits   = NULL
    End Sub       


    Function CreateGLWindow (byval Debugmode as Integer=0) as BOOL
        Win_title = "OpenGL" : h_RC      = NULL : h_DC      = NULL : h_Wnd     = NULL
 
        If Screenptr Then
            ScreenInfo Win_width,Win_height,Win_bits
        Else
            MessageBox(NULL,"Initialisierung fehlgeschlagen.", "ERROR", MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End if
       
        Dim PixelFormat as GLuint
        Dim wc          as WNDCLASS
        Dim dwExStyle   as DWORD
        Dim dwStyle     as DWORD
        Dim WindowRect  as RECT
        wmClass="OpenGL"+chr(0)

        WindowRect.left = 0 : WindowRect.right  = Win_width
        WindowRect.top  = 0 : WindowRect.bottom = Win_height

        Dim dmScreenSettings as DEVMODE

        h_Instance = GetModuleHandle(NULL)

        wc.style = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
        wc.lpfnWndProc = @WndProc
        wc.cbClsExtra = 0
        wc.cbWndExtra = 0
        wc.hInstance = h_Instance
        wc.hIcon = LoadIcon(NULL, IDI_WINLOGO)
        wc.hCursor = LoadCursor(NULL, IDC_ARROW)
        wc.hbrBackground = NULL
        wc.lpszMenuName = NULL
        wc.lpszClassName = strptr(wmClass)

        If RegisterClass(@wc)=0 Then
            MessageBox(NULL, "Konnte die Fensterklasse nicht registrieren.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        ELSE
            dwExStyle = WS_EX_APPWINDOW 'OR WS_EX_WINDOWEDGE
            dwStyle   = WS_POPUP
        End If

        AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
   
        'WS_EX_TOOLWINDOW
        h_Wnd=CreateWindowEx(dwExStyle, _
        strptr(wmClass), Win_title, _
        dwStyle, _
        0, 0, Win_Width, _
        Win_Height, _
        NULL, NULL, h_Instance, NULL)
       
        If h_Wnd=0 Then
            KillGLWindow()
       
            MessageBox(NULL, "Fenster konnte nicht erstellt werden.", _
            "ERROR", MB_OK OR MB_ICONEXCLAMATION)
       
            Return FALSE
        End If

        Static pfd as PIXELFORMATDESCRIPTOR
       
        pfd.nsize      = len(PIXELFORMATDESCRIPTOR)
        pfd.nVersion   = 1
        pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
        pfd.iPixelType = PFD_TYPE_RGBA
        pfd.cColorBits = Win_bits
        pfd.cDepthBits = 16
        pfd.iLayerType = PFD_MAIN_PLANE

        h_DC=GetDC(h_Wnd)
       
        If h_DC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen DC erstellen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        PixelFormat=ChoosePixelFormat(h_DC,@pfd)
        If PixelFormat=0 Then
           
            KillGLWindow()
            MessageBox(NULL,"Konnte kein passendes Pixelformat finden.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
           
            Return FALSE
        End If

        If SetPixelFormat(h_DC,PixelFormat,@pfd)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte Pixelformat nicht setzen.", _
            "ERROR",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        h_RC=wglCreateContext(h_DC)
        If h_RC=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte keinen Rendering Context bekommen.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If


        If wglMakeCurrent(h_DC,h_RC)=0 Then
            KillGLWindow()
            MessageBox(NULL,"Konnte den Rendering Context nicht aktivieren.", _
            "Fehler",MB_OK OR MB_ICONEXCLAMATION)
            Return FALSE
        End If

        If Debugmode Then
            ShowWindow(h_Wnd,SW_SHOW)
        Else
            ShowWindow(h_Wnd,SW_HIDE)
        End If
                 
        Return TRUE
    End Function

    Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, _
                     byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
                 
        Select Case (u_Msg)
            Case WM_SYSCOMMAND
                Select Case (w_Param)
                    Case SC_SCREENSAVE
                        Return 0
                    Case SC_MONITORPOWER
                        Return 0
                End Select
            Case WM_CLOSE
                PostQuitMessage(0)
                Return 0
        End Select
   
        Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)
    End Function
End Namespace ''Win32_OGL

Sub setPerspective(byval fieldOfView as Single, byval aspect as Single, byval zNear as Single, byval zFar as Single)
    Dim as Single fH, fW
    fH = tan( fieldOfView / 360.0f * (ATN(1)*4)) * zNear
    fW = fH * aspect
    glFrustum( -fW, fW, -fH, fH, zNear, zFar )
End Sub                                     


ps: spielst Du aktiv LastCahos? happy
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 10.03.2013, 17:01    Titel: Antworten mit Zitat

ok probier ich gleich aus.


habs nach langer zeit wieder installiert kann aber auf meinem klein bildschirm nicht viel erkennen und wie es genau ging wees ich auch nicht mehr so richtig - muss mich erstmal wieder rein fummeln wenn ich zeit hab. zwinkern

EDIT/ ja so gehts - danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2013, 17:15    Titel: Antworten mit Zitat

Es lag daran das dass unsichtbare fenster mit rahmen war und dadurch über den desktoprand hinaus ging... unter windows7 macht das kein problem, da kann man das fenster auch irgendwohin hinaus wegschieben unter xp wird aber der bereich ausserhalb nicht aktualisiert wodurch dann dieser balken entsteht.
hab das unsichtbare fenster nun rahmenlos gemacht, wenn man nun also ein fenster erstellt sollte es nicht die desktopauflösung überschreiten... (jedenfalls unter xp happy)
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 10.03.2013, 17:44    Titel: Antworten mit Zitat

das ulkig ist das ich win 7 pro hab verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2013, 17:50    Titel: Antworten mit Zitat

32 oder 64bit? vielleicht liegts auch am Treiber?! grad nochmal unter win7 mit sichtbaren und verschiebbaren hintergrundfenster getestet, da geht das ohne probleme, in xp 32bit (mit VM Treiber) wird der bereich ausserhalb nicht aktualisiert...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 10.03.2013, 18:04    Titel: Antworten mit Zitat

32bit
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 10.03.2013, 19:06    Titel: Antworten mit Zitat

Hatte dummerweise noch einen echt dummen Fehler drinne, da glReadPixels in OpenGL unten links beginnt waren alle Kopierten Pixel horizontal gespiegelt dargestellt...

Habe, und werde in zukunft die neue Version auf meine Seite laden...
http://eternalpain.tgp-gaming.de/

Auch durch einen klick auf meine Signatur erreichtbar zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz