2011-05-22 16 views
6

यहां मेरे द्वारा एक सरल ओपनग्ल प्रोग्राम है। मैं त्रिकोण खींचने से पहले स्क्रीन साफ़ करने की कोशिश कर रहा हूं। मैंने अपने init() फ़ंक्शन में glClear() कहा है, हालांकि, ऐसा लगता है कि यह स्क्रीन को साफ़ करने में विफल रहा।क्यों GlClear मेरी स्क्रीन साफ़ नहीं करता है?

#include <stdio.h> 
#include <stdlib.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

void myIdleFunc() 
{ 
    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 

    usleep(1000000); 
} 

void init() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow("Hello, World!"); 

    init(); 

    glutIdleFunc(myIdleFunc); 
    glutMainLoop(); 
    return 1; 
} 

यहां एक स्क्रीन शॉट है, पाठ बैक ग्राउंड में gnome टर्मिनल से है।

enter image description here

+8

कि वास्तव में बहुत अच्छा लग रहा है। शायद आपको इसे छोड़ देना चाहिए :) –

उत्तर

4

अपने प्रदर्शन कॉलबैक कहां है? आपको ड्राइंग के लिए निष्क्रिय कार्य का उपयोग नहीं करना चाहिए।

सभी ड्राइंग उचित कॉलबैक में होने की आवश्यकता है, जीएल संदर्भ glutMainLoop तक सक्रिय नहीं हो सकता है, और कोई सक्रिय संदर्भ के साथ, आपके आदेशों को आसानी से अनदेखा कर दिया जाता है (संदर्भ के बिना, यहां तक ​​कि एक जगह भी नहीं हो सकती है glGetError के साथ पुनर्प्राप्ति के लिए त्रुटियों को संग्रहीत करने के लिए)।

नोट: आमतौर पर आप हर फ्रेम की शुरुआत में बफर साफ़ करना चाहते हैं। आप एकल-बफरिंग के साथ केवल एक बार समाशोधन से दूर हो सकते हैं, लेकिन डबल-बफरिंग बेहतर है और आपको प्रत्येक स्वैप के बीच पूरे क्षेत्र को किसी भी तरह प्रस्तुत करने की आवश्यकता होती है।

+0

धन्यवाद। ड्राइंग के लिए निष्क्रिय कार्य का उपयोग क्यों नहीं करें? मेरा मतलब है कि मुझे बार-बार इस त्रिकोण को आकर्षित करने की आवश्यकता है। क्या डिस्प्ले फ़ंक्शन ड्राइंग नहीं करता है जब कुछ खास नहीं होता है? – trVoldemort

+0

@tr: मुझे पता नहीं है, मैं जीएलयूटी का उपयोग नहीं करता हूं। लेकिन असफल होने वाला कोड किसी भी कॉलबैक में नहीं है, इससे पहले कि जीएलयूटी ने अपना लूप शुरू कर दिया हो, इसलिए जीएल उपयोग करने के लिए तैयार नहीं हो सकता है। –

+0

संदर्भ बनाया है और glutCreateWindow में और नहीं glutMainLoop में actived हो जाता है। तो उसका कोड काम करता है (लेकिन जैसा कि वह इरादा नहीं है)। –

0

मैं यह है की तरह कुछ प्रदर्शित करने के लिए भरमार लेकिन एक बहुत आसान तरीका उपयोग नहीं करते:

while(!done) { /* Loop until done. Do drawing. */  

    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    glBegin(GL_TRIANGLES); 
    { 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glVertex2f(-1.0f, -1.0f); 
     glVertex2f(1.0f, -1.0f); 
    } 
    glEnd(); 

    glFlush(); 
    SwapBuffers(); 

    etc... event handling.... 
} 
1

आपकी समस्या है, कि आप अपने प्रवर्तन कोड में स्क्रीन स्पष्ट है। लेकिन आपको इसे प्रत्येक फ्रेम को साफ़ करने की आवश्यकता है, इसलिए अपने प्रदर्शन (या आपके मामले में निष्क्रिय) फ़ंक्शन की शुरुआत में।

0

इस कोड को चलाने और शायद आप समाधान मिल जाएगा।

#include<GL/gl.h> 
#include<GL/glut.h> 
#include<stdio.h> 

double x_0 = -100; 
double y_0 = -25; 

double x_1 = 100; 
double y_1 = -25; 

double x_2 = 100; 
double y_2 = 25; 

double x_3 = -100; 
double y_3 = 25; 

void 
init(void) 
{ 
    /*initialize the x-y co-ordinate*/ 
    glClearColor(0,0,0,0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-320, 319,-240, 239); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glFlush(); 
} 

void 
drawRectangle() 
{ 
    glBegin(GL_LINES); 

    glVertex2d(x_0, y_0); 
    glVertex2d(x_1, y_1); 

    glVertex2d(x_1, y_1); 
    glVertex2d(x_2, y_2); 

    glVertex2d(x_2, y_2); 
    glVertex2d(x_3, y_3); 

    glVertex2d(x_3, y_3); 
    glVertex2d(x_0, y_0); 

    glEnd(); 
    glFlush(); 
} 

int 
main(int argc, char *argv[]) 
{ 
    double x_0, y_0, x_1, y_1; 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); 
    glutInitWindowPosition(400, 400); 

    glutCreateWindow("Clear Screen"); 
    init(); 
    drawRectangle(); 
    /* clear the screen. You can uncomment following three lines to view the effect of clearing */ 
// glClearColor(0, 0, 0, 0); 
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// /* don't forget to flush */ 
// glFlush(); 
    /***/ 
    glutMainLoop(); 
} 

संकलित करें और चलाने -

gcc file.c -lglut -lGLU -lGL 
./a.out 
संबंधित मुद्दे