This is strange behavior. I’ve used openGL on several platforms, but I’ve never seen this.
I am setting up a window, the setting up openGL, then calling:
glClearColor( red
glClear(GL_COLOR_BUFFER_BIT)
What happens is the window will clear with red (flicker-ee like) and then quickly get rendered over with black. No matter what I do, I can’t get rid of this behavior. I am thinking that it might be my system (how the drivers are set or something).
Here is the code and makefile that I’m using. Could someone copy to a file and build to see if they get the same behavior? Or if you see something obvious in my code…
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <X11/Xlib.h>
#include <GL/glxew.h>
#include <GL/glx.h>
#include <GL/gl.h>
using namespace std;
#define LOG_FUNCTION printf("executing %s
", __FUNCTION__);
#define WIDTH 400
#define HEIGHT 300
Window win;
Display* dpy;
int major;
int minor;
GLXContext context;
XVisualInfo* visualInfo;
void createContext(){
LOG_FUNCTION
context = glXCreateContext(dpy, visualInfo, 0, true);
if(NULL == context){
//failed to create context
printf("ERROR:%d failed to create context
", __LINE__);
printf("debug: dpy=%d, visualInfo=%d
", &dpy, &visualInfo);
return;
}
if(false == glXMakeCurrent(dpy, win, context)){
printf("ERROR:%d failed to set context to current
", __LINE__);
printf("debug: dpy=%d, win=%d, context=%d
", &dpy, &visualInfo, context);
}
}
void initGL(){
LOG_FUNCTION
glViewport(0, 0, WIDTH, HEIGHT);
glScissor(0, 0, WIDTH, HEIGHT);
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
glXSwapBuffers(dpy, win);
}
void drawShape(int count){
LOG_FUNCTION
if(false == glXMakeCurrent(dpy, win, context)){
printf("ERROR:%d failed to set context to current
", __LINE__);
printf("debug: dpy=%d, win=%d, context=%d
", &dpy, &visualInfo, context);
}
//static float x = 0;
//glClearColor(1.0f, x, 0.0f, 1.0f);
/*
static bool maxHit = false;
static bool minHit = true;
if(minHit && x >= 1.0){
minHit = false;
maxHit = true;
}
else if(maxHit && x <= 0.0){
minHit = true;
maxHit = false;
}
if(minHit)
x += 0.001;
else if (maxHit)
x -= 0.001;
//x-=0.001;
//x+=0.001;
*/
/*
glBegin(GL_LINES);
{
glVertex3f(-0.5f, 0.5f, 0.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
}
glEnd();
*/
//glScalef(1.1, 1.05, 1.0);
switch(count)
{
case 0:
glClearColor(0.0, 0.0, 0.0, 1.0);
break;
case 1:
glClearColor(0.0, 0.0, 1.0, 1.0);
break;
case 2:
glClearColor(0.0, 1.0, 0.0, 1.0);
break;
case 3:
glClearColor(0.0, 1.0, 1.0, 1.0);
break;
case 4:
glClearColor(1.0, 0.0, 0.0, 1.0);
break;
case 5:
glClearColor(1.0, 0.0, 1.0, 1.0);
break;
case 6:
glClearColor(1.0, 1.0, 0.0, 1.0);
break;
case 7:
glClearColor(1.0, 1.0, 1.0, 1.0);
break;
}
glClear(GL_COLOR_BUFFER_BIT);
glXSwapBuffers(dpy, win);
XFlush(dpy);
glFlush();
glFinish();
sleep(1);
}
int main(int, char**){
LOG_FUNCTION
dpy = XOpenDisplay(getenv("DISPLAY"));
if(!dpy){
printf("failed to open display
");
}
else{
printf("open display SUCCESS
");
}
glXQueryVersion(dpy, &major, &minor);
printf("glx v%d.%d
", major, minor);
if(major == 1 && minor < 2){
printf("incompatible version
");
XCloseDisplay(dpy);
exit(0);
}
static int attributes[] = { GLX_RGBA,
GLX_DOUBLEBUFFER,
GLX_RED_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_GREEN_SIZE, 8,
GL_NONE};
/*
static int attributes[] = { GLX_RENDER_TYPE, GLX_RGBA_BIT,
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
GLX_DOUBLEBUFFER,
GLX_DEPTH_SIZE, 16,
GLX_RED_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_GREEN_SIZE, 8,
GL_NONE};
*/
/*
static int attributes[] =
{
GLX_X_RENDERABLE , True,
GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT,
GLX_RENDER_TYPE , GLX_RGBA_BIT,
//GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR,
GLX_RED_SIZE , 8,
GLX_GREEN_SIZE , 8,
GLX_BLUE_SIZE , 8,
//GLX_ALPHA_SIZE , 8,
GLX_DEPTH_SIZE , 16,
GLX_DOUBLEBUFFER , True,
//GLX_SAMPLE_BUFFERS , 1,
//GLX_SAMPLES , 4,
None
};
*/
visualInfo = glXChooseVisual(dpy, DefaultScreen(dpy), attributes);
//XSetWindowAttributes winAttributes;
//winAttributes.event_mask = ExposureMask | VisibilityChangeMask | KeyPressMask | PointerMotionMask | StructureNotifyMask;
//winAttributes.border_pixel = 0;
//winAttributes.colormap = XCreateColormap(dpy, RootWindow(dpy, visualInfo->screen), visualInfo->visual, AllocNone);
//unsigned long winmask = CWBorderPixel | CWBitGravity | CWEventMask | CWColormap;
//win = XCreateWindow(dpy, DefaultRootWindow(dpy), 20, 20, 400, 300, 0, visualInfo->depth, InputOutput, visualInfo->visual, winmask, &winAttributes);
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 20, 20, WIDTH, HEIGHT, 0, 0, 0);
XSelectInput(dpy, win, StructureNotifyMask);
XMapWindow(dpy, win);
for(;;){
XEvent e;
XNextEvent(dpy, &e);
if(e.type == MapNotify) break;
}
XFlush(dpy);
createContext();
initGL();
//int x = 0;
//cin >> x;
printf("calling drawShape()
");
drawShape(1);
sleep(1);
drawShape(2);
sleep(1);
drawShape(3);
sleep(1);
drawShape(4);
sleep(1);
glXMakeCurrent(dpy, 0, 0);
glXDestroyContext(dpy, context);
//XCloseDisplay(dpy);
}
be sure to change the cpp filename in the makefile
LIBDIRS = -L/usr/X11R6/lib -L/usr/local/lib -L/usr/lib -L/usr/include
INCDIRS = -I/usr/include -I/usr/local/include -I/usr/X11R6/include -I/usr/include/X11 -I/usr/include/GL
COMPILERFLAGS = -ggdb -Wall
CC = g++
CFLAGS = $(COMPILERFLAGS) -g $(INCDIRS)
LIBS = -lX11 -lGL
all:
$(CC) $(CFLAGS) -o testBin $(LIBDIRS) testBin.cpp $(LIBS)
clean:
rm -f testBin
1000 appreciations!