使用TEXTURE_RECTANGLE_ARB影响TEXTURE_2D

时间:2011-07-29 13:35:39

标签: c++ opengl

我使用OpenGL 1.3进行2D精灵渲染,并分别使用TEXTURE_2D和TEXTURE_RECTANGLE_ARB支持POTS(两种尺寸的力量)纹理和NPOTS(两种尺寸的非功率)纹理。

我开始使用POTS纹理(使用TEXTURE_2D),效果很好,但现在我正在添加NPOTS纹理(使用TEXTURE_RECTANGLE_ARB)。此添加导致POTS纹理(使用TEXTURE_2D)中断。

休息我的意思是POTS纹理呈现为灰度渐变,范围从左下角的灰色和右上角的白色。

额外点(在尝试修复此错误时发现) - TEXTURE_RECTANGLE_ARB和TEXTURE_2D之间的一个重要区别是第一个使用纹理上的非标准化坐标,而TEXTURE_2D使用标准化坐标([0.0,1.0])。我决定检查并用非标准化坐标替换TEXTURE_2D的标准化坐标,这通过创建另一个来消除了灰度问题 - 它渲染了错误的纹理!

即。当使用POTS和NPOTS纹理时,我的POTS纹理会尝试渲染NPOTS纹理。

有谁知道为什么会这样?三江源!

2 个答案:

答案 0 :(得分:1)

好的,事实证明这是一个相当愚蠢的错误,可以在最初的TEXTURE_2D代码中找到。我忘了用正确的glDisable来结束渲染!

即。渲染代码以glEnable(targetType)开头,但不以glDisable(targetType)结尾[其中targetType是GL_TEXTURE_2D或GL_TEXTURE_RECTANGLE_ARB的正确选择]。

我想,不知何故,两个渲染环境交织在一起。

课程 - 确保以glEnable开头,以glDisable结尾。

编辑:考虑到以下评论,我做了一点挖掘,发现了目标总统。这个想法在本文开头介绍:

http://math.hws.edu/graphicsnotes/c4/s5.html

“渲染曲面时最多使用一个纹理目标。如果启用了多个目标,3D纹理优先于2D纹理,2D纹理优先于1D。除了本节后面的一个示例,我们只适用于2D纹理。“

就TEXTURE_RECTANGLE_ARBs优先级而言,这将在第10节的说明中描述:http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

我不知道bug发生时的目标优先级或优先级,所以感谢@datenwolf!

答案 1 :(得分:1)

即使您已经解决了问题,我也想澄清一个可能解决您在不久的将来可能遇到的问题的概念。

这是错误的:

  

现在我正在添加NPOTS纹理(使用TEXTURE_RECTANGLE_ARB)

GL_texture_rectangle OpenGL扩展并不意味着支持Not Power Of Two(NPOT)纹理;正确的OpenGL查询扩展名是GL_texture_non_power_of_two。

GL_texture_non_power_of_two无法破坏期望Power of Two(POT)纹理的现有应用程序,因为它放宽了规范以接受具有任何宽度/高度/深度(当然在限制范围内)的纹理。以下是扩展名的引用:

  

此处没有引入额外的程序或枚举api      扩展名,但导出扩展名的实现除外      string将允许应用程序传递纹理维度      1D,2D,立方体贴图和3D目标可能是也可能不是力量      两个。

相反,GL_texture_rectangle允许您通过像素坐标寻址纹理范围(宽度和高度)来指定纹理坐标,像素坐标是一个整数(而不是在[0.0f,1.0f]范围内归一化的通常浮点坐标) )。此外,矩形纹理不支持mipmapping。


另外,如果你阅读GL_texture_rectangle规范,它并不意味着支持NPOT纹理,因为矩形纹理应受到2D纹理的相同限制的影响。