 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 25.11.2011, 16:26 Titel: [erledigt] Splashscreen (transparent) mit OpenGL (win32) |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 26.11.2011, 17:03 Titel: |
|
|
Nope. Das musst du händisch machen, also in einem Backbuffer rendern, transparent machen und auf den Screen blitten. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 28.11.2011, 13:02 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 28.11.2011, 18:03 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 03.03.2013, 16:45 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 03.03.2013, 16:56 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 03.03.2013, 17:09 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 09.03.2013, 16:58 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 10.03.2013, 15:57 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2013, 16:12 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 10.03.2013, 16:34 Titel: |
|
|
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2013, 16:44 Titel: |
|
|
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?  _________________
 |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 10.03.2013, 17:01 Titel: |
|
|
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.
EDIT/ ja so gehts - danke |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2013, 17:15 Titel: |
|
|
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 ) _________________
 |
|
Nach oben |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 10.03.2013, 17:44 Titel: |
|
|
das ulkig ist das ich win 7 pro hab  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2013, 17:50 Titel: |
|
|
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 |
|
 |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 10.03.2013, 18:04 Titel: |
|
|
32bit |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.03.2013, 19:06 Titel: |
|
|
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  _________________
 |
|
Nach oben |
|
 |
|
|
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.
|
|