2016-06-03 7 views
0

Ich habe einen Würfel in OpenGl gezeichnet, um es als Skybox zu verwenden. Ich verwende ein einzelnes Texturbild und verwende die UV-Koordinaten, um die 6 Gesichter an den richtigen Positionen zu lokalisieren. Ich schicke die Textur mit dem folgenden Code:Würfelkanten in OpenGL

//------------------------------------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); 

ich nicht die weißen Kanten zwischen den Seitenflächen des Würfels entfernen kann, finden Sie das Bild unten:

screenshot

GL_NEAREST das Problem beheben aber die Qualität des Bildes ist niedriger, Wie kann ich GL_LINEAR verwenden und diesen Effekt entfernen?

Edit:

Der Cube erstellt wird, die folgende Tutorial verwendet: Model loading

Bedenkt man, dass die Textur von sechs Flächen genäht in Spalten hergestellt ist. Die eigentliche Blender Objekt ist:

# 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 

Das Fragment-Shader ist:

#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; 

} 
+0

Haben Sie überprüft, ob Ihre Texturen keine 1px-Grenze mit weißen/transparenten Pixeln oder etwas Ähnlichem haben? –

+0

Diese Art von Rendering-Fehler hängt damit zusammen, dass die Flächengeometrie an den Kanten nicht korrekt ausgerichtet ist. Ich bin mir nicht sicher, was Sie mit "Ich verwende ein einzelnes Texturbild und ich verwende die UV-Koordinaten, um die 6 Gesichter in den richtigen Positionen zu lokalisieren." - Wenn Sie meinen, dass Sie die Scheitelpunkte mit einer Textur positionieren, hat dies möglicherweise mit der Genauigkeit des Bildformats zu tun. –

+0

Da 'GL_NEAREST' die Probleme beseitigt, ist dies wahrscheinlich nicht auf falsch ausgerichtete Geometrie zurückzuführen. Der gegebene Ansatz erscheint jedoch merkwürdig. Ich verstehe nicht, warum Sie UVs in einer Textur speichern. Vielleicht könnten Sie Ihren Ansatz näher erläutern oder Ihren Shader-Code hinzufügen. –

Antwort

1

Ich glaube, Sie cubemaps und GL_ARB_seamless_cube_map verwenden möchten:

Obwohl es unwahrscheinlich ist, dass die erzeugte (st) die Koordinate liegt deutlich außerhalb der ermittelten Würfelkartenfläche, so ist es häufig der Fall, dass die Positionen der einzelnen Elemente während einer linearen Abtastung benötigt werden ng liegen nicht innerhalb der ermittelten Fläche und ihre Koordinaten werden daher durch die gewählten Klemm- und Wickelregeln verändert. Dies hat häufig den Effekt, dass Nähte oder andere Diskontinuitäten in der Mustertextur entstehen.

Mit dieser Erweiterung können Implementierungen Stichproben von benachbarten Cube-Map-Flächen aufnehmen, wodurch nahtlose Cube-Maps erstellt werden können.

(emph. Meins).

es nutzen zu können, ist zunächst zu überprüfen, dass Sie in der Tat, dass die Erweiterung haben (diese auf Ihrer Plattform abhängig ist und auf dem Toolkit schließlich ist man in dem Zugriff auf OpenGL Unterstützung), dann schreiben Sie einfach

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); 

es zu ermöglichen (global).

+1

Das OP verwendet keine Cubemaps, das hilft also nicht. –

+0

Dann sollte das OP auch Cubemaps verwenden und eine nahtlose Filterung ermöglichen. – peppe

+0

Leider kann ich keine Cubemaps verwenden, da die Funktion glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X, ......) zu langsam ist und meine App die Textur in Echtzeit ändert. Die Verwendung einer einzelnen Textur, die mit UV-Koordinaten abgebildet wird, ist eine gute Wahl, wenn der Zweck darin besteht, die Textur mehrmals pro Sekunde an die GPU zu senden. – Pelux