OpenGL 2D纹理映射问题

时间:2010-03-17 15:52:25

标签: opengl graphics 2d textures texture-mapping

我对OpenGL比较陌生,当我将图像渲染为QUAD的纹理时,我遇到了一些问题,这与QUAD的大小相同。这是我的代码。如果有人帮助我解决这个问题,我将非常感激。图像看起来更小,并且被压扁。 (顺便说一下,图像尺寸为500x375)。

glGenTextures( 1, &S_GLator_InputFrameTextureIDSu );
        glBindTexture(GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

        glTexImage2D( GL_TEXTURE_2D, 0, 4, S_GLator_EffectCommonData.mRenderBufferWidthSu, S_GLator_EffectCommonData.mRenderBufferHeightSu, 0, GL_RGBA, GL_UNSIGNED_BYTE, dataP);
glBindTexture(GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, S_GLator_EffectCommonData.mRenderBufferWidthSu, S_GLator_EffectCommonData.mRenderBufferHeightSu, GL_RGBA, GL_UNSIGNED_BYTE, bufferP);
//set the matrix modes
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        //gluPerspective( 45.0, (GLdouble)widthL / heightL, 0.1, 100.0 );
        glOrtho (0, 1, 0, 1, -1, 1);
        // Set up the frame-buffer object just like a window.
        glViewport( 0, 0, widthL, heightL );
        glDisable(GL_DEPTH_TEST);
        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();


        glBindTexture( GL_TEXTURE_2D, S_GLator_InputFrameTextureIDSu );


        //Render the geometry to the frame-buffer object


        glBegin(GL_QUADS); //input frame
            glColor4f(1.f,1.f,1.f,1.f);
            glTexCoord2f(0.0f,0.0f);    
            glVertex3f(0.f ,0.f ,0.0f);
            glTexCoord2f(1.0f,0.0f);    
            glVertex3f(1.f ,0.f,0.0f);
            glTexCoord2f(1.0f,1.f); 
            glVertex3f(1.f ,1.f,0.0f);
            glTexCoord2f(0.0f,1.f); 
            glVertex3f(0.f ,1.f,0.0f);
        glEnd();

2 个答案:

答案 0 :(得分:1)

我想我在这里看到你的问题。 glViewport定义视口大小,而不是窗口大小。因此,当您创建窗口(使用glut,sdl或wgl或其他)时,您必须指定大小。要获得glViewport到此窗口的1:1映射,这两个需要匹配。

答案 1 :(得分:0)

首先,您的图像尺寸必须是2的幂,而不是任意500x375。其次,internalformat的{​​{1}}(第三个)参数应该是一个符号常量,描述内部格式布局,而不仅仅是glTexImage2D,因为它自OpenGL 1.2以来已被弃用。第三,您的"4"dataP存储布局必须与当前bufferP对应。第四,你试图将纹理放在其上的等边四边形基本上是方形的,因此你的非方形纹理会出现用这样的纹理坐标压扁或拉伸。