OpenGL天空盒可见边界

3

我已经让我的天空盒显示出来了: enter image description here

但是有一些边框,我不想要。我已经在网上搜索过了,他们都说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);

请问有人能告诉我错在哪儿吗?

编辑:enter image description here

奇怪的是边框只出现在天空盒的顶部。因此,当天空盒面接触盒子的顶部时。

这是一张图片: enter image description here


@WillBriggs 我还应该说什么呢?这是我用的,它错了还是没错?这是一个常见的问题,但很少有人能够解决它。 - Hugius
夹紧到边缘会影响纹理坐标到达纹理图的边缘时发生的情况;您的每个面是否是单独的贴图,还是将所有六个面放入单个贴图中(可能带有白色背景)? - Tommy
你想在这里放置1200行代码吗?我已经读了那个链接几次,但如果我不提供整个代码,你们就不知道每个函数和其他东西是什么。 - Hugius
2
也许纹理图像中有实际的边界?也许您可以发布您的天空纹理进行检查? - rodrigo
@rodrigo 我更新了我的帖子,顺便说一下我使用了另一张天空盒的图片,但这张也不起作用。 - Hugius
显示剩余2条评论
2个回答

4

我终于找到了解决方案。这是纹理本身的一个错误,周围有一个黑色的边框,但你必须放大才能看到。所以,我去掉了边框,然后它就起作用了。


1

它的纹理坐标存在浮点误差。如果您使用着色器,可以将其清除为严格的 [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;
}

在严格的[0,1]纹理坐标规范中,使用sign例程。此外,还有GLSL的sign例程可供使用。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个像素宽度的不准确性:

enter image description here

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接