📄 myneonview.cpp
字号:
//////////////////////////////////////////////////////////
BOOL CMyNeonView::RenderScene()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.5);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
RenderToTexture(); // 渲染到纹理
ProcessHelix(); // 绘制螺旋对象
DrawBlur(25,0.02f); // 绘制模糊效果
glFlush ();
::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
return TRUE;
}
void CMyNeonView::RenderToTexture()
{
glViewport(0,0,128,128); // 设置视口变换(与纹理尺寸对应)
ProcessHelix(); // 渲染螺旋对象
glBindTexture(GL_TEXTURE_2D,BlurTexture);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);
glClearColor(0.0f, 0.0f, 0.5f, 0.5);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, 640, 480); // 设置视口变换
}
void CMyNeonView::ProcessHelix() // 绘制螺旋对象
{
GLfloat x; // 螺旋的X坐标
GLfloat y; // 螺旋的Y坐标
GLfloat z; // 螺旋的Z坐标
GLfloat phi; // 角度
GLfloat theta; // 角度
GLfloat v,u; // 角度
GLfloat r; // 螺旋的半径
int twists = 5; // 5个螺旋
GLfloat glfMaterialColor[]={0.4f,0.2f,0.8f,1.0f}; // 设置材质颜色
GLfloat specular[]={1.0f,1.0f,1.0f,1.0f}; // 设置高光
glLoadIdentity();
gluLookAt(0, 5, 50, 0, 0, 0, 0, 1, 0);
glPushMatrix();
glTranslatef(0,0,-50);
glRotatef(angle/2.0f,1,0,0);
glRotatef(angle/3.0f,0,1,0);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,glfMaterialColor);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
r=1.5f; // 半径
glBegin(GL_QUADS); // 绘制四边形
for(phi=0; phi <= 360; phi+=20.0) // 步长为20,总长360
{
for(theta=0; theta<=360*twists; theta+=20.0)
{
v=(phi/180.0f*3.142f);
u=(theta/180.0f*3.142f);
x=float(cos(u)*(2.0f+cos(v) ))*r;
y=float(sin(u)*(2.0f+cos(v) ))*r;
z=float((( u-(2.0f*3.142f)) + sin(v) ) * r);
vertexes[0][0]=x;
vertexes[0][1]=y;
vertexes[0][2]=z;
v=(phi/180.0f*3.142f);
u=((theta+20)/180.0f*3.142f);
x=float(cos(u)*(2.0f+cos(v) ))*r;
y=float(sin(u)*(2.0f+cos(v) ))*r;
z=float((( u-(2.0f*3.142f)) + sin(v) ) * r);
vertexes[1][0]=x;
vertexes[1][1]=y;
vertexes[1][2]=z;
v=((phi+20)/180.0f*3.142f);
u=((theta+20)/180.0f*3.142f);
x=float(cos(u)*(2.0f+cos(v) ))*r;
y=float(sin(u)*(2.0f+cos(v) ))*r;
z=float((( u-(2.0f*3.142f)) + sin(v) ) * r);
vertexes[2][0]=x;
vertexes[2][1]=y;
vertexes[2][2]=z;
v=((phi+20)/180.0f*3.142f);
u=((theta)/180.0f*3.142f);
x=float(cos(u)*(2.0f+cos(v) ))*r;
y=float(sin(u)*(2.0f+cos(v) ))*r;
z=float((( u-(2.0f*3.142f)) + sin(v) ) * r);
vertexes[3][0]=x;
vertexes[3][1]=y;
vertexes[3][2]=z;
calcNormal(vertexes,normal); // 计算四边形法线
glNormal3f(normal[0],normal[1],normal[2]); // 设置法线
// 渲染四边形
glVertex3f(vertexes[0][0],vertexes[0][1],vertexes[0][2]);
glVertex3f(vertexes[1][0],vertexes[1][1],vertexes[1][2]);
glVertex3f(vertexes[2][0],vertexes[2][1],vertexes[2][2]);
glVertex3f(vertexes[3][0],vertexes[3][1],vertexes[3][2]);
}
}
glEnd();
glPopMatrix();
}
void CMyNeonView::DrawBlur(int times, float inc) // 绘制模糊影像
{
float spost = 0.0f; // 纹理坐标偏移
float alphainc = 0.9f / times; // Alpha混合的淡化速度
float alpha = 0.2f; // 初始Alpha值
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D,BlurTexture);
ViewOrtho();
alphainc = alpha / times;
glBegin(GL_QUADS);
for (int num = 0;num < times;num++)
{
glColor4f(1.0f, 1.0f, 1.0f, alpha);
glTexCoord2f(0+spost,1-spost);
glVertex2f(0,0);
glTexCoord2f(0+spost,0+spost);
glVertex2f(0,480);
glTexCoord2f(1-spost,0+spost);
glVertex2f(640,480);
glTexCoord2f(1-spost,1-spost);
glVertex2f(640,0);
spost += inc;
alpha = alpha - alphainc;
}
glEnd();
ViewPerspective();
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D,0);
}
void CMyNeonView::ViewOrtho()
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 640 , 480 , 0, -1, 1 );
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}
void CMyNeonView::ViewPerspective()
{
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
}
GLuint CMyNeonView::EmptyTexture() // 生成空纹理
{
GLuint txtnumber;
unsigned int* data;
data = (unsigned int*)new GLuint[((128 * 128)* 4 * sizeof(unsigned int))];
ZeroMemory(data,((128 * 128)* 4 * sizeof(unsigned int))); // 清除内存
glGenTextures(1, &txtnumber); // 生成纹理
glBindTexture(GL_TEXTURE_2D, txtnumber);
glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0,
GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
delete [] data; // 释放内存
return txtnumber;
}
void CMyNeonView::ReduceToUnit(float vector[3]) // 矢量单位化
{
float length;
// 计算矢量的长度
length = (float)sqrt((vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2]));
if(length == 0.0f)
length = 1.0f;
vector[0] /= length;
vector[1] /= length;
vector[2] /= length;
}
void CMyNeonView::calcNormal(float v[3][3], float out[3])
{
float v1[3],v2[3];
static const int x = 0;
static const int y = 1;
static const int z = 2;
v1[x] = v[0][x] - v[1][x];
v1[y] = v[0][y] - v[1][y];
v1[z] = v[0][z] - v[1][z];
v2[x] = v[1][x] - v[2][x];
v2[y] = v[1][y] - v[2][y];
v2[z] = v[1][z] - v[2][z];
out[x] = v1[y]*v2[z] - v1[z]*v2[y];
out[y] = v1[z]*v2[x] - v1[x]*v2[z];
out[z] = v1[x]*v2[y] - v1[y]*v2[x];
ReduceToUnit(out);
}
BOOL CMyNeonView::Init(void)
{
angle = 0.0f; // 开始角度
BlurTexture = EmptyTexture(); // 生成空纹理
glEnable(GL_DEPTH_TEST);
GLfloat global_ambient[4]={0.2f, 0.2f, 0.2f, 1.0f};
GLfloat light0pos[4]= {0.0f, 5.0f, 10.0f, 1.0f};
GLfloat light0ambient[4]= {0.2f, 0.2f, 0.2f, 1.0f};
GLfloat light0diffuse[4]= {0.3f, 0.3f, 0.3f, 1.0f};
GLfloat light0specular[4]={0.8f, 0.8f, 0.8f, 1.0f};
GLfloat lmodel_ambient[]= {0.2f,0.2f,0.2f,1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light0pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light0specular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glMateriali(GL_FRONT, GL_SHININESS, 128);
glClearColor(0.0f, 0.0f, 0.0f, 0.5);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -