社区
图形处理/算法
帖子详情
有没有简单例子 关于 使用累积缓存对场景进行反走样处理??? OpenGL
Gold2000
2005-10-14 11:07:13
rt
lkj99@126.com
...全文
304
5
打赏
收藏
有没有简单例子 关于 使用累积缓存对场景进行反走样处理??? OpenGL
rt lkj99@126.com
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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缓存)
采用超级采样方式来解决锯齿问题。具体方法是:使用多次渲染场景,并使每次渲染的图象位置轻微的移动,当整个渲染过程完结后,再把所有图象叠加起来,由于每个图象的位置不同,正好可以填补图象之间的间隙。该效果支持区域景深、柔光、运动模糊等特效。由于该方式对系统要求过高,因此只限于高端图形工作站。
[
OpenGL
教程05 ] glAccum() 函数对
累积
缓存
设置
本文详细解释了
OpenGL
编程中的
累积
缓存
机制,如何通过glAccum函数
进行
像素级操作,以及如何利用它创建抗锯齿、运动模糊和景深效果。介绍了相关函数如glClearAccum和glAccum操作的
使用
方法。,
缓冲区及其用途
本文深入探讨
OpenGL
缓存
机制,包括颜色
缓存
、深度
缓存
、模板
缓存
和
累积
缓存
的功能与用途。详细阐述了颜色
缓存
、深度
缓存
、模板
缓存
和
累积
缓存
的存储原理及应用实例,特别强调了颜色
缓存
的立体观察支持、双
缓存
系统、辅助颜色
缓存
的概念。此外,文章还介绍了片段测试和操作的顺序、
场景
抗锯齿、运动模糊、景深和柔和阴影等图像
处理
技术的应用。最后,通过示例展示了如何利用
累积
缓存
实现
场景
反走样
,提供了运动模糊和景深效果的实现方法。
计算机图形学 | 有趣的测试和合并——片元操作
文章探讨了计算机图形学中的片元操作,包括颜色
缓存
、模板
缓存
、深度
缓存
和累计
缓存
的作用。深度测试通过Z-buffer算法决定像素的可见性,而消隐技术如面剔除和深度排序用于
处理
遮挡问题。
OpenGL
中的面剔除和深度测试功能也被提及。
华科_图形学笔记_10_有趣的测试和合并_片元操作
本文详细介绍了计算机图形学中的片元操作,包括模板测试、深度测试和颜色混合,以及在光栅化阶段的重要作用。深度测试通过深度缓冲区决定像素颜色值,模板测试则利用模板
缓存
限制渲染区域。此外,文章还探讨了面剔除和深度排序(消隐)算法,如深度
缓存
器算法和画家算法,以解决物体遮挡问题。在
OpenGL
中,这些功能可以通过相应的函数启用和配置。
图形处理/算法
19,466
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章