0

グラフィック: AMD Radeon HD 7900 シリーズ

実行中: Windows 7 (64 ビット)

プログラム: CodeBlocks (32 ビット)

OpenGL ライブラリ: GLee

ここでウィンドウを設定します。OpenGL レンダリングを使用する SDL ウィンドウです。

void Init(int w, int h, bool fullScr)
{
    if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
    printf("Unable to initialize SDL: %s\n", SDL_GetError());
    }
    winW = w*scale;
    winH = h*scale;
    original_winW = w;
    origianl_winH = h;

    putenv("SDL_VIDEO_WINDOW_POS");
    putenv("SDL_VIDEO_CENTERED=1");

    getenv("SDL_VIDEO_WINDOW_POS");
    getenv("SDL_VIDEO_CENTERED");

    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new*
    SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 ); // *new*

    //Sets up the screen and displays the window
    screen = SDL_SetVideoMode( winW, winH, 32, SDL_OPENGL | (fullScr*SDL_FULLSCREEN)  ); // *changed*
    screenRect.x = 0;
    screenRect.y = 0;
    screenRect.w = winW;
    screenRect.h = winH;

    SDL_ShowCursor(false);

    SetGLState();
}

これが前述の SetGLState() です。

void SetGLState(){
    glEnable( GL_TEXTURE_2D ); //Enable 2d texturing

    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); //Set clear color (rgba)

    glViewport( 0, 0, winW, winH ); //Set the viewport

    glClear( GL_COLOR_BUFFER_BIT ); //Clear back buffer?

    glMatrixMode( GL_PROJECTION ); //Set to projection
    glLoadIdentity();

    glOrtho(0.0f, winW, winH, 0.0f, -1.0f, 1.0f); //Create orthogonal projection matrix

    glMatrixMode( GL_MODELVIEW ); //Set back to model view
    glLoadIdentity();

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

これは、画像が画面に描画される場所です

void DrawImage(GLSurface image, float x, float y)
{
    // Bind the texture to which subsequent calls refer to
    if(boundTexture != image.Surface){glBindTexture( GL_TEXTURE_2D, image.Surface ); boundTexture = image.Surface; }

    glReadPixels(x,y,image.w*2,image.h*2,GL_UNSIGNED_BYTE,NULL,NULL);

    glLoadIdentity();
    glScalef(scale,scale,1);

    glRotatef(image.rotation[0], 1.0f, 0.0f, 0.0f);
    glRotatef(image.rotation[1], 0.0f, 1.0f, 0.0f);
    glRotatef(image.rotation[2], 0.0f, 0.0f, 1.0f);

    if(scale == 7.5)x += 48;

    glBegin( GL_QUADS );
        //Bottom-left vertex (corner)
        glColor3b(127,127,127);
        glTexCoord2i( 0, 0 ); //Position on texture to begin interpolation
        glVertex3f( x, y, 0.f ); //Vertex Coords

        //Bottom-right vertex (corner)
        glTexCoord2i( 1, 0 );
        glVertex3f( x+image.w, y, 0.f );

        //Top-right vertex (corner)
        glTexCoord2i( 1, 1 );
        glVertex3f( x+image.w, y+image.h, 0.f );

        //Top-left vertex (corner)
        glTexCoord2i( 0, 1 );
        glVertex3f( x, y+image.h, 0.f );
    glEnd();
}

このウィンドウは何も描画しません。その理由がわかりません。しばらくこのコードを見ていませんでしたが、以前の Windows のインストールでは、このコードが機能していたことを知っています。私の他のプロジェクトはすべて実行されますが、これは実行されません。空白の画面をレンダリングするだけです。奇妙なことに、このウィンドウにはサイズ変更機能があります。その関数が呼び出されると、画面には黒い画面ではなく白い画面が表示されます。

編集** このコードは、すべてが画面に描画されると最後に呼び出されます。それはすでに私のコードに含まれていました。

void Flip(){
    SDL_GL_SwapBuffers();
    glClear( GL_COLOR_BUFFER_BIT );
}
4

1 に答える 1

1

SetGLState に設定されている状態はすべて描画状態です。DrawImage 関数から呼び出します。最も重要なことは、glClearを描画関数に入れる必要があることです。他の場所では意味がありません。

その呼び出しglReadPixelsは意味がありません。

そして、完了したらバッファを交換する必要がありますSDL_SwapBuffers(IIRC、SDLをしばらく使用していません)。

于 2013-01-09T09:03:15.053 に答える