2012-07-05 20 views
7

मैंने एक चित्रकला कार्यक्रम बनाया है। जैसा कि मैंने उम्मीद की सब कुछ काम करता है। लेकिन ड्राइंग करते समय, कभी-कभी कुछ अजीब चीजें होती हैं।glDrawArrays सही ढंग से ड्राइंग नहीं कर रहे हैं

मैं ऐप चलाता हूं, और छवि पर बाएं माउस बटन दबाता हूं। इसे कोड से बिंदु खींचा जाना चाहिए:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, brushTextura); 
glPointSize(100); 
glVertexPointer(2, GL_FLOAT, 0,GLVertices); 
glDrawArrays(GL_POINTS, 0, count); 
glDisableClientState(GL_VERTEX_ARRAY); 

बिंदु पर जहां मैं दबाता हूं। mouseDown रजिस्ट्रार माउसडाउन स्थान, इसे NSValue में परिवर्तित करता है, सरणी भेजता है, और फिर ड्राइंग से पहले मैं NSValue को CGPoint पर निकालता हूं और इसे GLfloat पर भेजता हूं ताकि इसे glDrawArrays द्वारा खींचा जा सके। लेकिन इससे कोई फर्क नहीं पड़ता कि मैं छवि पर माउस पर क्लिक करता हूं, यह निर्देशांक (0,0) पर बिंदु खींचता है। उसके बाद हर चीज ठीक काम करती है। छवि देखें:

mouse click

यह पहली समस्या थी। दूसरी समस्या यह है कि जब मैं इसके साथ पेंट करता हूं (ड्रैग दबाया माउस), कभी-कभी बिंदु दिखाई देते हैं जहां उन्हें खींचा नहीं जाता है। छवि:

mouse drag

जब मैं खींचें जारी रखने के लिए यह गायब हो जाता है। कुछ खींचने के बाद यह फिर से दिखाई देता है और फिर गायब हो जाता है। और इसी तरह। छवि:

enter image description here

किसी भी विचार यह क्यों हो सकता है? मैं कोड bellow पोस्ट करेंगे:


नीचे माउस:

- (void) mouseDown:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

माउस घसीटा:

- (void) mouseDragged:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

आहरण:

- (void) drawing { 
int count = [vertices count] * 2; 
NSLog(@"count: %d", count); 
int currIndex = 0; 
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat)); 
for (NSValue *locationValue in vertices) { 
    CGPoint loc = locationValue.pointValue; 
    GLVertices[currIndex++] = loc.x; 
    GLVertices[currIndex++] = loc.y;  
} 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, brushTextura); 
glPointSize(100); 
glVertexPointer(2, GL_FLOAT, 0, GLVertices); 
glDrawArrays(GL_POINTS, 0, count); 
glDisableClientState(GL_VERTEX_ARRAY); 
} 

उत्तर

6

आप अपने count चर [vertices count] * 2 को (glDrawArrays में इस्तेमाल एक) है, जो अजीब लगता है की स्थापना कर रहे हैं।

glDrawArrays पर अंतिम तर्क ड्रॉ करने के लिए शीर्षकों की संख्या है, जबकि आपके कोड में ऐसा लगता है कि आप इसे संख्या को दोगुना करने के लिए सेट कर रहे हैं (शायद आपको लगता है कि यह फ्लोट्स की संख्या है?), जिसका अर्थ है कि आप सिर्फ बकवास कर रहे हैं पहले count शिखर के बाद।

+0

तो मैं इसे करने के लिए बदल '[ शिखर गिनती] ', तो जब मैं ड्राइंग शुरू करता हूं तो यह टूट जाता है। कुछ बिंदु ठीक से खींचे जा रहे हैं, और इसके बाद यह त्रुटि दिखाता है: 'थ्रेड 1: EXC_BAD_ACCESS (कोड = 13, एड्रेस = 0x0)' glDrawArrays (GL_POINTS, 0, गिनती) पर; 'या' NSValue * locationValue = [NSValue पर valueWithPoint: vieta]; 'त्रुटि 'थ्रेड 1: सिग्नल सिग्बेट'। एक बार एक त्रुटि, दूसरी बार अन्य त्रुटि। मुझे नहीं पता क्यों, लेकिन त्रुटि हर समय – hockeyman

+0

समान नहीं है और कभी-कभी ब्रेक पर यह कंसोल में संदेश दिखाती है: 'ओजीएल (896,0x7fff79c93960) malloc: *** ऑब्जेक्ट 0x100151a98 के लिए त्रुटि: मुक्त ऑब्जेक्ट के लिए गलत चेकसम - ऑब्जेक्ट को मुक्त होने के बाद शायद संशोधित किया गया था। *** – hockeyman

+0

डीबग करने के लिए malloc_error_break में ब्रेकपॉइंट सेट करें @ जूलियस पेट्रास्का कारण शायद आप इसे 'GLVertices' के लिए 'malloc' में भी उपयोग करते हैं, इसलिए वर्टेक्स सरणी बहुत छोटी है और आप एक बार फिर बहुत सारे कोड्स पढ़ रहे हैं (केवल इस बार एक दुर्घटना के परिणामस्वरूप)। बेशक 'GLVertices' सरणी का आकार' [चरम गणना] * 2' होना चाहिए, क्योंकि इसमें प्रत्येक चरम के लिए 2 फ्लोट हैं। लेकिन फिर आपको 'gldrawArrays' में केवल' [चरम गिनती] 'पूर्ण शिखर खींचना होगा। –

0

glDrawArrays को तर्क के रूप में परिभाषित किया जाता है (जीएलनम मोड, जीलिंट पहले, जीएलएसईसीई देश टी)।

दूसरे तर्क ड्राइंग के दौरान उपयोग किए गए वर्टेक्स विशेषताओं की पहली अनुक्रमणिका को परिभाषित करते हैं। आप पहली इंडेक्स के रूप में 1 गुजर रहे हैं जो आपके वर्टेक्स निर्देशांक को अनमच बनाता है। मुझे लगता है कि आप वहां 0 चाहते हैं।

http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml

+0

कोई फर्क नहीं पड़ता अपने 1 या 0. ही rezult हर समय – hockeyman

1

तथ्य यह है कि आपके द्वारा क्लिक किए गए सटीक स्थान पर शिखर को प्रस्तुत नहीं किया जाना चाहिए समस्या यह है कि आपने दृश्य के भीतर हिट पॉइंट को सही ढंग से निर्धारित नहीं किया है।

आपका कोड है:

location = [self convertPoint: [event locationInWindow] fromView: self]; 

जो देखने के लिए, एक ही दृश्य के निर्देशांक (स्वयं) को उसके निर्देशांकों (स्वयं) से बात कन्वर्ट करने के लिए भले ही बिंदु वास्तव में खिड़की के सापेक्ष है बताता है।

देखने के लिए खिड़की के निर्देशांक से बात बदलने के लिए, करने के लिए कि लाइन बदलने के निम्नलिखित:

location = [self convertPoint: [event locationInWindow] fromView: nil]; 
संबंधित मुद्दे