繁体   English   中英

OpenGL:总是一样的颜色

[英]OpenGL: always same color

我正在使用c++opengl 2.1SDL在Windows上编写程序,并且我遇到了顶点颜色的一些问题。

我正在使用glColor3f为每个顶点集设置颜色,但它似乎无法正常工作。 无论我选择什么颜色,我都会将每个顶点都画成红色。 我检查了传递给glColor3f的值,它们确实不是1.f,0.f,0.f ......

有没有人遇到过这样的问题,或者知道可能导致什么问题? 我可能不会包括一些我应该的lib吗? 或者你认为它可能是SDL初始化代码的一些问题(它不应该,因为我之前已经正确使用过它)?

EDIT4:解决了..这确实是一个gpu问题,我从制造商那里得到了驱动程序,它现在正常工作......去图

编辑:我也没有使用任何照明,纹理或任何类型的东西。 从图形上我只是设置窗口并告诉opengl一些顶点和颜色来绘制..

编辑2:当然,但我非常怀疑那里有任何问题:

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做过的其他工作,一切都显示为红色(之前没有),所以我猜它与我正在使用的lib有关:

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

有两个可能的原因:

  1. 要么启用了一些最终会导致红色顶点的渲染状态。 例如纹理,材料(!?),灯光等。

  2. 你的OpenGL调用“周围”的代码有bug(例如:你真的确定, c.get(1)不会返回0吗?)。

  3. 编辑:OpenGL渲染上下文的设置失败或上下文无法按预期/预期工作! 例如,它没有预期的属性,位深度等。

为了消除任何疑问,请添加以下行,并检查其结果: printf("c=(%f,%f,%f)",(float)c.get(0),(float)c.get(1),(float)c.get(2));

不确定这是否适用于你,但我需要的只是一次调用glUseProgram(NULL); ,告诉opengl使用固定功能管道,问题得到解决。

你能试试这个:

glShadeModel( GL_SMOOTH );

并告诉问题是否已修复?

将调用放在Init_OpenGL函数中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM