c++ - GL_TEXTURE_RECTANGLE_ARB 不适用于着色器和 OS X

标签 c++ macos opengl fragment-shader

我有一个使用 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. 我正在运行一台报告 GL 版本 2.1 NVIDIA-10.2.1 310.41.15f01 的全新 mac,因此它当然应该支持 GL_TEXTURE_RECTANGLE_ARB。 (无论如何我都会想)
  5. 我已经缩小了问题的范围,可以非常确定在渲染着色器时始终引用绑定(bind)为 GL_TEXTURE_2D 的先前纹理。我的四边形总是绘制在正确的位置并且具有合理的 uv 坐标,只是它引用了错误的纹理。

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

最佳答案

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

uniform sampler2DRect Tex;

并通过以下方式访问:

    gl_FragColor = texture2DRect(Tex, v_texcoords)*u_color;

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

关于c++ - GL_TEXTURE_RECTANGLE_ARB 不适用于着色器和 OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29420225/

相关文章:

c++ - 从具有可变参数的模板类继承

c++ - 标准线程 sleep_for 不适用于某些 chrono::duration

macos - 在 macOS Movaje 10.14 中安装 Homebrew + nginx + rtmp

c++ - QOpenGLFunctions 常量不正确

c++ - Qt5.5静态构建在ubuntu14上找不到-IGL

c++ - 在 Linux 上编译简单信号代码时从 void* 到 void (*) int 的无效转换

c++ - ForEach 中的最后一个元素

c++ - 在 OSX 中使用什么架构?

macos - Applescript 右键单击​​一个文件

java - 如何使用 lwjgl 将相机视线方向用作 z 方向