2011-01-21 4 views
3

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

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

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

EDIT4: решаемый .. это действительно проблема GPU, я получил драйвера от производителя, и теперь работает должным образом ... пойти фигуру

EDIT: Я также не использовать какое-либо освещение, текстуры или что-то в этом роде. Графически я просто настроить окно и сказать 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); 
    } 
} 
+3

Можете ли вы показать пример кода вашего цикла визуализации? –

+1

Является ли прозрачный цвет, измененный с помощью glClearColor, также отображаться красным, если вы установите его (1,1,1,1)? – rotoglup

+0

Нет .. на самом деле, изменение прозрачного цвета вообще не имеет никакого эффекта. Это всегда черный фон. – Zepee

ответ

1

Есть две возможные причины:

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

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

  3. EDIT: настройка контекста рендеринга OpenGL не удалась или контекст не работает должным образом/предполагается! Например. он не имеет ожидаемых свойств, битовых глубин и т. д.

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

+0

Нет. Я проверил значения, и они действительно случайны. Также 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). – Zepee

+0

Возможно, это связано с контекстом рендеринга (особенно, как вы написали «Я просто попытался запустить какую-то другую работу, которую я сделал с OpenGL, и все отображается красным цветом Что ж"). Я так долго не использовал SDL, но, пожалуйста, разместите свой код настройки (рендеринга)! – Frunsi

0

Вы можете попробовать это:

glShadeModel(GL_SMOOTH); 

и сказать, если проблема решена?

Положите вызов в функции Init_OpenGL.

+0

У меня уже есть это, я упомянул об этом в комментарии. Я, честно говоря, не думаю, что это проблема с кодом. Тот же исполняемый файл, составленный год назад, дал мне правильные цвета, а теперь все красные – Zepee

0

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

Смежные вопросы