环境纹理: 比如镜子反射周围环境。
glEnable(GL_TEXTURE_GEN_S); //启用纹理环境 x方向
glEnable(GL_TEXTURE_GEN_T); //启用纹理环境 y方向
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); //指定纹理环境的参数 GL_SPHERE_MAP:球形映射
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
代码如下:
//顶点数据
struct Vertex {
float x, y, z;
float u, v;
};
//纹理ID
GLuint _texture1;
GLUquadricObj *quadratic;
float _textureV = 0;;
static unsigned createTexture(int w, int h, const void* data) {
unsigned texId;
glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
return texId;
}
/**
* 使用FreeImage加载图片
*/
static unsigned createTextureFromImage(const char* fileName) {
//1 获取图片格式
FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(fileName, 0);
if(fifmt == FIF_UNKNOWN) {
return 0;
}
//2 加载图片
FIBITMAP *dib = FreeImage_Load(fifmt, fileName, 0);
FREE_IMAGE_COLOR_TYPE type = FreeImage_GetColorType(dib);
//! 获取数据指针
FIBITMAP* temp = dib;
dib = FreeImage_ConvertTo32Bits(dib);
FreeImage_Unload(temp);
BYTE* pixels = (BYTE*)FreeImage_GetBits(dib);
int width = FreeImage_GetWidth(dib);
int height = FreeImage_GetHeight(dib);
for(int i = 0; i < width * height * 4; i+=4) {
BYTE temp = pixels[i];
pixels[i] = pixels[i + 2];
pixels[i + 2] = temp;
}
unsigned res = createTexture(width, height, pixels);
FreeImage_Unload(dib);
return res;
}
static void onInit() {
_texture1 = createTextureFromImage("../res/1.jpg");
quadratic = gluNewQuadric(); //建立一个球
gluQuadricNormals(quadratic, GLU_SMOOTH); //建立法线
gluQuadricTexture(quadratic, GL_TRUE); //建立纹理坐标
glEnable(GL_TEXTURE_GEN_S); //启用纹理环境 x方向
glEnable(GL_TEXTURE_GEN_T); //启用纹理环境 y方向
//#define GL_EYE_LINEAR 0x2400 :眼睛线性映射
//#define GL_OBJECT_LINEAR 0x2401 :目标 线性映射
//#define GL_SPHERE_MAP 0x2402 :球形映射
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); //指定纹理环境的参数 GL_SPHERE_MAP:球形映射
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
}
static void onDestory() {
// glDeleteTextures (GLsizei n, const GLuint *textures);
// n 表示销毁几个纹理
// 纹理id数据所在数组位置
glDeleteTextures(1, &_texture1);
}
// 绘制
static void render(GLFWwindow * window) {
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _texture1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -5);
gluSphere(quadratic, 1.3f, 32, 32); //绘制球
glfwSwapBuffers(window);
glfwPollEvents();
}