有没有简单例子 关于 使用累积缓存对场景进行反走样处理??? OpenGL

Gold2000 2005-10-14 11:07:13
rt

lkj99@126.com
...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gold2000 2005-10-15
  • 打赏
  • 举报
回复
谢谢 happy__888([顾问团]寻开心)

您是在哪里高就?
寻开心 2005-10-14
  • 打赏
  • 举报
回复
上面的代码就是从opengl.org上面找到的,你可以上去找有无适合你的代码
Gold2000 2005-10-14
  • 打赏
  • 举报
回复
对,你讲的对!多谢

你的代码我得转换一下,赫赫,我不是做C的!
寻开心 2005-10-14
  • 打赏
  • 举报
回复
#include <GL/gl.h>
#include <GL/glut.h>
enum {CONV_NONE,
CONV_BOX_3X3,
CONV_BOX_5X5,
CONV_SOBEL_X,
CONV_LAPLACE
};
typedef struct {
GLfloat scale;
GLfloat bias;
int rows;
int cols;
GLfloat *array;
} Filter;

Filter *curmat;
void
identity(Filter *mat)
{
int n, size;
size = mat->rows * mat->cols;
mat->array[0] = 1.f;
for(n = 1; n < size; n++)
mat->array[n] = 0.f;

mat->scale = 1.f;
mat->bias = 0.f;
}
Filter *
newfilter(int rows, int cols)
{
Filter *mat;

mat = (Filter *)malloc(sizeof(Filter));
mat->rows = rows;
mat->cols = cols;
mat->array = (GLfloat *)malloc(rows * cols * sizeof(GLfloat));
identity(mat);

return mat;
}
void
resize(Filter *mat, int rows, int cols)
{
if(mat->rows != rows ||
mat->cols != cols) {
free(mat->array);
mat->array = (GLfloat *)realloc(mat->array, rows * cols * sizeof(GLfloat));
}
mat->rows = rows;
mat->cols = cols;
}
void
box(Filter *mat)
{
int n, count;
GLfloat blur;

count = mat->cols * mat->rows;
blur = 1.f/count;
for(n = 0; n < count; n++)
mat->array[n] = blur;

mat->scale = 1.f;
mat->bias = 0.f;
}

void
sobel(Filter *mat)
{
static GLfloat sobel[] = {-.5f, 0.f, .5f,-1.f, 0.f, 1.f,-.5f, 0.f, .5f};
resize(mat, 3, 3);
memcpy(mat->array, sobel, sizeof(sobel));
mat->scale = 2.f;
mat->bias = 0.f;
}

void
laplace(Filter *mat)
{
int n, size;
static GLfloat laplace[] = { 0.f, -.25f, 0.f,-.25f, 1.f, -.25f,0.f, -.25f, 0.f};
resize(mat, 3, 3);
memcpy(mat->array, laplace, sizeof(laplace));

mat->scale = 4.f;
mat->bias = .125f;
}

void menu(int filter)
{
switch(filter) {
case CONV_NONE:
resize(curmat, 1,1);
identity(curmat);
break;
case CONV_BOX_3X3:
resize(curmat, 3, 3);
box(curmat);
break;
case CONV_BOX_5X5:
resize(curmat, 5, 5);
box(curmat);
break;
case CONV_SOBEL_X:
sobel(curmat);
break;
case CONV_LAPLACE:
laplace(curmat);
break;
}
glutPostRedisplay();
}
int winWidth = 0;
int winHeight = 0;

void
reshape(int wid, int ht)
{
glViewport(0, 0, wid, ht);
winWidth = wid;
winHeight = ht;
}

void key(unsigned char key, int x, int y)
{
if(key == '\033')
exit(0);
}


GLfloat *make_texture(int maxs, int maxt)
{
int s, t;
static GLfloat *texture;

texture = (GLfloat *)malloc(maxs * maxt * sizeof(GLfloat));
for(t = 0; t < maxt; t++) {
for(s = 0; s < maxs; s++) {
texture[s + maxs * t] = ((s >> 4) & 0x1) ^ ((t >> 4) & 0x1);
}
}
return texture;
}

enum {SPHERE = 1, CONE};

void
render(void)
{
static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};

glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);


glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glNormal3f(0.f, 1.f, 0.f);
glTexCoord2i(0, 0);
glVertex3f(-100.f, -100.f, -320.f);
glTexCoord2i(1, 0);
glVertex3f( 100.f, -100.f, -320.f);
glTexCoord2i(1, 1);
glVertex3f( 100.f, -100.f, -520.f);
glTexCoord2i(0, 1);
glVertex3f(-100.f, -100.f, -520.f);
glEnd();

