Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么会全局影响OpenGL中的纹理坐标值?_Opengl_Coordinates_Textures_Texture Mapping - Fatal编程技术网

什么会全局影响OpenGL中的纹理坐标值?

什么会全局影响OpenGL中的纹理坐标值?,opengl,coordinates,textures,texture-mapping,Opengl,Coordinates,Textures,Texture Mapping,我正在为一个名为Autodesk MotionBuilder的应用程序编写插件,该应用程序具有OpenGL渲染器,我正在尝试将纹理几何体渲染到场景中。我有一个嵌入了3D视图的窗口,每次渲染我的窗口时,都会发生以下情况(简而言之): 我告诉渲染器我将要绘制一个给定大小的区域 我告诉渲染器在该区域绘制MotionBuilder场景 我在场景中和/或场景顶部绘制了一些额外的内容 这里的挑战是,我从MotionBuilder的渲染器继承了一些任意的OpenGL状态,这取决于它所绘制的内容和场景中存在的内

我正在为一个名为Autodesk MotionBuilder的应用程序编写插件,该应用程序具有OpenGL渲染器,我正在尝试将纹理几何体渲染到场景中。我有一个嵌入了3D视图的窗口,每次渲染我的窗口时,都会发生以下情况(简而言之):

  • 我告诉渲染器我将要绘制一个给定大小的区域
  • 我告诉渲染器在该区域绘制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()
    
    现在,如果我引入一些带有纹理的网格,会发生一些奇怪的事情。我的纹理坐标被放大了。这里有一个前后对比:


    (来源:)

    从右侧的特写中可以看到,当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,你是一个不能容忍研究不力的问题的地方,从而激励我在写作过程中回答自己冗长的问题。