2017-09-24 10 views
5

से मूर प्रभाव को हटाकर मैं उन पैटर्नों को खींचता हूं जिनमें विस्तृत पिक्सेल हैं और वे अक्सर मूर प्रभाव के साथ सामना करते हैं। मैं छायांकन में अच्छा नहीं हूं और मुझे यकीन नहीं है कि क्या इस समस्या को शेडर्स द्वारा हल किया जाएगा। मुझे शेडरों का कोई बुनियादी, समझने योग्य और पूर्ण उदाहरण नहीं मिला है। अधिकांश ट्यूटोरियल वेबसाइटें हेडर फ़ाइल को छोड़कर बीच से एक प्रोग्राम शुरू करती हैं!सी ++: ओपनजीएल

यह मेरे कोड का एक MWE है। क्या इससे मूर प्रभाव को कम करना या हटाना संभव है?

#include <cmath> 
#include <vector> 

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

const int w=640,h=480; 
float cam_angle=0.0f; 

void init() 
{ 
    GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat LightDiffuse[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
    GLfloat LightPosition[] = { 5.0f, 5.0f, -10.0f, 1.0f }; 

    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_DEPTH_TEST); 
    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); 
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); 
    glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); 
    glEnable(GL_LIGHT1); 
} 

void onDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective (90, float(w)/float(h), 0.01, 10000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    const double pi=3.1415926; 
    double cam_x=2.0*cos(pi/4.0)*cos(cam_angle);; 
    double cam_y=2.0*sin(pi/4.0)*cos(cam_angle);; 
    double cam_z=2.0*sin(cam_angle); 
    gluLookAt(cam_x, cam_y, cam_z, 0, 0, 0, 0, 0, 1); 

    struct Point3D 
    { 
     double x, y, z; 
     unsigned char r, g, b, a=255; 
    }; 

    for(double r=0.5;r<=1.0;r+=0.03) 
    { 
     std::vector<Point3D> points; 
     for(int i=0;i<1000;i++) 
     { 
      double theta=double(i)/1000.0*pi*2.0; 
      Point3D p; 
      p.x=r*sin(theta); 
      p.y=r*cos(theta); 
      p.z=r; 
      p.r=128; 
      p.g=200; 
      p.b=50; 
      points.push_back(p); 
     } 
    // draw 
     glPushMatrix(); 
     glColor3ub(255,255,255); 
     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 
     glVertexPointer(3, GL_DOUBLE, sizeof(Point3D), &points[0].x); 
     glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Point3D), &points[0].r); 
     // glPointSize(3.0); 
     glLineWidth(2.0); 
     glDrawArrays(GL_LINE_STRIP, 0, int(points.size())); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glPopMatrix(); 
    } 

    glFlush(); 
    glutSwapBuffers(); 
} 

void Timer(int /*value*/) 
{ 
    cam_angle+=0.01f; 
    glutPostRedisplay(); 
    // 100 milliseconds 
    glutTimerFunc(100, Timer, 0); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitWindowSize (w, h); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("my window"); 
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_BLEND); 

    init(); 
    glutDisplayFunc(onDisplay); 
    Timer(0); 
    glutMainLoop(); 

    return 0; 
} 

Moire effect

+0

(डबल r = 0.5; r <= 1.0; r + = 0.03) के लिए यह पाश '' का जवाब संकलक पर निर्भर करता है समय की एक ही नंबर को चलाने के लिए इसकी गारंटी नहीं है, संकलक सेटिंग्स, इत्यादि। फ़्लोटिंग पॉइंट सटीक नहीं है, इस प्रकार 0.03 से 0.5 जोड़ना एक अचूक संख्या उत्पन्न करेगा और त्रुटि प्रत्येक पुनरावृत्ति पर जमा होगी। फ्लोटिंग पॉइंट नहीं, लूप काउंटर के रूप में पूर्णांक का उपयोग करें। – PaulMcKenzie

+0

@PaulMcKenzie। यह मायने नहीं रखता। अंततः सभी परिदृश्य मोर प्रभाव को जन्म देते हैं। – ar2015

+1

यदि आप डिस्प्ले रेज़ोल्यूशन के पास एक रिज़ॉल्यूशन और लोकेशन-अवधि के साथ विस्तृत पिक्सेल पैटर्न प्रदर्शित करते हैं, तो केवल ठीक ट्यून की गई सामग्री (उदाहरण के लिए लाइनों को पार नहीं करना, पिक्सेल-वार "स्टेपिंग" ढलान नहीं है ....) से मुक्त होगा मौआ। जब तक आप पिक्सेल-परिशुद्धता और कुछ रंगों के साथ चिपके रहते हैं तब तक आप समस्या को हल नहीं कर सकते। समाधान (हालांकि संभवतः आप को संतुष्ट नहीं करता है) या तो सामग्री को बदलने या एंटी-एलाइजिंग शुरू करने और कभी-कभी "धोया हुआ" या "धुंधला" प्रभाव के साथ रहते हैं, दोनों "तेज" और "सटीक" इंप्रेशन की तुलना में एकल रंगीन पिक्सल का। – Yunnosch

उत्तर

5

आप Multisampling उपयोग करते हैं, तो परिणाम में काफी सुधार किया जाएगा:

glutSetOption(GLUT_MULTISAMPLE, 8); 
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE); 

बिना GLUT_MULTISAMPLE:
enter image description here

GLUT_MULTISAMPLE साथ:
enter image description here


भी देखें GLUT + OpenGL multisampling anti aliasing (MSAA)