纹理坐标的实例代码

纹理坐标的实例代码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.00.0); glVertex3f(-2.0-1.00.0);
    glTexCoord2f(
0.01.0); glVertex3f(-2.01.00.0);
    glTexCoord2f(
1.01.0); glVertex3f(0.01.00.0);
    glTexCoord2f(
1.00.0); glVertex3f(0.0-1.00.0);
    glTexCoord2f(
0.00.0); glVertex3f(1.0-1.00.0);
    glTexCoord2f(
0.01.0); glVertex3f(1.01.00.0);
    glTexCoord2f(
1.01.0); glVertex3f(2.414211.0-1.41421);
    glTexCoord2f(
1.00.0); glVertex3f(2.41421-1.0-1.41421);
    glEnd();

    glFlush();
}

void reshape(int w, int h)
{
    glViewport(
00, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(
60.01.0*(GLfloat)w/(GLfloat)h, 1.030.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(
0.00.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;
}
原文地址:https://www.cnblogs.com/mumuliang/p/1893343.html