2012-12-04 7 views
6

के बिना OpenGL में किसी अन्य के शीर्ष पर एक पंक्ति को कैसे आकर्षित करें मुझे निम्न समस्या है। जबकि glPolygonOffset मेष के लिए पूरी तरह से काम करता है, उदाहरण के लिए जब मैं ऑब्जेक्ट के शीर्ष पर वायरफ़्रेम रूपरेखा खींचने की कोशिश कर रहा हूं, तो यह सरल रेखाओं के लिए काम नहीं करता है।जेड-फाइटिंग

यहाँ कैसे यह meshes के लिए काम करता है:

// draw object 
mTexture.enableAndBind(); 
gl::color(Colorf(1, 1, 1)); 
gl::draw(mVboMesh); 
mTexture.unbind(); 

// overlay wireframe 
gl::enableWireframe(); 
glLineWidth(1); 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 
glColor3f(0, 0, 1); 
gl::draw(mVboMesh); 
glDisable(GL_POLYGON_OFFSET_LINE); 
gl::disableWireframe(); 

mesh

किसी कारण यह लाइनों के लिए काम नहीं करता है। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह एक ग्रिड पर एक समन्वय फ्रेम के तीर खींचना है। मैं उसी GL_POLYGON_OFFSET_LINE मोड का उपयोग कर रहा हूं जब मैं लाइनों को चित्रित कर रहा था, जैसे कि मैं ऑब्जेक्ट पर वायरफ़्रेम के लिए कर रहा था। हालांकि इस मामले में glPolygonOffset(-1, -1); बिल्कुल कोई फर्क नहीं पड़ता है। मैंने इसे 100 जैसे विशाल मूल्यों से आजमाया है और यह वही है। बिल्कुल कोई प्रभाव नहीं।

// enable 3D rendering 
gl::enable(GL_CULL_FACE); 
gl::enableDepthRead(); 
gl::enableDepthWrite(); 

// drawing the grid 
int size = 2000; 
int step = 25; 
gl::color(Colorf(0.2f, 0.2f, 0.2f)); 
for(float i = -size; i <= size; i += step) 
{ 
    glBegin(GL_LINES); 
    glVertex3f(i, 0, -size); 
    glVertex3f(i, 0, size); 
    glVertex3f(-size, 0, i); 
    glVertex3f(size, 0, i); 
    glEnd(); 
} 

// drawing the arrows 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 

glBegin(GL_LINES); 
gl::color(Colorf(1, 0, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(100, 0, 0); 
gl::color(Colorf(0, 1, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 100, 0); 
gl::color(Colorf(0, 0, 1)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 0, 100); 
glEnd(); 

glDisable(GL_POLYGON_OFFSET_LINE); 

// disable 3D rendering 
gl::disableDepthWrite(); 
gl::disableDepthRead(); 
gl::disable(GL_CULL_FACE); 

और Z- फ़ाइटिंग मैं का एक उदाहरण:

lines

एक हैक मैं कोशिश की है और क्या पूरी तरह से काम किया है:

यहाँ मैं क्या कर रहा है
  1. अक्षम गहराई पढ़ा, सक्षम गहराई लिखने
  2. ड्रा ग्रिड
  3. ड्रा तीर
  4. गहराई पढ़
  5. अन्य वस्तुओं

हालांकि यह एक बहुत ही विशेष मामला है और जब तक यह एक फ्लैट ग्रिड और तीर के लिए काम करता है, इसके साथ कुछ और काफी कुछ भी के लिए काम नहीं करेगा आकर्षित करने के लिए सक्षम एक जटिल आकार।

मेरे प्रश्न हैं:

  1. क्यों glPolygonOffset लाइनों-लाइनों पर के लिए काम नहीं करता है, जबकि यह लाइनों-ऑन-बहुभुज के लिए काम करता है?
  2. उपरोक्त हैक का उपयोग किए बिना, मैं इसे कैसे ठीक कर सकता हूं, केवल विशिष्ट मामलों में क्या काम करता है?

// मैं एक ढांचे के रूप में भस्म का उपयोग कर रहा है, लेकिन जब से मैं कच्चे ओपन उपयोग कर रहा हूँ इससे कोई फर्क नहीं करना चाहिए आदेश

अद्यतन

मैं जवाब देख लिया है पहली टिप्पणी में, और उस विधि को भी आजमाया, हालांकि कोई भी काम नहीं करता है, क्योंकि परिणाम कैमरे से दूरी पर निर्भर करता है।

//// draw coordinate frame and grid 
glDepthRange (0.01, 1.0); 
drawGrid(2000.0f, 25.0f); 
glDepthRange (0.0, 0.99); 
gl::drawCoordinateFrame(100.0f, 5.0f, 2.0f); 

glDepthRange (0.0, 1.0); 

// draw object 

mix

+1

लाइनों के साथ [glpolygonOffset() बग के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with- लाइनों) – genpfault

उत्तर

3

मुझे लगता है कि एक हैक लाइन बस थोड़ा दृष्टिकोण के करीब आकर्षित करने के लिए हो सकता है (के 0.1 करीब मान लीजिए)। यह ज़ेड-लड़ाकू से बचना चाहिए।

ऐसा करने के लिए, आप अपने बिंदु से पीओवी स्थिति में सामान्यीकृत दिशात्मक वेक्टर की गणना करते हैं। फिर आप इसे एक छोटे कारक के साथ स्केल करते हैं, और इसे

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^