gpt4 book ai didi

opengl - 为什么 POT 和 NPOT 纹理的 GL_CLAMP_TO_EDGE 不同?

转载 作者:行者123 更新时间:2023-12-01 05:06:22 47 4
gpt4 key购买 nike

在下图中,左侧纹理是 POT 纹理——如果纹理坐标超出 [0,1],则边缘像素重复。这就是我所期望的。

pot vs npot texture

但是在渲染 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 纹理。

pot vs npot output from simple test code

最佳答案

好的。我已经回答了我自己的问题。我正在使用 Apple Client Storage,因为我正在将实时视频上传到此纹理。正如 Apple Client Storage Recommendations 所推荐的我将纹理的宽度四舍五入为 32 字节的倍数,用黑色填充右侧的额外位。 NPOT 纹理不会出现此问题,因为如果它们的宽度至少为 8 像素,则它们始终是 32 字节的倍数。

关于opengl - 为什么 POT 和 NPOT 纹理的 GL_CLAMP_TO_EDGE 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209842/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com