2017-09-24 7 views
5

자세한 픽셀을 가진 패턴을 그립니다. 자주 모아레 효과가 있습니다. 음영이 좋지 않아서이 문제가 쉐이더에 의해 해결되는지 확신 할 수 없습니다. 나는 셰이더의 기본적이고, 이해할 수 있고 완전한 예제를 발견하지 못했다. 튜토리얼 웹 사이트의 대부분은 헤더 파일을 제외하고 중간에서 프로그램을 시작합니다!C++ : openGL에서 모아레 효과 제거

이것은 내 코드의 MWE입니다. Moire 효과를 완화하거나 제거 할 수 있습니까? 당신이 Multisampling를 사용하는 경우

#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

답변