声明:因网易博客将关闭,移到此
/**
这里使用到的是opengl 和 glut 进行编写学习的笔记,一个简单的出口
使用到的开发库有 linux (gl glu glut) windows(opengl32.lib glu32.lib glut32.lib)
这里是参考 nehe 第26课,资源也是那里
实现: 蒙版缓存
镜面的效果....
假设我们要实现一个镜面的效果,我们在镜子前面放一个球体,能在镜子里
面看到这个球
实现:
我们绘制一个平面当作镜子,两边绘制同样的球,
镜子后面的球体和镜子里面的进行混合,ok 程序完成,
尝试移动球体看下,发现,
镜子后面的球体被看到了,怎么办?
修改1:
我们加个蒙版把镜子里面的屏蔽掉,ok 镜子里面的的没有了,新的问题又来了,
当镜子外面的球体穿过镜子的时候,本来在镜子里面的球体又出来了,
怎么办?
修改2:
我们加一个裁剪面,把镜子后面的如果超过镜子的画直接裁剪掉,ok
基本完成.
*/
#include <iostream>
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#endif
#ifdef __GNUC__
#include <unistd.h>
#endif
using namespace std;
// 图片的类型 包含宽 高 数据
struct Image
{
unsigned long sizeX;
unsigned long sizeY;
char *data;
};
typedef struct Image Image;
// 我们用来旋转下模型吧
float g_angle = 0;
float g_zoom = -7.0f;
float g_height = 0.5f;
GLuint g_walltex; // 墙的纹理
GLuint g_spheretex; // 球体的纹理
GLuint g_envtex; //
GLUquadricObj *q;
// 下面是读取自定义格式的模型信息文件使用的函数
//----------------------------------------------------------
// 读取图片文件
int ImageLoad(const char *filename, Image *image)
{
FILE *file;
unsigned long size; // 图片长度
unsigned long i; // 计数
unsigned short int planes;
unsigned short int bpp;
char temp; // bgr -rgb 变换
if ((file = fopen(filename, "rb")) == NULL)
{
printf("File Not Found: %s\n", filename);
return 0;
}
// 跳过文件的头部,准备读取宽度和高度
// 如果想自己具体的情况可以去看看bmp图片的相关信息
fseek(file, 18, SEEK_CUR);
// 读取宽度
if ((i = fread(&image->sizeX, 4, 1, file)) != 1)
{
printf("Error reading width from %s. \n", filename);
return 0;
}
printf("Width of %s: %lu\n", filename, image->sizeX);
// 读取宽度
if ((i = fread(&image->sizeY, 4, 1, file)) != 1)
{
printf("Error reading height from %s.