glDisable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glNormal3f(1.f, 0.f, 0.f);
glVertex3f(-100.f, -100.f, -320.f);
glVertex3f(-100.f, -100.f, -520.f);
glVertex3f(-100.f, 100.f, -520.f);
glVertex3f(-100.f, 100.f, -320.f);

glNormal3f(-1.f, 0.f, 0.f);
glVertex3f( 100.f, -100.f, -320.f);
glVertex3f( 100.f, 100.f, -320.f);
glVertex3f( 100.f, 100.f, -520.f);
glVertex3f( 100.f, -100.f, -520.f);
glNormal3f(0.f, -1.f, 0.f);
glVertex3f(-100.f, 100.f, -320.f);
glVertex3f(-100.f, 100.f, -520.f);
glVertex3f( 100.f, 100.f, -520.f);
glVertex3f( 100.f, 100.f, -320.f);

glNormal3f(0.f, 0.f, 1.f);
glVertex3f(-100.f, -100.f, -520.f);
glVertex3f( 100.f, -100.f, -520.f);
glVertex3f( 100.f, 100.f, -520.f);
glVertex3f(-100.f, 100.f, -520.f);
glEnd();


glPushMatrix();
glTranslatef(-80.f, -60.f, -420.f);
glCallList(SPHERE);
glPopMatrix();


glPushMatrix();
glTranslatef(-20.f, -80.f, -500.f);
glCallList(CONE);
glPopMatrix();

}

void
convolve(void (*draw)(void), Filter *mat)
{
int i, j;
int imax, jmax;

imax = mat->cols;
jmax = mat->rows;
for(j = 0; j < jmax; j++) {
for(i = 0; i < imax; i++) {
glViewport(-i, -j, winWidth - i, winHeight - j);
draw();
glAccum(GL_ACCUM, mat->array[i + j * imax]);
}
}
}

void redraw()
{
glClearAccum(curmat->bias,
curmat->bias,
curmat->bias,
1.0);

glClear(GL_ACCUM_BUFFER_BIT);

convolve(render, curmat);

glViewport(0, 0, winWidth, winHeight);

glAccum(GL_RETURN, curmat->scale);

glutSwapBuffers();

if(glGetError())
printf("Oops! I screwed up my OpenGL calls somewhere\n");
}


const int TEXDIM = 256;

main(int argc, char *argv[])
{
GLfloat *tex;
static GLfloat lightpos[] = {50.f, 50.f, -320.f, 1.f};
static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
GLUquadricObj *sphere, *cone, *base;

glutInit(&argc, argv);
glutInitWindowSize(512, 512);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_ACCUM|GLUT_DOUBLE);
(void)glutCreateWindow("accumulation buffer convolve");
glutDisplayFunc(redraw);
glutKeyboardFunc(key);
glutReshapeFunc(reshape);

glMatrixMode(GL_PROJECTION);
glFrustum(-100., 100., -100., 100., 320., 640.);
glMatrixMode(GL_MODELVIEW);

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

glCullFace(GL_BACK);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glNewList(SPHERE, GL_COMPILE);
sphere = gluNewQuadric();
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
gluSphere(sphere, 20.f, 20, 20);
gluDeleteQuadric(sphere);
glEndList();

glNewList(CONE, GL_COMPILE);
cone = gluNewQuadric();
base = gluNewQuadric();
glRotatef(-90.f, 1.f, 0.f, 0.f);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
gluDisk(base, 0., 20., 20, 1);
gluCylinder(cone, 20., 0., 60., 20, 20);
gluDeleteQuadric(cone);
gluDeleteQuadric(base);
glEndList();

glutCreateMenu(menu);
glutAddMenuEntry("none", CONV_NONE);
glutAddMenuEntry("box filter (3x3 blur)", CONV_BOX_3X3);
glutAddMenuEntry("box filter (5x5 blur)", CONV_BOX_5X5);
glutAddMenuEntry("Sobel(x direction)", CONV_SOBEL_X);
glutAddMenuEntry("Laplace", CONV_LAPLACE);
glutAttachMenu(GLUT_RIGHT_BUTTON);

tex = make_texture(TEXDIM, TEXDIM);
glTexImage2D(GL_TEXTURE_2D, 0, 1, TEXDIM, TEXDIM, 0, GL_RED, GL_FLOAT, tex);
free(tex);

curmat = newfilter(1, 1);
identity(curmat);

glutMainLoop();
}
寻开心 2005-10-14
  • 打赏
  • 举报
回复
是这个方面吧:
A-Buffer (A缓存)
采用超级采样方式来解决锯齿问题。具体方法是:使用多次渲染场景,并使每次渲染的图象位置轻微的移动,当整个渲染过程完结后,再把所有图象叠加起来,由于每个图象的位置不同,正好可以填补图象之间的间隙。该效果支持区域景深、柔光、运动模糊等特效。由于该方式对系统要求过高,因此只限于高端图形工作站。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