OpenGL 天空盒可见边界
OpenGL Skybox visible borders
我的天空盒显示:
但是盒子有边框,我不想要。我已经在互联网上搜索过了,他们都说 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);
谁能告诉我我做错了什么?
编辑:
奇怪的是边框只出现在天空盒的顶部。所以当天空盒面接触到盒子的屋顶时。
这是它的图片:
其纹理坐标浮动错误。如果你使用着色器,你可以将它清理到严格的 [0.0f, 1.0f]。我不能说 OpenGL API 调用是否有任何可能的解决方案。但是着色器必须支持这一点。 post 屏幕着色器使用 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
例程用于严格的 [0, 1] 纹理坐标规范。您还可以使用 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 纹素宽度不准确:
现在使用修改后的着色器:
我终于找到了解决办法。这是纹理本身的一个肮脏的错误。纹理周围有一个黑色边框,但除非你放大,否则你几乎看不到它。所以我删除了边框并且它起作用了。
我的天空盒显示:
但是盒子有边框,我不想要。我已经在互联网上搜索过了,他们都说 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);
谁能告诉我我做错了什么?
编辑:
奇怪的是边框只出现在天空盒的顶部。所以当天空盒面接触到盒子的屋顶时。
这是它的图片:
其纹理坐标浮动错误。如果你使用着色器,你可以将它清理到严格的 [0.0f, 1.0f]。我不能说 OpenGL API 调用是否有任何可能的解决方案。但是着色器必须支持这一点。 post 屏幕着色器使用 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
例程用于严格的 [0, 1] 纹理坐标规范。您还可以使用 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 纹素宽度不准确:
现在使用修改后的着色器:
我终于找到了解决办法。这是纹理本身的一个肮脏的错误。纹理周围有一个黑色边框,但除非你放大,否则你几乎看不到它。所以我删除了边框并且它起作用了。