通过透视变换插值纹理坐标

时间:2017-04-02 16:55:53

标签: opengl graphics glsl

我的问题是基于对Advanced Graphics Progamming using OpenGL的13.7章的阅读。

这些问题的最终目标是手动计算每个像素所需的mipmap级别。

第一个问题:

如何在窗口空间中正确计算纹理坐标?

我不太清楚这本书解释的方式。似乎如果我想正确插值我的纹理坐标,我必须遵循以下步骤:

在我的顶点着色器中:

  1. 将MVP矩阵应用于我的顶点坐标(存储在gl_Position中)
  2. 取我的纹理坐标并将它们除以顶点坐标的w分量,然后将其传递给片段着色器(这样它们就会被插值)
  3. 计算1 / w值并将其传递给片段着色器(因此它们将被插值)
  4. 代码如下:

    vec4 clipCoord = MVP * vertexPosition;
    gl_Position = clipCoord;
    
    /*
      assuming vertexTextureCoord is pass as input to the VS.
      So the texture coordinate are in "Texture space".
      outTextureCoord and outInvHomogeneousComponent are pass to the FS
    */
    outTextureCoord = vertexTextureCoord / clipCoord.w;
    outInvHomogeneousComponent = 1/clipCoord.w;
    

    在我的片段着色器中:

    1. 将插值的textureCoordinate乘以插值的1 / w
    2. 代码如下:

      vec2 windowSpaceTextureCoordinate = 
      inTextureCoord * inInvHomogeneousComponent;
      

      这些都是正确的,还是我错过了什么?如果是,为什么?

      在阅读这篇文章时,我假设了一些概念,例如通过在VS中第一次用w除以它们,以及在FS中用插值的1 / w对纹理坐标进行双曲线插值的方法。我知道它来自Blinn的文章,但我无法弄清楚它是如何工作的。

      第二个问题

      假设第一个结果是正确的,本书中使用的方法是否正确计算lod? 如果你阅读这篇文章,我的意思是将之前的结果转换为纹素坐标,并使用结果来执行偏导数公式。

0 个答案:

没有答案
相关问题