2013-07-27 14 views
6

Provo a mappare il cubo con 6 bitmap per ottenere l'effetto skybox. Il mio problema è che una texture sta mappando su ogni faccia del cubo. Ho controllato in gDEBugger, nella memoria texture del cubo ho solo un'immagine (mentre provo a caricare sei immagini).Mappatura cubo in OpenGL

Codice preparare texture:

bool Texture::LoadCubicTexture(vector<string> filenameTable) 
{ 
    glGenTextures(1,&texID); 
    glBindTexture(GL_TEXTURE_CUBE_MAP,texID); 

    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    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); 

    int i = 0; 
    vector<string>::iterator vsit; 

    // There is always six filenames 
    for(vsit=filenameTable.begin();vsit!=filenameTable.end();++vsit) 
    { 
    string filename = *vsit; 
    BMPData* bmpData = LoadTextureBMPData_custom(filename); 
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+i,0,GL_RGB,bmpData->width,bmpData->height,0,GL_BGR,GL_UNSIGNED_BYTE,&(bmpData->data[0])); 
    i++; 
    delete daneObrazu; 
    } 
    glGenerateMipmap(GL_TEXTURE_CUBE_MAP); 

    return true; 
} 

VS:

#version 330 core 

in vec3 vVertexPos; 
in vec3 vertexUV; 

out vec3 vCoords; 
uniform mat4 MVP; 

void main() 
{ 
    vCoords = normalize(vertexUV); 
    gl_Position = MVP * vec4(vVertexPos,1.0); 
} 

FS:

#version 330 core 

in vec3 vCoords; 
uniform samplerCube cube; 

out vec4 vFragColor; 

void main() 
{ 
    vFragColor = texture(cube, vCoords); 
} 

OBJ File:

# Blender v2.62 (sub 0) OBJ File: 'skybox.blend' 
# www.blender.org 
mtllib skybox.mtl 
o Cube 
v 10.487665 -10.487666 -10.487665 
v 10.487665 -10.487666 10.487665 
v -10.487667 -10.487666 10.487664 
v -10.487662 -10.487666 -10.487670 
v 10.487671 10.487666 -10.487660 
v 10.487659 10.487666 10.487673 
v -10.487670 10.487666 10.487662 
v -10.487665 10.487666 -10.487666 
vt 0.990480 0.014286 
vt 0.993478 0.991259 
vt 0.016505 0.994256 
vt 0.013507 0.017283 
vt 0.988479 0.008111 
vt 0.985457 0.993412 
vt 0.000157 0.990390 
vt 0.003179 0.005089 
vt 0.002693 1.001082 
vt -0.000347 0.009939 
vt 0.990796 0.006898 
vt 0.993837 0.998041 
vt 0.004581 0.999210 
vt 0.001535 0.006444 
vt 0.994302 0.003398 
vt 0.997347 0.996165 
vt 0.004172 -0.000587 
vt 0.996320 -0.003630 
vt 0.999364 0.988517 
vt 0.007216 0.991561 
vt 0.000632 0.000140 
vt 0.983846 -0.002921 
vt 0.986862 0.995017 
vt 0.003648 0.998078 
vn 0.000000 -1.000000 0.000000 
vn 0.000000 1.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn -0.000000 -0.000000 1.000000 
vn -1.000000 -0.000000 -0.000000 
vn 0.000000 0.000000 -1.000000 
usemtl Skybox 
s off 
f 1/1/1 2/2/1 3/3/1 
f 1/1/1 3/3/1 4/4/1 
f 5/5/2 8/6/2 7/7/2 
f 5/5/2 7/7/2 6/8/2 
f 1/9/3 5/10/3 6/11/3 
f 1/9/3 6/11/3 2/12/3 
f 2/13/4 6/14/4 7/15/4 
f 2/13/4 7/15/4 3/16/4 
f 3/17/5 7/18/5 8/19/5 
f 3/17/5 8/19/5 4/20/5 
f 5/21/6 1/22/6 4/23/6 
f 5/21/6 4/23/6 8/24/6 


Le mie domande:

  • sono tecniche che uso in questo codice è ok?
  • Come le trame si mappano per il cubo (nella trama GL_TEXTURE_CUBE_MAP), quando ci sono solo 2 UV? (Voglio dire in generale.)
  • Posso usare la generazione automatica di UV in questa situazione (devo fare per fare molte modifiche allo shader)?
  • Qualcuno può suggerirmi dove posso cercare un problema? (con alcune probabilità ; buffer, shader, meshes, solo suggerimento)?

[Edit]: Ho cercato di hardcode vertici e UV nel file sorgente separato e ho lo stesso problema-una texture per tutte le facce del cubo. Dati Hardcoded sembra essere corretto:

#include "TestCube.h" 

