Cube在OpenGL中的边缘

时间:2016-06-03 15:07:08

标签: c++ opengl

我在OpenGl中绘制了一个立方体,将其用作天空盒。 我正在使用单个纹理图像,我使用UV坐标将6个面定位在正确的位置。 我使用以下代码发送纹理:

//------------------------------------Luminance--------------------------------------------------------------
glPixelStorei(GL_UNPACK_ROW_LENGTH, m_width);
glBindTexture(GL_TEXTURE_2D, texturePointer[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_width, m_height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uYdata);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


//--------------------------------------U component------------------------------------------------------------
glPixelStorei(GL_UNPACK_ROW_LENGTH, m_uvWidth);
glBindTexture(GL_TEXTURE_2D, texturePointer[1]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_uvWidth, m_uvHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uUdata);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

//------------------------------------- V component-------------------------------------------------------------
glBindTexture(GL_TEXTURE_2D, texturePointer[2]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_uvWidth, m_uvHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uVdata);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

我无法移除立方体面之间的白边,请参见下图:

screenshot

GL_NEAREST删除问题,但图像质量较低, 如何使用GL_LINEAR并删除此效果?

修改

使用以下教程创建多维数据集: Model loading

考虑到纹理是由列中缝合的六个面构成的。 实际的Blender对象是:

# Blender v2.77 (sub 0) OBJ File: 'demo_cube.blend'
# www.blender.org
o Cube
v  1.000000  -1.000000 -1.000000
v  1.0000000 -1.000000 1.000000
v -1.000000  -1.000000 1.000000
v -1.000000  -1.000000 -1.000000
v  1.000000   1.000000 -1.000000
v  1.0000000  1.000000 1.000000
v -1.000000   1.000000 1.000000
v -1.000000   1.000000 -1.000000
vt 0.833333333 0.0000
vt 0.666666666 1.0000
vt 0.833333333 1.0000
vt 0.833333333 0.0000
vt 1.000000000 1.0000
vt 1.000000000 0.0000
vt 0.333333333 1.0000
vt 0.500000000 0.0000
vt 0.333333333 0.0000
vt 0.500000000 1.0000
vt 0.666666666 0.0000
vt 0.500000000 0.0000
vt 0.000000000 0.0000
vt 0.166666666 1.0000
vt 0.166666666 0.0000
vt 0.333333333 0.0000
vt 0.166666666 1.0000
vt 0.333333333 1.0000
vt 0.666666666 0.0000
vt 0.833333333 1.0000
vt 0.500000000 1.0000
vt 0.666666666 1.0000
vt 0.000000000 1.0000
vt 0.166666666 0.0000
s off
f 2/1 4/2 1/3
f 8/4 6/5 5/6
f 5/7 2/8 1/9
f 6/10 3/11 2/12
f 3/13 8/14 4/15
f 1/16 8/17 5/18
f 2/1 3/19 4/2
f 8/4 7/20 6/5
f 5/7 6/21 2/8
f 6/10 7/22 3/11
f 3/13 7/23 8/14
f 1/16 4/24 8/17
//44 and 47

片段着色器是:

#version 330 core

in vec2 oTexCoord;

uniform sampler2D yChannel;
uniform sampler2D uChannel;
uniform sampler2D vChannel;



out vec4 color;


const vec3 offset = vec3(0.0625, 0.5, 0.5);
const mat3 coef = mat3(
        1.164,  0.0,          1.793,
        1.164, -0.213, -0.533,
        1.164,  2.112,   0.0
    );

void main()
{ 
    vec2 nTexCoord = vec2(oTexCoord.x, 1.0 - oTexCoord.y);

    vec4 Tcolor = vec4(1.0);

    if(oTexCoord.y <1  && oTexCoord.y > 0.0) {
        if(oTexCoord.x < 1  && oTexCoord.x > 0.0) {

            vec3 yuv = vec3(
                    texture(yChannel, nTexCoord).r,
                    texture(uChannel, nTexCoord).r,
                    texture(vChannel, nTexCoord).r
                ) - offset;
            vec3 rgb = yuv * coef;

            Tcolor = vec4(rgb, 1.0);            
        }
    }

    color = Tcolor;

}

1 个答案:

答案 0 :(得分:1)

我想您想使用cubemapsGL_ARB_seamless_cube_map

  

虽然生成的(st)坐标不太可能明显位于确定的立方体图面之外,但通常情况是线性采样期间所需的各个元素的位置不在确定的面内,并且因此,坐标将通过所选的夹紧和包装规则进行修改。 这通常会在采样纹理中产生接缝或其他不连续性。

     

此扩展允许实现从相邻的立方体贴图面采集样本,从而提供创建无缝立方体贴图的功能。

(emph.mine)。

要使用它,首先要检查你确实有那个扩展(这取决于你的平台以及最终帮助你访问OpenGL的工具包),然后写下

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);

启用它(全局)。