मैंने एक चित्रकला कार्यक्रम बनाया है। जैसा कि मैंने उम्मीद की सब कुछ काम करता है। लेकिन ड्राइंग करते समय, कभी-कभी कुछ अजीब चीजें होती हैं।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) पर बिंदु खींचता है। उसके बाद हर चीज ठीक काम करती है। छवि देखें:
यह पहली समस्या थी। दूसरी समस्या यह है कि जब मैं इसके साथ पेंट करता हूं (ड्रैग दबाया माउस), कभी-कभी बिंदु दिखाई देते हैं जहां उन्हें खींचा नहीं जाता है। छवि:
जब मैं खींचें जारी रखने के लिए यह गायब हो जाता है। कुछ खींचने के बाद यह फिर से दिखाई देता है और फिर गायब हो जाता है। और इसी तरह। छवि:
किसी भी विचार यह क्यों हो सकता है? मैं कोड 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);
}
तो मैं इसे करने के लिए बदल '[ शिखर गिनती] ', तो जब मैं ड्राइंग शुरू करता हूं तो यह टूट जाता है। कुछ बिंदु ठीक से खींचे जा रहे हैं, और इसके बाद यह त्रुटि दिखाता है: 'थ्रेड 1: EXC_BAD_ACCESS (कोड = 13, एड्रेस = 0x0)' glDrawArrays (GL_POINTS, 0, गिनती) पर; 'या' NSValue * locationValue = [NSValue पर valueWithPoint: vieta]; 'त्रुटि 'थ्रेड 1: सिग्नल सिग्बेट'। एक बार एक त्रुटि, दूसरी बार अन्य त्रुटि। मुझे नहीं पता क्यों, लेकिन त्रुटि हर समय – hockeyman
समान नहीं है और कभी-कभी ब्रेक पर यह कंसोल में संदेश दिखाती है: 'ओजीएल (896,0x7fff79c93960) malloc: *** ऑब्जेक्ट 0x100151a98 के लिए त्रुटि: मुक्त ऑब्जेक्ट के लिए गलत चेकसम - ऑब्जेक्ट को मुक्त होने के बाद शायद संशोधित किया गया था। *** – hockeyman
डीबग करने के लिए malloc_error_break में ब्रेकपॉइंट सेट करें @ जूलियस पेट्रास्का कारण शायद आप इसे 'GLVertices' के लिए 'malloc' में भी उपयोग करते हैं, इसलिए वर्टेक्स सरणी बहुत छोटी है और आप एक बार फिर बहुत सारे कोड्स पढ़ रहे हैं (केवल इस बार एक दुर्घटना के परिणामस्वरूप)। बेशक 'GLVertices' सरणी का आकार' [चरम गणना] * 2' होना चाहिए, क्योंकि इसमें प्रत्येक चरम के लिए 2 फ्लोट हैं। लेकिन फिर आपको 'gldrawArrays' में केवल' [चरम गिनती] 'पूर्ण शिखर खींचना होगा। –