vector<vec3> GetTestCubeVertices() 
{ 
    vector<vec3> vrtx; 

    const float xd = 1.0f; 
    const float yd = 1.0f; 
    const float zd = 1.0f; 

    const float testCubeVertices[] = 
    { 
    -xd, -yd, zd, xd, -yd, zd, -xd, yd, zd, // ABE 
    xd, -yd, zd, -xd, yd, zd, xd, yd, zd, // BEF 
    xd, -yd, zd, xd, -yd, -zd, xd, yd, zd, // BCF 
    xd, -yd, -zd, xd, yd, zd, xd, yd, -zd, // CFG 
    xd, -yd, -zd, -xd, -yd, -zd, xd, yd, -zd, // CDG 
    -xd, -yd, -zd, xd, yd, -zd, -xd, yd, -zd, // DGH 
    -xd, -yd, -zd, -xd, -yd, zd, -xd, yd, -zd, // DAH 
    -xd, -yd, zd, -xd, yd, -zd, -xd, yd, zd, // AHE 
    -xd, yd, zd, xd, yd, zd, -xd, yd, -zd, // EFH 
    xd, yd, zd, -xd, yd, -zd, xd, yd, -zd, // FHG 
    xd, -yd, zd, -xd, -yd, zd, xd, -yd, -zd, // BAC 
    -xd, -yd, zd, xd, -yd, -zd, -xd, -yd, -zd, // ACD 
    }; 

    for(int i=0;i<108;i=i+3) 
    vrtx.push_back(vec3(testCubeVertices[i],testCubeVertices[i+1],testCubeVertices[i+2])); 

    return vrtx; 
} 

vector<vec2> GetTestCubeUVs() 
{ 
    vector<vec2> uv; 

    const float testCubeUV[] = 
    { 
    0,0, 1,0, 0,1, // ABE 
    1,0, 0,1, 1,1, // BEF 
    0,0, 1,0, 0,1, // BCF 
    1,0, 0,1, 1,1, // CFG 
    0,0, 1,0, 0,1, // CDG 
    1,0, 0,1, 1,1, // DGH 
    0,0, 1,0, 0,1, // DAH 
    1,0, 0,1, 1,1, // AHE 
    0,0, 1,0, 0,1, // EFH 
    1,0, 0,1, 1,1, // FHG 
    0,0, 1,0, 0,1, // BAC 
    1,0, 0,1, 1,1, // ACD 
    }; 

    for(int i=0;i<72;i=i+2) 
    uv.push_back(vec2(testCubeUV[i],testCubeUV[i+1])); 

    return uv; 
} 

Ancora due domande LETTO SUPPLEMENTARE, mi hanno chiamata OpenGL:

glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE); 
  • Capisco che OpenGL gestisce r coordinare automaticamente, perché hanno le informazioni in costante GL_TEXTURE_CUBE_MAP_POSITIVE_X per glTexImage2D()?
  • È necessario modificare la coordinata r in Vertex Shader?

C'è schermata dei risultati al di sotto (disabile iscritto al buffer di profondità e non ha definito scalling, ma non è il mio problema ora):

enter image description here

ho notato che duplicato texture è quinta caricato texture (GL_TEXTURE_CUBE_MAP_POSITIVE_Z).

enter image description here

[EDIT LAST]: Si è verificato un problema con coordinate UV a Skybox VS (r coordinata ha un valore), Skybox VS dovrebbe essere, come qui sotto:

void main() 
{ 
    vCoords = normalize(vVertexPos); 
    gl_Position = MVP * vec4(vVertexPos,1.0); 
} 

C'è alcuni problemi con la tecnica Skybox, ma non erano argomenti di questo thread. Risolto.

+0

Cosa succede se non si utilizza il modello obj e invece di creare 6 quad in codice? –

+0

I vertici hardcoded e uvs nell'intestazione separata e c'è lo stesso problema. – CppMonster

risposta

5

Le mappe del cubo texture vengono mappate utilizzando una coordinata della trama 3D: viene utilizzata per determinare quale cubo del viso è effettivamente selezionato e quindi derivare la reale coordinata della trama 2D utilizzata per accedere al testo della faccia della mappa del cubo.

tue coordinate texture sono 2D (erroneamente), e in effetti si trama coordinate vertexUV (e conseguentemente vCoords) coordinata Z è sempre 0, mappatura non definitivamente tessitura (componenti mancanti sono copiati dal valore dell'attributo predefinito, cioè vec4 (0,0,0,1)).

per ottenere il risultato desiderato, modificare il vertex shader, al fine di utilizzare un meaninful coordinate:

vCoords = normalize(vVertexPos); 
+0

È vero, sto usando gli UV all'inizio e lo converto in UV. Ok suppongo di dover usare gli UV dall'inizio. Quindi da dove sto prendendo il terzo coord al tavolo UV? – CppMonster

+1

Vedere il codice sopra, dando una soluzione: dalla posizione del vertice (correttamente normalizzata). Il cubo deve avere il baricentro a (0,0,0). In questa condizione, puoi calcolarlo direttamente in vertex shader. – Luca

+0

Capisco che intendi qualche regola che devo seguire (non questa riga di codice). Quando scrivo questa linea su shader, interrompo la connessione con il flusso delle coordinate di texture (quindi in pratica non ho bisogno degli UV VBO). Ho provato ad alterare questa linea, il risultato è un quad con texture (ho usato un cubo baricentrico con i vertici harcoded sopra presentati). – CppMonster