解决方案 »
- 开机自动启用后,弹出了界面,几秒过后,自动关闭了?
- SetWindowText用法
- 帮忙推荐几个开源的网站。
- 在VC中有前置定义这一说吗?
- 请教一个bitblt的问题????高手请进
- 请问SQL Server中的varchar型字段的长度不能设置成大于256的值,是吗?
- 请教关于系统空闲问题
- 请问Win98下运用Clipboard在Paste时系统是如何区分是Copy还是Cut?
- 关于Combo控件的响应问题!!!
- 主框架窗口与视图的比较
- 如何制作MYIE插件,IE插件我做过,但是怎么样让MYIE也认呢???我现在的问题是IE插件做好了,但是在MYIE中可以看到其他的插件就是看不到
- 有谁玩过can总线的编程?最好有源代码的例子,谢谢!
A-Buffer (A缓存)
采用超级采样方式来解决锯齿问题。具体方法是:使用多次渲染场景,并使每次渲染的图象位置轻微的移动,当整个渲染过程完结后,再把所有图象叠加起来,由于每个图象的位置不同,正好可以填补图象之间的间隙。该效果支持区域景深、柔光、运动模糊等特效。由于该方式对系统要求过高,因此只限于高端图形工作站。
#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();
}