OpenGL: всегда один и тот же цвет

Я пишу программу для Windows, используя c++, opengl 2.1 и SDL, и у меня возникают проблемы с цветами вершин.

Я использую glColor3f для установки цвета для каждого набора вершин, но, похоже, это не работает. Я получаю каждую вершину красной, независимо от того, какой цвет я выбираю. Я проверил значения, передаваемые в glColor3f, и они действительно не 1.f, 0.f, 0.f...

Может кто сталкивался с такой проблемой или знает в чем может быть причина? Может быть, я не включаю какую-то библиотеку, которую должен? Или вы считаете, что это может быть какая-то проблема с кодом инициализации SDL (это не должно быть, поскольку я правильно использовал его раньше)?

РЕДАКТИРОВАТЬ4: Решено.. это действительно была проблема с графическим процессором, я получил драйверы от производителя, и теперь он работает правильно... пойди разберись

РЕДАКТИРОВАТЬ: Я также не использую освещение, текстуры или что-то в этом роде. Графически я просто устанавливаю окно и говорю opengl некоторые вершины и цвета для рисования.

EDIT2: Конечно, но я очень сомневаюсь, что там есть какая-то проблема:

int GLmain::redraw(GLvoid)                              
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
for(int i=0; i<s->divs.size(); i++){
    vec3 v = s->divs.at(i).getPosition();
    vec3 c = s->divs.at(i).getColor();
    glColor3f(c.get(0),c.get(1),c.get(2));
    glVertex3f(v.get(0),v.get(1),v.get(2));
}
glEnd();

return TRUE;
}

Как видите, довольно стандартные вещи.. c содержит значения от 0,0 до 1,0. Я только что попытался запустить другую работу, которую я сделал с OpenGL, и все также отображается красным (раньше этого не было), поэтому я предполагаю, что это как-то связано с библиотеками, которые я использую:

opengl32.lib sdl.lib sdlmain.lib glu32.lib

SDL версии 1.2.14. Кроме того, может ли это быть проблемой с моим gpu? Все остальное отображается с нормальными цветами. Веб-браузер, видео, игры и т. д.

EDIT3: код инициализации SDL:

int done = 0;
int w = 800;
int h = 600;
GLenum gl_error;
char* sdl_error;
SDL_Event event;
Init_OpenGL(argc, argv, w, h); // start window and OpenGL
SDL_WM_SetCaption( "MySlinky", "" ); /* Set the window manager title bar */

void Init_OpenGL(int argc, char* argv[], int w, int h)
{
    int rgb_size[3];
    int bpp = 0;
    Uint32 video_flags = SDL_OPENGL;
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
        fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError());
        exit( 1 );
    }
    /* See if we should detect the display depth */
    if ( bpp == 0 ) {
        if ( SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8 ) {
            bpp = 8;
        } else {
            bpp = 16;  /* More doesn't seem to work */
        }
    }

    /* Initialize the display */
    switch (bpp) {
        case 8:
            rgb_size[0] = 3;
            rgb_size[1] = 3;
            rgb_size[2] = 2;
            break;
        case 15:
        case 16:
            rgb_size[0] = 5;
            rgb_size[1] = 5;
            rgb_size[2] = 5;
            break;
        default:
            rgb_size[0] = 8;
            rgb_size[1] = 8;
            rgb_size[2] = 8;
            break;
    }

    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rgb_size[0] ); // Sets bits per channel
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, rgb_size[1] );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24 ); // 3 channels per pixel (R, G and B)
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 );
    if ( SDL_SetVideoMode( w, h, bpp, video_flags ) == NULL ) {
        fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
        SDL_Quit();
        exit(1);
    }
}

person Zepee    schedule 21.01.2011    source источник
comment
Можете ли вы показать пример кода вашего цикла рендеринга?   -  person Nick Banks    schedule 21.01.2011
comment
Отображается ли чистый цвет, измененный с помощью glClearColor, красным, если вы установите для него значение (1,1,1,1)?   -  person rotoglup    schedule 21.01.2011
comment
Нет.. на самом деле, изменение прозрачного цвета не имеет никакого эффекта.. это всегда черный фон   -  person Zepee    schedule 21.01.2011


Ответы (3)


Возможны две причины:

  1. Либо вы включили какое-то состояние рендеринга, которое в конечном итоге приведет к красным вершинам. Например. текстуры, материалы (!?), освещение и прочее.

  2. Код "вокруг" ваших вызовов OpenGL содержит ошибки (например: вы действительно уверены, что c.get(1) не возвращает 0?).

  3. РЕДАКТИРОВАТЬ: Настройка контекста рендеринга OpenGL не удалась или контекст не работает должным образом/намеренно! Например. у него нет ожидаемых свойств, разрядности и так далее.

Чтобы исключить любые сомнения, добавьте следующую строку и проверьте ее результаты: printf("c=(%f,%f,%f)",(float)c.get(0),(float)c.get(1),(float)c.get(2));

person Frunsi    schedule 21.01.2011
comment
Нет... Я проверил значения, и они действительно случайны... также glMatrixMode( GL_PROJECTION); glLoadIdentity(); glOrtho(-100.0, 100.0, -1.0, 500.0, -20.0, 20.0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glShadeModel(GL_SMOOTH); это единственные другие вызовы opengl, которые я делаю (вызовы + sdl) - person Zepee; 21.01.2011
comment
Это может быть связано с контекстом рендеринга (тем более, что вы написали, что я только что попытался запустить другую работу, которую я сделал с OpenGL, и все также отображается красным). Я не так много использовал SDL, но, пожалуйста, опубликуйте свой код настройки (контекст рендеринга)! - person Frunsi; 21.01.2011

Можете ли вы попробовать это:

glShadeModel( GL_SMOOTH );

и скажите, устранена ли проблема?

Поместите вызов в функцию Init_OpenGL.

person BЈовић    schedule 21.01.2011
comment
У меня уже есть это, я упомянул об этом в комментарии. Честно говоря, я не думаю, что это проблема кода. Тот же исполняемый файл, скомпилированный год назад, дал мне правильные цвета, а теперь он весь красный. - person Zepee; 21.01.2011

Не уверен, что это относится к вам, но все, что мне было нужно, это один вызов glUseProgram(NULL);, чтобы сказать opengl использовать фиксированный конвейер функций, и проблема была решена.

person rationalcoder    schedule 13.12.2014