簡體   English   中英

OpenGL中的立方體邊緣

[英]Cube's edges in 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);

我無法去除立方體表面之間的白色邊緣,請參見下圖:

屏幕截圖

GL_NEAREST消除了問題,但是圖像質量較低,如何使用GL_LINEAR並消除這種影響?

編輯:

使用以下教程創建多維數據集: 模型加載

考慮到紋理是由縫合在列中的六個面構成的。 實際的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;

}

我認為您想使用cubemapsGL_ARB_seamless_cube_map

盡管生成的(st)坐標不太可能位於確定的立方體貼圖面之外,但通常情況是,線性采樣期間所需的各個元素的位置不在確定的面內,因此它們的坐標將通過選定的夾緊和包裹規則進行修改。 這通常具有在采樣紋理中產生接縫或其他不連續性的效果。

此擴展允許實現從相鄰的多維數據集貼圖面中采樣,從而提供創建無縫多維數據集圖的能力。

(我的代表)。

要使用它,請首先檢查您是否確實具有該擴展名(這取決於您的平台以及最終幫助您訪問OpenGL的工具箱),然后編寫

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);

啟用它(全局)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM