OpenGL Skybox 可见边框

Posted

技术标签:

【中文标题】OpenGL Skybox 可见边框【英文标题】:OpenGL Skybox visible borders 【发布时间】:2016-01-20 20:40:05 【问题描述】:

我的天空盒正在显示:

但是盒子有边框,这是我不想要的。我已经搜索了互联网,他们都说 GL_CLAMP_TO_EDGE 应该可以工作,但我仍然看到边界。

这是我用来加载纹理的:

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);

谁能告诉我我做错了什么?

编辑:

奇怪的是边框只显示在天空盒的顶部。所以当天空盒的面接触到盒子的顶部时。

这是它的图像:

【问题讨论】:

@WillBriggs 我还能说什么?这是我用的,是不是错了?这是一个常见的问题,但没有多少人能解决它。 Clamp to edge 会影响纹理坐标到达纹理贴图边缘时发生的情况;你的每张脸是一张单独的地图,还是你把所有六张脸都放在一张地图中(大概是白色背景)? 你想在这里有1200行代码吗?我已经读过这个链接几次了,但是如果我不给出我的整个代码,你们就不知道每个函数和东西是什么。 但是如果你们想运行它,包括 main 方法,那么它仍然会是大量的代码。 纹理图像中是否存在实际边框?也许你可以发布你的天空纹理来检查? 【参考方案1】:

我终于找到了解决办法。这是纹理本身的一个肮脏错误。纹理周围有一个黑色边框,但除非放大,否则您几乎看不到它。所以我删除了边框并且它起作用了。

【讨论】:

【参考方案2】:

它的纹理坐标浮动错误。如果您使用着色器,您可以将其清理为严格 [0.0f, 1.0f]。我不能说 OpenGL API 调用是否有任何可能的解决方案。但是着色器必须支持这一点。使用 HLSL 2.0 (NVIDIA Cg) 进行后期屏幕着色器的示例。

float g_fInverseViewportWidth: InverseViewportWidth;
float g_fInverseViewportHeight: InverseViewportHeight;

struct VS_OUTPUT 
   float4 Pos: POSITION;
   float2 texCoord: TEXCOORD0;
;

VS_OUTPUT vs_main(float4 Pos: POSITION)
   VS_OUTPUT Out;

   // Clean up inaccuracies
   Pos.xy = sign(Pos.xy);

   Out.Pos = float4(Pos.xy, 0, 1);
   // Image-space
   Out.texCoord.x = 0.5 * (1 + Pos.x + g_fInverseViewportWidth);
   Out.texCoord.y = 0.5 * (1 - Pos.y + g_fInverseViewportHeight);

   return Out;

sign rutine 用于严格的 [0, 1] 纹理坐标规范。您还可以使用 sign 用于 GLSL 的 rutine。 sign 检索向量或标量的符号,它意味着 -1 表示负数,1 表示正值,因此要为顶点着色器传递纹理坐标,它必须指定为 -1 表示 0 和 1 表示 1,而不是您可以使用类似的公式实际纹理坐标规范:

   Out.texCoord.x = 0.5 * (1 + Pos.x + g_fInverseViewportWidth);
   Out.texCoord.y = 0.5 * (1 - Pos.y + g_fInverseViewportHeight);

在这里你可以看到纹理 1 纹素宽度不准确:

现在使用修改后的着色器:

【讨论】:

以上是关于OpenGL Skybox 可见边框的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:天空盒放大太多

一步步学OpenGL 25-《Skybox天空盒子》

OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

OpenGL未将坐标正确映射到android屏幕

纹理周围的边框,OpenGL

OpenGL - 当我在立方体上绘制边框时出现额外的线条