2011-01-21 27 views
3

我正在使用c++,opengl 2.1SDL在窗口上寫一個程序,並且在頂點顏色方面存在一些問題。OpenGL:總是相同的顏色

我使用glColor3f來設置每個頂點集的顏色,但它似乎不工作。無論我選擇什麼顏色,我都會將每個頂點繪製爲紅色。我檢查了傳遞給glColor3f的值,它們確實不是1.f,0.f,0.f ...

有沒有人遇到過這樣的問題,或者知道可能是什麼原因造成的?我可能不包括一些lib我應該?或者你認爲SDL初始化代碼可能存在一些問題(它不應該像我之前使用過的那樣)?

EDIT4:解決..這的確是一個問題的GPU,我從製造商的驅動程序,它目前工作正常...去圖

編輯:我還沒有使用任何照明,紋理或任何類型的東西。圖形我剛剛成立的窗口,告訴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的問題?其他的一切顯示了正常的顏色,但.. web瀏覽器,視頻,遊戲等

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

你能展示你的渲染循環的一些示例代碼嗎? – 2011-01-21 05:16:05

+1

如果您將其設置爲(1,1,1,1),那麼使用glClearColor更改的清除顏色是否也顯示爲紅色? – rotoglup 2011-01-21 07:25:33

+0

沒有..其實,改變清晰的顏色根本沒有任何影響..它總是黑色的背景 – Zepee 2011-01-21 11:12:21

回答

1

有兩個可能的原因:

  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));

0

你可以試試這個:

glShadeModel(GL_SMOOTH); 

,並告訴我們,如果問題得到解決?

將呼叫置於Init_OpenGL函數中。

0

不確定這是否適用於您,但我需要的只是一次調用glUseProgram(NULL);,告訴opengl使用固定功能管道,並且問題已修復。