使用TEXTURE_RECTANGLE_ARB影响TEXTURE_2D
Use of TEXTURE_RECTANGLE_ARB affecting TEXTURE_2D
我使用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纹理。
有人知道为什么会发生这种情况吗?谢谢!
好的,所以结果是这是一个相当愚蠢的错误,这是在原始的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
我不知道目标优先级或优先级在错误的时候,所以感谢@datenwolf!
即使你已经解决了你的问题,我还是想澄清一个概念,它可能会解决你在不久的将来遇到的问题。
错误如下:
现在我正在添加NPOTS纹理(使用TEXTURE_RECTANGLE_ARB)
GL_texture_rectangle OpenGL扩展并不意味着支持非2次幂(NPOT)纹理;正确的OpenGL扩展名应该是GL_texture_non_power_of_two。
GL_texture_non_power_of_two不能破坏现有的期望2的幂(POT)纹理的应用程序,因为它放宽了规范,以便接受具有任何宽度/高度/深度的纹理(当然,在限制内)。下面是扩展名的引用:
没有引入额外的过程或枚举api导出扩展的实现除外字符串将允许应用程序传入纹理尺寸可以是异能也可以不是异能的1D、2D、立方体地图和3D目标二。
相反,GL_texture_rectangle允许您通过像素坐标寻址纹理范围(宽度和高度)来指定纹理坐标,像素坐标是一个整数(而不是通常在[0.0f, 1.0f]范围内归一化的浮点坐标)。此外,矩形纹理不支持mipmapping。
另外,如果你阅读GL_texture_rectangle规范,它并不意味着支持NPOT纹理,因为矩形纹理将受到与2D纹理相同的限制。
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数