在下图中,左侧纹理是POT纹理 - 如果纹理坐标超出[0,1],则边缘像素重复。这就是我所期待的。
但渲染NPOT纹理时的相同精确代码并未扩展右边缘仅的边缘像素。
他们为什么表现不同?
[编辑]
为了确保我没有犯其他错误,我用简单的测试代码替换了渲染代码。
GLboolean glEnable2d = 0;
GLboolean glEnableRect = 0;
glGetBooleanv(GL_TEXTURE_2D, &glEnable2d);
glGetBooleanv(GL_TEXTURE_RECTANGLE_ARB, &glEnableRect);
if (texWidth == 1.0 && texHeight == 1.0) {
if (glEnableRect) {
printf("GL_TEXTURE_RECTANGLE_ARB is ENABLED!\n");
}
printf("TEX 2D: width = %.3f, height = %.3f\n", texWidth, texHeight);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
} else {
if (glEnable2d) {
printf("GL_TEXTURE_2D is on!\n");
}
printf("TEX RECT: width = %.3f, height = %.3f\n", texWidth, texHeight);
glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
glBegin(GL_QUADS);
if (drawBeyondEdge) {
glTexCoord2f(0.0 * texWidth, 1.0 * texHeight);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0 * texWidth, 1.0 * texHeight);
glVertex3f(+1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0 * texWidth, 0.0 * texHeight);
glVertex3f(+1.0f, +1.0f, 0.0f);
glTexCoord2f(0.0 * texWidth, 0.0 * texHeight);
glVertex3f(-1.0f, +1.0f, 0.0f);
} else {
glTexCoord2f(-1.0 * texWidth, 2.0 * texHeight);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(2.0 * texWidth, 2.0 * texHeight);
glVertex3f(+1.0f, -1.0f, 0.0f);
glTexCoord2f(2.0 * texWidth, -1.0 * texHeight);
glVertex3f(+1.0f, +1.0f, 0.0f);
glTexCoord2f(-1.0 * texWidth, -1.0 * texHeight);
glVertex3f(-1.0f, +1.0f, 0.0f);
}
glEnd();
这是它产生的结果,左边是POT纹理,右边是NPOT纹理。
答案 0 :(得分:1)
行。我已经回答了我自己的问题。我正在使用Apple客户端存储,因为我正在将实时视频上传到此纹理。根据{{3}}的建议,我将纹理的宽度四舍五入到32个字节的倍数,用黑色填充右侧的额外位。 NPOT纹理没有出现这个问题,因为如果它们的宽度至少为8个像素,它们总是32个字节的倍数。