[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Problem with RGBA Texture in GLX
>
>
> Nathi-huesken@gmx.de wrote:
>
> > I am using GLX to open an OpenGL window.
> > Everything works finde, as long, as I Create Textures
> > using:
> >
> >
>
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,Width,Height,0,GL_RGBA,GL_UNSIGNED_BYTE,Data);
> >
> > But that way I do not have an Alpha-Channel in my Textures (which I
> need!).
> > When I try using GL_RGBA or GL_RGB5_A1 instead of the GL_RGB I get the
> > following error:
> >
> > Program received signal SIGSEGV, Segmentation fault.
> > [Switching to Thread 1024 (LWP 485)]
> > 0x404891d3 in __nvsym04304 () from /usr/lib/libGLcore.so.1
> >
> > (That is the output ddd/gdb gave me, if I am just running the Prgramm I
> get
> > an simple Segmentation Fault).
>
> It's impossible to tell what you are doing wrong without some more
> information.
>
> Your glTexImage2D command seems perfect to me.
>
> Most likely, your 'Data' array isn't sized correctly. In this case, it
> should
> be Width*Height*4 bytes long.
>
> Try this:
>
> {
> unsigned char FakeData [ Width * Height * 4 ] ;
>
>
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGBA,GL_UNSIGNED_BYTE,FakeData);
> }
>
> ...in place of the glTexImage2D command you have now. Does it still
> crash?
>
> Can you show us more of your program?
I thing you misunderstood! My Data-Format is not the Problem. If I change
the seceond GL_RGB/GL_RGBA (the one telling the Data Format of my Data), it is
not a Problem. But if I change the first one, the System is crashing.
Here is the Intializing code for the Window:
// Connect to X Server
dpDisplay = XOpenDisplay(NULL);
if(dpDisplay == NULL)// Could not open display
{
//ERROR
return 0;
}
// GLX extension is supported?
if(!glXQueryExtension(dpDisplay, NULL, NULL))
{
return 0; // Return, if X server haven't GLX
}
XF86VidModeModeInfo **modes;
int modeNum;
int bestMode=0;
if(Fullscreen)
{
//Get All Modes
XF86VidModeGetAllModeLines(dpDisplay,
DefaultScreen(dpDisplay), &modeNum, &modes);
/* save desktop-resolution before switching modes */
deskMode=*modes[0];
/* look for mode with requested resolution */
for (int i = 0; i < modeNum; i++)
{
if ((modes[i]->hdisplay == ScreenWidth) &&
(modes[i]->vdisplay == ScreenHeight))
{
bestMode = i;
}
}
}
int Attr32[] = { GLX_RGBA,
GLX_RED_SIZE, 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE,8,
GLX_DEPTH_SIZE, 16,
GLX_DOUBLEBUFFER,
None};
// Find visual
XVisualInfo *xvVisualInfo;
xvVisualInfo = glXChooseVisual(dpDisplay, DefaultScreen(dpDisplay),
Attr32);
if(xvVisualInfo == NULL)
{
//Error
return 0; // If Visual info can't be shoosed
}
// Create OpenGL rendering context
glXContext = glXCreateContext(dpDisplay, xvVisualInfo, None, True);
if(glXContext == NULL)
{
return 0; // Can't create rendering context
}
Colormap cmColorMap;
XSetWindowAttributes winAttr;
// Create new colormap for our window
cmColorMap = XCreateColormap(dpDisplay, RootWindow(dpDisplay,
xvVisualInfo->screen), xvVisualInfo->visual, AllocNone);
winAttr.colormap = cmColorMap;
winAttr.border_pixel = 0;
winAttr.event_mask = ExposureMask | StructureNotifyMask |
KeyPressMask | KeyReleaseMask;
Atom wmDelete;
// Create window
win = XCreateWindow(dpDisplay, RootWindow(dpDisplay,
xvVisualInfo->screen),
0, 0,
ScreenWidth,
ScreenHeight, // Width and Height
0,
xvVisualInfo->depth,
// Depth
InputOutput,
xvVisualInfo->visual,
CWBorderPixel |
CWColormap | CWEventMask,
&winAttr);
if(!win)
{
return 0;
}
wmDelete = XInternAtom(dpDisplay, "WM_DELETE_WINDOW", True);
XSetWMProtocols(dpDisplay, win, &wmDelete, 1);
XSetStandardProperties(dpDisplay, win, WindowTitle,WindowTitle,
None, NULL, 0, NULL);
XMapRaised(dpDisplay, win);
// Make it current
glXMakeCurrent(dpDisplay, win, glXContext);
// Map window on the display
XMapWindow(dpDisplay, win);
//SUCCESS!!!
return true;
--
+++ GMX - Mail, Messaging & more http://www.gmx.net +++
NEU: Mit GMX ins Internet. Günstige DSL- & Modem/ISDN-Tarife!