我正在尝试写一个“BMP播放器”。 我的主要目标是快速完成!我需要达到60fps。 我正在将所有图像加载到内存中,然后使用glTexImage2D来切换纹理内容。
当我使用命令时:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_width, g_height, 0, GL_RGB, GL_UNSIGNED_BYTE, currentlyPlatedFrame->data);
在低分辨率(720p及更低)下,电影工作正常(60fps),但在高清或更高频率下帧速率非常低(我需要达到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;
}
答案 0 :(得分:1)
来到这里寻求解决方案的访客; 使用矩形纹理时,必须在(0,0) - (tex_width,tex_height)范围中指定坐标,而不是(0,0) - (1,1)。