C ++: removing moire effect from openGL

I draw patterns that have detailed pixels, and they often come across a moire effect. I'm not good at shading, and I'm not sure if this problem will be solved by shaders. I did not find a basic, understandable and complete example of shaders. Most training sites run the program from the middle, omitting the file header!

This is the MWE of my code. Is it possible to soften or remove the moire effect?

#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; px=r*sin(theta); py=r*cos(theta); pz=r; pr=128; pg=200; pb=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

+5
source share
1 answer

If you use Multisampling , the result will be greatly improved:

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

without GLUT_MULTISAMPLE :
enter image description here

with GLUT_MULTISAMPLE :
enter image description here


See Also Response to GLUT + OpenGL Multisampling Smoothing (MSAA)

+5
source

Source: https://habr.com/ru/post/1272068/


All Articles