我正在为一个名为Autodesk MotionBuilder的应用程序编写一个插件,该应用程序有一个OpenGL渲染器,并且我试图将纹理几何体渲染到场景中。我有一个三维视图嵌入一个窗口,每一个我的窗口渲染的时候,这是(简而言之)会发生什么:什么可能会影响OpenGL中的纹理坐标值?
- 我告诉大家,我要绘制成的区域渲染给定大小
- 我告诉渲染绘制MotionBuilder的场景在该地区
- 我画一些其他的东西进入和/或在现场的顶部
这里的挑战是,我从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如何解释我的纹理坐标?
谢谢你,stackoverflow,作为一个不容忍研究不好的问题的地方,从而激励我在写作过程中回答我自己的冗长问题。 – awforsythe 2012-08-16 23:01:08