什么会全局影响OpenGL中的纹理坐标值?
我正在为一个名为Autodesk MotionBuilder的应用程序编写插件,该应用程序具有OpenGL渲染器,我正在尝试将纹理几何体渲染到场景中。我有一个嵌入了3D视图的窗口,每次渲染我的窗口时,都会发生以下情况(简而言之):什么会全局影响OpenGL中的纹理坐标值?,opengl,coordinates,textures,texture-mapping,Opengl,Coordinates,Textures,Texture Mapping,我正在为一个名为Autodesk MotionBuilder的应用程序编写插件,该应用程序具有OpenGL渲染器,我正在尝试将纹理几何体渲染到场景中。我有一个嵌入了3D视图的窗口,每次渲染我的窗口时,都会发生以下情况(简而言之): 我告诉渲染器我将要绘制一个给定大小的区域 我告诉渲染器在该区域绘制MotionBuilder场景 我在场景中和/或场景顶部绘制了一些额外的内容 这里的挑战是,我从MotionBuilder的渲染器继承了一些任意的OpenGL状态,这取决于它所绘制的内容和场景中存在的内
// 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()
现在,如果我引入一些带有纹理的网格,会发生一些奇怪的事情。我的纹理坐标被放大了。这里有一个前后对比:
(来源:) 从右侧的特写中可以看到,当MotionBuilder被要求渲染其无法找到文件的纹理时,它会加载这个小问号纹理并在几何体上平铺它。我唯一的假设是MotionBuilder正在更改某些全局纹理坐标标量,例如,glTexCoord2f(0.5,1.0)将被解释为(50.0,100.0)。OpenGL中有这样的功能吗?知道我需要修改什么才能在输入纹理坐标时保留纹理坐标吗
自从输入了上面的内容,在做了一些研究之后,我发现有一个GL_纹理矩阵用于实现这种效果。整洁的事实上,当我最初得到这个矩阵的值时,它是一个好的ol’恒等矩阵:
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)一样绘制:
(来源:) 知道还有什么会影响OpenGL如何解释我的纹理坐标吗?啊哈!这些呼吁:
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
…必须在启用GL\u TEXTURE\u 2D
后进行
…之后应将矩阵模式设置回GL\u MODELVIEW
。显然,我在重置纹理矩阵后立即调用的一些函数(glViewport
和/或glupperspective
?)会影响当前矩阵堆栈。因此,这些调用影响了纹理矩阵,导致我的纹理坐标以意外的方式变换
我想我现在明白了。谢谢你,stackoverflow,你是一个不能容忍研究不力的问题的地方,从而激励我在写作过程中回答自己冗长的问题。