Подробности

[В начало]

Проблема в реализации № D0089

Краткое описание

Вызов функций glColor3i, glColor3iv по умолчанию не ставит правильное значение для alpha компоненты (RGBA color)

Подробное описание

В документации сказано: "glColor sets a new four-valued RGBA color. glColor has two major variants: glColor3 and glColor4. glColor3 variants specify new red, green, and blue values explicitly and set the current alpha value to 1.0 (full intensity) implicitly.", но вызов функций glColor3i, glColor3iv не устанавливает значение alpha равным 1.0.

Раздел стандарта

Linux Standard Base Desktop Specification 3.2, Chapter 7. Libraries, 7.1.2.1 Interfaces for OpenGL, который ссылается на OpenGL Reference Pages, glColor

Пример

#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>

typedef struct _TGLWindow
{
    Display *dpy;
    GLXContext cx;
    XVisualInfo *vi;
    Window win;
    GLXWindow  glxWin;
    GLXFBConfig *fbConfigs;
    int width;
    int height;
} TGLWindow;

static int tSingleBuffer_1_2[] = {GLX_RGBA,
                                    GLX_RED_SIZE,       1,
                                    GLX_GREEN_SIZE,     1,
                                    GLX_BLUE_SIZE,      1,
                                    None};
static int tDoubleBuffer_1_2[] = {GLX_RGBA,
                                    GLX_DOUBLEBUFFER,
                                    GLX_RED_SIZE,       1,
                                    GLX_GREEN_SIZE,     1,
                                    GLX_BLUE_SIZE,      1,
                                    None};


static Bool WaitForNotify(Display *d, XEvent *e, char *arg) {
    if (e->type == CreateNotify)
    {
        printf("Window was successfully created.");
    }
    return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
}
TGLWindow tWnd;

int main() {
   int errBase = 0;
   int evtBase = 0;
   GLboolean bStatus;
   tWnd.dpy = NULL;
   tWnd.vi = NULL;
   tWnd.fbConfigs = NULL;
   tWnd.cx = 0;
   tWnd.height = 600;
   tWnd.width = 800;
    
   /* get a connection */
   tWnd.dpy = XOpenDisplay(0);

   if (!tWnd.dpy)
   {
        printf ("XOpenDisplay () returned NULL.");
        return -1;
   }
    if (glXQueryExtension(tWnd.dpy, &errBase, &evtBase) == GL_FALSE)
    {
        printf("The GLX extension is not supported by the server.");
        printf("error base is %d, event base is %d.", errBase, evtBase);
        return -1;
    }

    Colormap cmap;
    XSetWindowAttributes swa;
    XEvent event;
    int *attrList = tSingleBuffer_1_2;
    tWnd.vi = glXChooseVisual(tWnd.dpy, DefaultScreen(tWnd.dpy), attrList);
    if (tWnd.vi == NULL)
    {
        printf("glXChooseVisual() returned NULL");
        return -1;
    }

    /* create a GLX context */
    tWnd.cx = glXCreateContext(tWnd.dpy, tWnd.vi, 0, GL_TRUE);

    /* create a color map */
    cmap = XCreateColormap(tWnd.dpy, RootWindow(tWnd.dpy, tWnd.vi->screen),
                tWnd.vi->visual, AllocNone);

    /* create a window */
    swa.colormap = cmap;
    swa.border_pixel = 0;
    swa.event_mask = StructureNotifyMask;
    tWnd.win = XCreateWindow(tWnd.dpy, RootWindow(tWnd.dpy, tWnd.vi->screen), 0,
                          0, tWnd.width, tWnd.height,
                          0, tWnd.vi->depth, InputOutput,tWnd.vi->visual,
                          CWBorderPixel|CWColormap|CWEventMask,
                          &swa);
    XMapWindow(tWnd.dpy, tWnd.win);
    XIfEvent(tWnd.dpy, &event, WaitForNotify, (char*)tWnd.win);

    /* connect the context to the window */
    glXMakeCurrent(tWnd.dpy, tWnd.win, tWnd.cx);
    
    
    GLint params[] = {10, 10300, 14230};
    
    GLint retParams[4];
    
    glColor3i (params[0], params[1], params[2]);

    glGetIntegerv (GL_CURRENT_COLOR, retParams);
        
    printf ("After invocation of glColor3i(%d, %d, %d) interface, the current "
        "color was set to (%d, %d, %d, %d)", params[0], params[1], params[2], 
        retParams[0], retParams[1], retParams[2], retParams[3]);

    return 1;
}

Компонент

Mesa 7.0.2 or earlier

Статус

Исправлено в Mesa 7.0.3

[В начало]