glTexImage2D is not working when using GL_TEXTURE_RECTANGLE
我正在尝试编写" BMP播放器"。
我的主要目标是快速做到!我需要达到60fps。
我正在将所有图像加载到内存中,然后使用glTexImage2D切换纹理内容。
当我使用命令时:
1 | 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
我的代码(相关部分):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #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,0)-(tex_width,tex_height)范围内指定坐标,而不是(0,0)-(1,1)。