OpenGL Skybox可见边框

时间:2016-01-20 20:40:06

标签: c++ opengl skybox

我的天空盒显示: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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
}

其中sign rutine用于严格[0,1]纹理坐标规范。您可以使用GLSL sign rutine。 sign检索向量或标量的符号,它表示-1表示负数,1表示正值,因此要为顶点着色器传递纹理坐标,必须将其指定为-1表示0表示1表示1表示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