3

「BMPプレーヤー」を書​​こうとしています。私の主な目的は、それを速くすることです!私は60fpsに到達する必要があります。すべての画像をメモリにロードしてから、glTexImage2D を使用してテクスチャ コンテンツを切り替えています。

コマンドを使用すると:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_width, g_height, 0, GL_RGB, GL_UNSIGNED_BYTE, currentlyPlatedFrame->data);

ムービーは低解像度 (720p 以下) では問題なく (60fps) 動作しますが、HD 以上ではフレーム レートが非常に低くなります (1600p にする必要があります)。

オンラインで検索したところ、GL_TEXTURE_2D が 2 の累乗の正方形のテクスチャで動作することがわかりました。つまり、1920x1080 を再生するとき、実際には 2048x2048 (1280 の次の 2 の累乗のスカー) を再生していることになります。プログラムを高速化するには、 GL_TEXTURE_RECTANGLE を使用します。

私の問題は、コード内のすべての GL_TEXTURE_2D を GL_TEXTURE_RECTANGLE に変更すると、プレーヤーが画面全体の最初のピクセルのみを表示することです。

2D から RECTANGLE に切り替えるときに変更する必要があるものは他にありますか? 誰かが私が間違っていることを見ることができますか? または、GL_TEXTURE_2D を使用する方法についてのアイデアがあり、それをより高速に実行できる場合は、非常に役立ちます。

私はwin7とVS2010に取り組んでいます

私のコード(関連部分):

#include <glew.h>
#include <glfw.h>

glfwInit();
glEnable(GL_DEPTH_TEST);
glEnable( GL_TEXTURE_2D );  
if( !glfwOpenWindow( g_width, g_height, 8, 8, 8, 0, 0, 0, GLFW_FULLSCREEN ))
{
    glfwTerminate(); //terminating glfw window
    return 0;
}

glfwSetWindowTitle("Texture");
glfwSetWindowSizeCallback(handleResize);
glfwSetKeyCallback(handleKeypress);
glfwEnable(GLFW_MOUSE_CURSOR);
glfwSwapInterval(1);

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); //clear background screen to black

    //Clear information from last draw
glClear( GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); 

    glGenTextures(1,&Texture); //allocate the memory for texture
    glBindTexture(GL_TEXTURE_2D,Texture); //Binding the texture

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D); //Enable texture

currentlyPlatedFrame = goToFirstFrameToPlay(headOfList,startFrameNum);

glBindTexture(GL_TEXTURE_2D,Texture);
while (1)
{ 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_width, g_height, 0, GL_RGB, GL_UNSIGNED_BYTE, currentlyPlatedFrame->data);

    glPushMatrix();//move out of loop
    glBegin(GL_POLYGON); //Begin quadrilateral coordinates
    glNormal3f(0.0f, 0.0f, 1.0f);//normal vector
    glTexCoord2f(0.0f, 0.0f); //Texture co-ordinate origin or  lower left corner
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); //Texture co-ordinate lower right corner
    glVertex3f(1.0f,  -1.0f,0.0f);
    glTexCoord2f(1.0f, 1.0f);//Texture co-ordinate top right corner
    glVertex3f(1.0f, 1.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);//Texture co-ordinate top left corner
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glEnd(); //End quadrilateral coordinates
    glPopMatrix();//move out of loop
    glFinish();//add glfinish
    glfwSwapBuffers();
    numOfPlayedFrames++;

    currentlyPlatedFrame = currentlyPlatedFrame->next;
}
4

1 に答える 1