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);
注意事项:
- 每次 GL 调用后,我都会检查错误
glGetError()
,但我没有收到任何错误。
- 如果我用 GL_TEXTURE_2D 替换 GL_TEXTURE_RECTANGLE_ARB 一切正常
- 这不是 uv (st) 坐标的问题。使用 GL_TEXTURE_2D 绘图时,我的 uv 为 0->1,使用 GL_TEXTURE_RECTANGLE_ARB 时,我的 uv 为 0->texWidth 或 texHeight
- 我是 运行 一个相当新的 mac 报告 GL 版本 2.1 NVIDIA-10.2.1 310.41.15f01 所以它当然应该支持 GL_TEXTURE_RECTANGLE_ARB。 (反正我会想)
- 我已经缩小了问题的范围,可以非常确定在渲染着色器时始终引用绑定为 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 到高度范围内的非规范化纹理坐标。
我有一个使用 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);
注意事项:
- 每次 GL 调用后,我都会检查错误
glGetError()
,但我没有收到任何错误。 - 如果我用 GL_TEXTURE_2D 替换 GL_TEXTURE_RECTANGLE_ARB 一切正常
- 这不是 uv (st) 坐标的问题。使用 GL_TEXTURE_2D 绘图时,我的 uv 为 0->1,使用 GL_TEXTURE_RECTANGLE_ARB 时,我的 uv 为 0->texWidth 或 texHeight
- 我是 运行 一个相当新的 mac 报告 GL 版本 2.1 NVIDIA-10.2.1 310.41.15f01 所以它当然应该支持 GL_TEXTURE_RECTANGLE_ARB。 (反正我会想)
- 我已经缩小了问题的范围,可以非常确定在渲染着色器时始终引用绑定为 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 到高度范围内的非规范化纹理坐标。