C ++:从openGL去除摩尔纹效果 [英] C++: Removing Moire effect from openGL
问题描述
我绘制的图案具有详细的像素,并且经常会遇到莫尔效应.我不擅长着色,我不确定着色器是否可以解决此问题.我还没有找到任何基本的,可理解的和完整的着色器示例.大多数教程网站都从中间开始一个程序,省略了头文件包括的内容!
这是我代码的MWE.是否可以减轻或消除莫尔效应?
#include< cmath>#include< vector>#ifdef __APPLE__#include< GLUT/glut.h>#别的#include< GL/glut.h>#万一const int w = 640,h = 480;浮动cam_angle = 0.0f;无效的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);}无效的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);结构Point3D{x,y,z的两倍;无符号字符r,g,b,a = 255;};for(双倍r = 0.5; r <= 1.0; r + = 0.03){std :: vector< Point3D>点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);}//画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/*值*/){cam_angle + = 0.01f;glutPostRedisplay();//100毫秒glutTimerFunc(100,计时器,0);}int main(int argc,char ** argv){glutInit(& argc,argv);glutInitWindowSize(w,h);glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);glutInitWindowPosition(100,100);glutCreateWindow(我的窗口");glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);在里面();glutDisplayFunc(onDisplay);计时器(0);glutMainLoop();返回0;}
如果使用
带有 GLUT_MULTISAMPLE
:
另请参见 GLUT + OpenGL多采样抗锯齿(MSAA) 答案>>
I draw patterns which have detailed pixels and they often face with Moire effect. I am not good at shading and I am not sure if this problem will be solved by shaders. I have not found any basic, understandable and complete example of shaders. Most of the tutorial websites start a program from the middle omitting the header file includes!
This is a MWE of my code. Is it possible to mitigate or remove the Moire effect from it?
#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;
}
If you use Multisampling, then the result will be significantly improved:
glutSetOption(GLUT_MULTISAMPLE, 8);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE);
without GLUT_MULTISAMPLE
:
with GLUT_MULTISAMPLE
:
See also the answer to GLUT + OpenGL multisampling anti aliasing (MSAA)
这篇关于C ++:从openGL去除摩尔纹效果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!