【问题标题】:OpenGL 2D Texture Mapping problemOpenGL 2D 纹理映射问题
【发布时间】:2011-01-12 01:22:15
【问题描述】:

我对 OpenGL 比较陌生,当我将图像渲染为与图像大小相同的 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();

【问题讨论】:

  • 一张你观察到的照片会有帮助。

标签: opengl graphics 2d textures texture-mapping


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。如果将其渲染到 FBO,则此处没有窗口。即使将视口大小放在“glOrtho (0, 1, 0, 1, -1, 1);”中我遇到同样的问题。同样有趣的是,我可以完美地绘制 QUAD,没有任何尺寸问题,但我遇到了纹理问题。希望这可能有助于更多地了解问题。
  • 我假设你的 fbo 不是方形的?让这有点难以弄清楚的一件事是你有不同的垂直和水平像素大小。你的纹理是非方形的,但是你已经对上面的代码进行了编码,就好像它是......现在这种方法没有任何问题,但是 id 确实让它有点难以弄清楚。如果不使用 0-1 作为坐标,而是将其重写为使用 0-width,会发生什么情况。
【解决方案2】:

首先,您的图片尺寸必须是 2 的幂,而不仅仅是任意的 500x375。其次,glTexImage2Dinternalformat(第三个)参数应该是一个符号常量,描述内部格式布局,而不仅仅是 "4",因为它自 OpenGL 1.2 以来已被弃用。第三,你的dataPbufferP存储布局必须对应当前的GL_UNPACK_ALIGNMENT。第四,您尝试在其上放置纹理的等边四边形本质上是正方形的,因此您的非正方形纹理会在这样的纹理坐标下显得被压扁或拉伸。

【讨论】:

  • 嘿,谢谢你的信息。后来我确实最终使用了矩形纹理,但我会做你建议的其他更正。
猜你喜欢
  • 2011-08-25
  • 2011-08-30
  • 2014-11-19
  • 1970-01-01
  • 2011-05-04
  • 2011-03-16
  • 1970-01-01
  • 2012-07-28
  • 2011-05-16
相关资源
最近更新 更多