纹理坐标的实例代码1
#include <Windows.h>
#include <gl/glut.h>
#define ImageWidth 64
#define ImageHeight 64
GLubyte Image[ImageWidth][ImageHeight][3];
void makeImage(void)
{
int i, j, r , g, b;
for (i=0;i<ImageWidth;i++)
{
for (j=0;j<ImageHeight;j++)
{
r = (i*j)%255;
g = (i*4)%255;
b = (4*j)%255;
Image[i][j][0] = (GLubyte)r;
Image[i][j][1] = (GLubyte)g;
Image[i][j][2] = (GLubyte)b;
}
}
}
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
makeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
//
// 定义纹理
//
// void glTexImage2D(GLenum target,GLint level,GLint components,
// GLsizei width, glsizei height,GLint border,
// GLenum format,GLenum type, const GLvoid *pixels);
// target,GL_TEXTURE表示二维纹理映射
// level, 多级分辨率的纹理图像的级数,0,表示只有一种分辨率
// components, 从1-4的整数,指出RGBA中那些分量用于调整和混合
// 1 R分量
// 2 R和A
// 3 R/G/B三个
// 4 RGBA四个
// width,height, 纹理图像的长宽,至少64*64,若都为0,则纹理映射关闭
// border, 纹理边宽
// format, 格式;type, 数据类型。 即pixels数据的格式和数据类型。
// pixels, 纹理数据的字符数组
glTexImage2D(GL_TEXTURE_2D,0,3,
ImageWidth,ImageHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE,&Image[0][0][0]);
//
// 控制滤波
//
// 纹理控制函数
// void glTexParameter*[v](GLenum target,GLenum pname,TYPE param);
// target, GL_TEXTURE_1D或GL_TEXTURE_2D
// name, GL_TEXTURE_MAG_FILTER, 纹理放大的方法(GL_NEAREST或GL_LINEAR)
// GL_TEXTURE_MIN_FILTER, 缩小的方法(GL_NEAREST,GL_LINEAR,...另外还有4种)
// GL_TEXTURE_WRAP_S,在s方向的重复方式(GL_CLAMP或GL_REPEAT)
// GL_TEXTURE_WRAP_T,在t方向的重复方式(GL_CLAMP或GL_REPEAT)
// param, name定义的参数的值,
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// 映射方式
// void glTexEnv{if}[v](GLenum target,GLenum pname,TYPE param);
// 设置纹理映射方式。参数target必须是GL_TEXTURE_ENV;
// 若参数pname是GL_TEXTURE_ENV_MODE,
// 则参数param可以是GL_DECAL、GL_MODULATE或GL_BLEND,
// 以说明纹理值怎样与原来表面颜色的处理方式;
// 若参数pname是GL_TEXTURE_ENV_COLOR,
// 则参数param是包含四个浮点数(分别是R、G、B、A分量)的数组,
// 这些值只在采用GL_BLEND纹理函数时才有用。
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// 启动纹理映射
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* 设置纹理坐标和物体几何坐标 */
glBegin(GL_QUADS);
// 纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,
// 称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。
// 一维纹理常用s坐标表示,
// 二维纹理常用(s, t)坐标表示,
// 目前忽略r坐标,q坐标象w一样,一般值为1,主要用于建立齐次坐标。
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.6);
}
//void mouse(int button, int state, int x, int y)
//{
// switch (button)
// {
// case GLUT_LEFT_BUTTON:
// break;
// case GLUT_MIDDLE_BUTTON:
// break;
// default:
// break;
// }
//}
int main(int argc, char** argv)
{
// GLUT初始化窗口的5个必须的步骤
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(250,250);
glutInitWindowSize(500,500);
glutCreateWindow("Hello");
// 一些初始化操作
init();
// 添加回调*****重要
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutMouseFunc(mouse);
// 真正开始绘制
glutMainLoop();
return 0;
}
#include <Windows.h>
#include <gl/glut.h>
#define ImageWidth 64
#define ImageHeight 64
GLubyte Image[ImageWidth][ImageHeight][3];
void makeImage(void)
{
int i, j, r , g, b;
for (i=0;i<ImageWidth;i++)
{
for (j=0;j<ImageHeight;j++)
{
r = (i*j)%255;
g = (i*4)%255;
b = (4*j)%255;
Image[i][j][0] = (GLubyte)r;
Image[i][j][1] = (GLubyte)g;
Image[i][j][2] = (GLubyte)b;
}
}
}
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
makeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
//
// 定义纹理
//
// void glTexImage2D(GLenum target,GLint level,GLint components,
// GLsizei width, glsizei height,GLint border,
// GLenum format,GLenum type, const GLvoid *pixels);
// target,GL_TEXTURE表示二维纹理映射
// level, 多级分辨率的纹理图像的级数,0,表示只有一种分辨率
// components, 从1-4的整数,指出RGBA中那些分量用于调整和混合
// 1 R分量
// 2 R和A
// 3 R/G/B三个
// 4 RGBA四个
// width,height, 纹理图像的长宽,至少64*64,若都为0,则纹理映射关闭
// border, 纹理边宽
// format, 格式;type, 数据类型。 即pixels数据的格式和数据类型。
// pixels, 纹理数据的字符数组
glTexImage2D(GL_TEXTURE_2D,0,3,
ImageWidth,ImageHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE,&Image[0][0][0]);
//
// 控制滤波
//
// 纹理控制函数
// void glTexParameter*[v](GLenum target,GLenum pname,TYPE param);
// target, GL_TEXTURE_1D或GL_TEXTURE_2D
// name, GL_TEXTURE_MAG_FILTER, 纹理放大的方法(GL_NEAREST或GL_LINEAR)
// GL_TEXTURE_MIN_FILTER, 缩小的方法(GL_NEAREST,GL_LINEAR,...另外还有4种)
// GL_TEXTURE_WRAP_S,在s方向的重复方式(GL_CLAMP或GL_REPEAT)
// GL_TEXTURE_WRAP_T,在t方向的重复方式(GL_CLAMP或GL_REPEAT)
// param, name定义的参数的值,
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// 映射方式
// void glTexEnv{if}[v](GLenum target,GLenum pname,TYPE param);
// 设置纹理映射方式。参数target必须是GL_TEXTURE_ENV;
// 若参数pname是GL_TEXTURE_ENV_MODE,
// 则参数param可以是GL_DECAL、GL_MODULATE或GL_BLEND,
// 以说明纹理值怎样与原来表面颜色的处理方式;
// 若参数pname是GL_TEXTURE_ENV_COLOR,
// 则参数param是包含四个浮点数(分别是R、G、B、A分量)的数组,
// 这些值只在采用GL_BLEND纹理函数时才有用。
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// 启动纹理映射
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* 设置纹理坐标和物体几何坐标 */
glBegin(GL_QUADS);
// 纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,
// 称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。
// 一维纹理常用s坐标表示,
// 二维纹理常用(s, t)坐标表示,
// 目前忽略r坐标,q坐标象w一样,一般值为1,主要用于建立齐次坐标。
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.6);
}
//void mouse(int button, int state, int x, int y)
//{
// switch (button)
// {
// case GLUT_LEFT_BUTTON:
// break;
// case GLUT_MIDDLE_BUTTON:
// break;
// default:
// break;
// }
//}
int main(int argc, char** argv)
{
// GLUT初始化窗口的5个必须的步骤
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(250,250);
glutInitWindowSize(500,500);
glutCreateWindow("Hello");
// 一些初始化操作
init();
// 添加回调*****重要
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutMouseFunc(mouse);
// 真正开始绘制
glutMainLoop();
return 0;
}