社区
图形处理/算法
帖子详情
有没有简单例子 关于 使用累积缓存对场景进行反走样处理??? OpenGL
Gold2000
2005-10-14 11:07:13
rt
lkj99@126.com
...全文
240
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缓存)
采用超级采样方式来解决锯齿问题。具体方法是:使用多次渲染场景,并使每次渲染的图象位置轻微的移动,当整个渲染过程完结后,再把所有图象叠加起来,由于每个图象的位置不同,正好可以填补图象之间的间隙。该效果支持区域景深、柔光、运动模糊等特效。由于该方式对系统要求过高,因此只限于高端图形工作站。
缓存
中间件Redis技术入门与应用
场景
实战(SpringBoot2.x + 抢红包系统设计与实战)
概要介绍:历经半个多月的时间,Debug呕心沥血、亲自录制的 “
缓存
中间件Redis技术入门与典型应用
场景
实战(SpringBoot2.x)”的新课终于完成了,顾名思义,这是一门关于目前相当流行的分布式
缓存
中间件Redis相关...
openGL
缓存
概念和
缓存
清除(01)
操作
缓存
就是操作屏幕;而因为渲染的多样性需求,
缓存
是多样的,对多样的
缓存
操作,就是渲染操作。本篇对基本的几个渲染
缓存
进行
操作。
OpenGL
帧
缓存
和动画
17.1、帧
缓存
屏幕上所绘的图形都是由象素组成的,每个象素都有一个固定的颜色或带有相应点的其它信息,如深度等。因此在绘制图形时,内存中必须为每个象素均匀地保存数据,这块为所有象素保存数据的内存区就叫缓冲...
OpenGL
总结
OpenGL
学习总结 一.
OpenGL
是做什么的 一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。 二.
OpenGL
的主要功能是什么 建模,变换,颜色模式设置,光照和材质设置,...
OpenGL
(1)概述
OpenGL
学习总结 一.
OpenGL
是做什么的 一种图形硬件的接口。而不是像C和C++一样的编程语言,更像是一个运行库,提供一些预先封装的函数。 二.
OpenGL
的主要功能是什么 建模,变换,颜色模式设置,光照和材质设置...
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章