2010-03-17 113 views
2

我对OpenGL相对比较陌生,当我将图像渲染为与图像大小相同的QUAD纹理时,出现了一些问题。这是我的代码。如果有人帮我解决这个问题,我将非常感激。图像显得更小并且被挤压。 (顺便说一句,图像尺寸是500x375)。OpenGL 2D纹理映射问题

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(); 
+0

您观察到的图片将有所帮助。 – Bahbar 2010-03-17 20:11:06

回答

0

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

+0

嘿,谢谢你的信息。后来我确实使用了矩形纹理,但我会进行其他更正。 – rwb 2011-01-12 12:56:36

1

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

+0

谢谢你的回复。如果我将它呈现给FBO,那么这里没有窗口。即使将视口尺寸放在“glOrtho(0,1,0,1,-1,1);”中我遇到了同样的问题。另外有趣的是,我可以在没有任何大小问题的情况下完美地绘制QUAD,但是我遇到了纹理问题。希望这可能会有助于更多地理解问题。 – rwb 2010-03-17 18:38:37

+0

,我假设你的fbo是非方形的?唯一让你难以理解的是,你有不同的垂直和水平像素大小。你的纹理是非方形的,但是你已经将上面的代码编码为.....现在这种方法没什么问题,但是编号确实使它有点难以弄清楚。 如果不使用0-1作为坐标,而是将其重写为使用0宽度,会发生什么情况。 – 2010-03-18 13:33:27

+0

btw ... 0-1应读“零对一”而不是“零减一” – 2010-03-18 13:33:59