GL_TEXTURE_RECTANGLE_ARB 无法使用着色器和 OS X

GL_TEXTURE_RECTANGLE_ARB not working with shader and OS X

我有一个使用 OpenGL 的 OSX 应用程序。我用 GL_TEXTURE_2D 类型的纹理绘制我的大部分东西,只要我坚持使用 GL_TEXTURE_2D,一切都很好。但是我需要一些 GL_TEXTURE_RECTANGLE_ARB 类型的纹理。

要创建类型为 GL_TEXTURE_RECTANGLE_ARB 的纹理,我执行以下操作:

// 4x4 RGBA texture data
GLubyte  TexData[4*4*4] =
{
    0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff,
    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
    0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
    0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff,
    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
    0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
    0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff,
    0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
};

GLuint myArbTexture;

glEnable(GL_TEXTURE_RECTANGLE_ARB);
glGenTextures(1, &myArbTexture);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myArbTexture);

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAX_LEVEL, 0 );
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, TexData);

为了绘制纹理,我执行以下操作:

SetupMyShader();
SetupMyMatrices();

glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myArbTexture);

DrawMyQuads();

我的着色器很简单:

    void main (void)
    {
       gl_FragColor = texture2D(Tex, v_texcoords)*u_color;
    }

使用上面的代码,我的着色器总是引用最后使用的纹理:

glBindTexture(GL_TEXTURE_2D, lastTexture)

而不是引用指定的纹理:

glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myArbTexture);

注意事项:

  1. 每次 GL 调用后,我都会检查错误 glGetError(),但我没有收到任何错误。
  2. 如果我用 GL_TEXTURE_2D 替换 GL_TEXTURE_RECTANGLE_ARB 一切正常
  3. 这不是 uv (st) 坐标的问题。使用 GL_TEXTURE_2D 绘图时,我的 uv 为 0->1,使用 GL_TEXTURE_RECTANGLE_ARB 时,我的 uv 为 0->texWidth 或 texHeight
  4. 我是 运行 一个相当新的 mac 报告 GL 版本 2.1 NVIDIA-10.2.1 310.41.15f01 所以它当然应该支持 GL_TEXTURE_RECTANGLE_ARB。 (反正我会想)
  5. 我已经缩小了问题的范围,可以非常确定在渲染着色器时始终引用绑定为 GL_TEXTURE_2D 的先前纹理。我的四边形总是绘制在正确的位置并且具有合理的 uv 坐标,只是它引用了错误的纹理。

所以,有人猜到我错过了什么吗?在使用 GL_TEXTURE_RECTANGLE_ARB 时,我的着色器需要调用 glBindTexture 以外的其他调用吗?

您需要更新着色器代码才能使用矩形纹理。制服需要声明为:

uniform sampler2DRect Tex;

并通过以下方式访问:

    gl_FragColor = texture2DRect(Tex, v_texcoords)*u_color;

要记住的另一个方面是矩形纹理的纹理坐标定义不同。与所有其他纹理类型使用的 0.0 到 1.0 范围内的规范化纹理坐标不同,矩形纹理使用 0.0 到宽度和 0.0 到高度范围内的非规范化纹理坐标。