2013-07-27 10 views
6

में क्यूब मैपिंग मैं स्काईबॉक्स प्रभाव प्राप्त करने के लिए 6 बिटमैप्स के साथ घन को मैप करने का प्रयास करता हूं। मेरी समस्या यह है कि एक बनावट घन के हर चेहरे पर मैपिंग कर रही है। मैंने gubeBugger में चेक किया है, घन बनावट मेमोरी में मेरे पास केवल एक छवि है (जैसा कि मैं छह छवियों को लोड करने का प्रयास करता हूं)।ओपनजीएल

कोड की तैयारी बनावट:

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

वी.एस.:

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

एफएस:

#version 330 core 

in vec3 vCoords; 
uniform samplerCube cube; 

out vec4 vFragColor; 

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

OBJ फ़ाइल:

# 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 


मेरे सवालों का:

  • तकनीक मैं इस कोड में उपयोग ठीक लग रहा है कर रहे हैं?
  • क्यूब के लिए मैक्सिंग कैसे हैं (GL_TEXTURE_CUBE_MAP बनावट में), जब केवल 2 यूवी है? (मेरा मतलब सामान्य है।)
  • क्या मैं इस स्थिति में यूवी की स्वचालित पीढ़ी का उपयोग कर सकता हूं (क्या मेरे पास शेडर में कई बदलाव करने के लिए है)?
  • क्या कोई मुझे सुझाव दे सकता है कि मैं किसी समस्या की खोज कहां कर सकता हूं? (कुछ संभावना के साथ; बफर, शेडर्स, मेष; केवल सुझाव)?

[संपादित करें]: मैं अलग स्रोत फ़ाइल में कोने और uvs हार्डकोड करने की कोशिश की और मैं घन के सभी चेहरे के लिए एक ही समस्या एक बनावट है।

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

फिर भी दो suplementary सवाल है, मैं ओपन कॉल कर सकते हैं: हार्डकोडेड डेटा सही प्रतीत हो रहा है

glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE); 
  • मैं समझता हूँ कि ओपन संभालती आर स्वचालित रूप से समन्वय, क्योंकि में जानकारी नहीं है glTexImage2D() के लिए निरंतर GL_TEXTURE_CUBE_MAP_POSITIVE_X?
  • क्या Vertex Shader में r समन्वय में कोई संशोधन आवश्यक है?

नीचे परिणाम स्क्रीन नहीं है (गहराई बफर करने के लिए विकलांग लेखन और scalling सेट नहीं किया है, लेकिन यह मेरी समस्या अब नहीं है):

enter image description here

मैंने देखा है कि बनावट पांचवें भरी हुई है दोहराया बनावट (GL_TEXTURE_CUBE_MAP_POSITIVE_Z)।

enter image description here

[अंतिम संपादन]: यूवी के साथ समस्या यह Skybox वी.एस. में निर्देशांक (आर समन्वय एक महत्व है), Skybox वी.एस. होना चाहिए, जैसा कि नीचे थी:

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

नहीं है स्काईबॉक्स तकनीक के साथ कुछ मुद्दे, लेकिन वे इस धागे का विषय नहीं थे। हल किया।

+0

अगर आप मॉडल .obj का उपयोग नहीं करते हैं और इसके बजाय कोड में 6 quads बनाने क्या होता है? –

+0

मैंने अलग-अलग शीर्षलेख में हार्डकोड और यूवी हार्डकोड किया और वही समस्या है। – CppMonster

उत्तर

5

बनावट घन मानचित्रों को 3 डी बनावट समन्वय का उपयोग करके मैप किया जाता है: यह निर्धारित करने के लिए प्रयोग किया जाता है कि कौन सा चेहरा घन वास्तव में चुना जाता है, और फिर क्यूब मैप चेहरे टेक्स्टेल तक पहुंचने के लिए उपयोग किए जाने वाले वास्तविक 2 डी बनावट समन्वय प्राप्त करते हैं।

आपका बनावट निर्देशांक 2 डी (गलत तरीके से) कर रहे हैं, और वास्तव में आप समन्वय vertexUV (और फलस्वरूप vCoords) बनावट जेड समन्वय, हमेशा 0 है मानचित्रण गैर निश्चित बनावट (लापता घटक डिफ़ॉल्ट विशेषता मान द्वारा कॉपी कर रहे हैं, कि vec4 है (0,0,0,1))।

वांछित परिणाम प्राप्त करने के लिए, का उपयोग करने हेतु शीर्ष शेडर संशोधित एक meaninful समन्वय:

vCoords = normalize(vVertexPos); 
+0

यह सच है, मैं भिखारी पर यूवी का उपयोग कर रहा हूं और मैं इसे यूवी में परिवर्तित कर रहा हूं। ठीक है मुझे लगता है कि मुझे भिखारी से यूवी का उपयोग करना होगा। तो जहां से मैं यूवी तालिका में तीसरा समन्वय ले रहा हूं? – CppMonster

+1

ऊपर दिए गए कोड को देखें, एक समाधान दें: कशेरुक स्थिति से (ठीक से सामान्यीकृत)। घन में (0,0,0) पर बैरिएंटर होना चाहिए। इस स्थिति में, आप इसे सीधे वर्टेक्स शेडर में गणना कर सकते हैं। – Luca

+0

मैं समझता हूं कि आपका मतलब है कि मुझे कुछ नियमों का पालन करना है (कोड की इस पंक्ति नहीं)। जब मैं शेडर को यह लाइन लिखता हूं, तो मैंने बनावट समन्वय धारा के साथ कनेक्शन तोड़ दिया (इसलिए मूल रूप से मुझे वीबीओ यूवी की आवश्यकता नहीं है)। मैंने इस लाइन को बदलने की कोशिश की, परिणाम बनावट के साथ एक चौथाई है (मैंने उपरोक्त प्रस्तुत हार्कोड किए गए क्यूबिस के साथ बैरिएंटर क्यूब का उपयोग किया)। – CppMonster