2012-08-16 95 views
0

我正在为一个名为Autodesk MotionBuilder的应用程序编写一个插件,该应用程序有一个OpenGL渲染器,并且我试图将纹理几何体渲染到场景中。我有一个三维视图嵌入一个窗口,每一个我的窗口渲染的时候,这是(简而言之)会发生什么:什么可能会影响OpenGL中的纹理坐标值?

  1. 我告诉大家,我要绘制成的区域渲染给定大小
  2. 我告诉渲染绘制MotionBuilder的场景在该地区
  3. 我画一些其他的东西进入和/或在现场的顶部

这里的挑战是,我从MotionBuilder的渲染器继承一些任意的OpenGL状态,这取决于它绘制的内容找出场景中的内容。到目前为止,我一直在处理这个问题,但有一件事我不明白。 OpenGL解释我的UV坐标的方式似乎根据MotionBuilder在我背后做的任何事情而改变。

这是我的渲染代码。如果场景中没有纹理几何体,则意味着MotionBuilder尚未摆弄任何与纹理相关的属性,它按预期工作。

// Tell MotionBuilder's renderer to draw the scene 
RenderScene(); 

// Clear whatever arbitrary state MotionBuilder left for us 
InitializeAttributes(); // includes glPushAttrib(GL_ALL_ATTRIB_BITS) 
InitializePerspective(); // projects into the scene/loads matrices 

// Enable texturing, bind to our texture, and draw a triangle into the scene 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, mTexture); 

glBegin(GL_TRIANGLES); 
glColor4f(1.0, 1.0, 1.0, 0.5f); 
    glTexCoord2f(1.0, 0.0); glVertex3f(128.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f( 0.0, 128.0, 0.0); 
    glTexCoord2f(0.0, 0.0); glVertex3f( 0.0, 0.0, 0.0); 
glEnd(); 

// Clean up so we don't confound MotionBuilder's initial expectations 
RestoreState(); // includes glPopAttrib() 

现在,如果我带入一些带有纹理的网格,会发生奇怪的事情。我的纹理坐标变大了。这里有一个前后:

mbtexture.jpg http://awforsythe.com/i/mbtexture.jpg

你可以从右边的特写看,当被要求MotionBuilder的渲染贴图其文件无法找到,它不是加载这个小问题标记纹理并将其贴在几何图形上。我唯一的假设是,MotionBuilder正在改变一些全局纹理坐标标量,例如,glTexCoord2f(0.5,1.0)将被解释为(50.0,100.0)。 OpenGL中有这样的功能吗?任何想法我需要修改以保存我输入的纹理坐标?


由于打字以上,并做了一些研究之后,我发现那里是一个的用于这个效果的矩阵GL_TEXTURE。整齐!的确,当我得到这个矩阵的值开始,它的好醇”身份矩阵:

1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

当我再次检查后MotionBuilder的呓语了我的纹理坐标:

16 0 0 0 
0 16 0 0 
0 0 1 0 
0 0 0 1 

如何有说服力!但是这里有一个小问题:如果我在做自己的绘制之前尝试明确地设置纹理矩阵,无论MotionBuilder在做什么,看起来像我的纹理坐标不起作用,它只是简单地对纹理的左下角进行采样0.0,0.0)为每个顶点。

这里的尝试修复,在代码放置RenderScene后贴上面:

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 

我可以验证GL_TEXTURE_MATRIX的值现在是单位矩阵,但无论怎样坐标我在glTexCoord2f指定,它的总是绘制为每个顶点的坐标为(0.0,0。0):

mbtexturematrix.jpg http://awforsythe.com/i/mbtexturematrix.jpg

任何想法,否则可能会影响的OpenGL如何解释我的纹理坐标?

回答

2

啊哈!这些调用:

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 

...不得不启用 GL_TEXTURE_2D后作出。

...应通过将矩阵模式设置回GL_MODELVIEW进行跟踪。很明显,我在重置纹理矩阵(glViewport和/或gluPerspective?)后立即调用的某些函数会影响当前的矩阵堆栈。所以这些调用影响了纹理矩阵,导致我的纹理坐标以意想不到的方式转换。

我想我现在已经明白了。

+1

谢谢你,stackoverflow,作为一个不容忍研究不好的问题的地方,从而激励我在写作过程中回答我自己的冗长问题。 – awforsythe 2012-08-16 23:01:08