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;
}
(더블 R = 0.5, R <= 1.0, R + = 0.03)에 대한이 루프 '에 또한 응답'컴파일러에 따라 동일한 횟수 실행되도록 보장되지 않으므로, 컴파일러 설정 등. 부동 소수점은 정확하지 않으므로 0.03에서 0.5를 추가하면 정확하지 않은 숫자가 생성되고 각 반복에서 오류가 누적됩니다. 부동 소수점이 아닌 루프 카운터로 정수를 사용하십시오. – PaulMcKenzie
@PaulMcKenzie. 그것은 중요하지 않습니다. 모든 시나리오가 결국 모아레 효과로 이어집니다. – ar2015
해상도와 위치 - 기간이 디스플레이 해상도 근처에있는 상세한 픽셀 패턴을 표시하는 경우 미세 조정 된 내용 (예 : 선이 교차하지 않고 픽셀 단위로 "스테핑"슬로프가 없음)은 무료입니다. 물결 무늬. 픽셀 정밀도와 몇 가지 색상을 고집하는 한 문제를 해결할 수 없습니다. 해결책은 (만족스럽지는 않지만) 내용을 변경하거나 앤티 앨리어싱을 시작하여 "예리한"및 "정확한"인상과 비교하여 때로는 "씻겨 나갔다"또는 "흐려진"효과로 살 수 있습니다. 단일 컬러 픽셀의 – Yunnosch