开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1763

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 313|回复: 1

[哪来的胖子] 第五节 OpenGL1.0 纹理

[复制链接]  [移动端链接]
排名
1587
昨日变化
1

34

主题

103

帖子

1610

积分

Rank: 9Rank: 9Rank: 9

UID
35368
好友
19
蛮牛币
3875
威望
0
注册时间
2014-7-20
在线时间
595 小时
最后登录
2017-7-21

专栏作家活力之星

QQ
发表于 2016-11-9 14:42:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
1 加载纹理图片并上传显卡
图片要放在项目的根目录下
为了简单,我们加载一张bmp格式的图片,因为不需要解码就可以直接使用。
因为只是测试,这里在程序启动时就直接将图片上传到显卡上面了,不另行处理。

2 给顶点数据添加纹理坐标
纹理坐标的范围是(0,0)-(1,1)
glTexCoord2f(0.0f, 0.0f);//给顶点纹理数据

3 开启纹理选项
glEnable(GL_TEXTURE_2D);
然后就可以看到结果了(有五花肉的感觉)
纹理操作.jpg
下面是全部的代码:
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <stdio.h>

#include <GL/glut.h>

#include <GL/GLU.h>

#include <gl/GL.h>

 

#pragma comment(lib,”opengl32.lib”)

#pragma comment(lib,”glu32.lib”)

 

float x = 0.0f;

//GL的显示操作

void myDisplay(void)

{

x = x+0.01f;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//开启深度测试 按z值进行顺序渲染

glEnable(GL_DEPTH_TEST);

//开启纹理选项

glEnable(GL_TEXTURE_2D);

//模型直线展示

//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

//恢复模型矩阵

glLoadIdentity();

 

//矩阵操作入栈

glPushMatrix();

//视口矩阵操作

//移动

//glTranslatef(x, 0, 0);

//旋转

glRotatef(x, -10.0f, -10.0f, -110.0f);

//缩放

//glScalef(x,1.0f, 1.0f);

 

glBegin(GL_TRIANGLES);

 

//-x

glTexCoord2f(0.0f, 0.0f);//给顶点纹理数据

glVertex3f(-10.0f, -10.0f, -10.0f – 100.0f);

 

glTexCoord2f(1.0f, 0.0f);

glVertex3f(0, -10.0f, 10.0f – 100.0f);

 

glTexCoord2f(1.0f, 1.0f);

glVertex3f(0, 10.0f, 0.0f – 100.0f);

//x

glTexCoord2f(0.0f, 1.0f);

glVertex3f(10.0f, -10.0f, -10.0f – 100.0f);

glTexCoord2f(1.0f, 1.0f);

glVertex3f(0, 10.0f, 0.0f – 100.0f);

glTexCoord2f(1.0f, 0.0f);

glVertex3f(0, -10.0f, 10.0f – 100.0f);

 

//-y

glTexCoord2f(0.0f, 1.0f);

glVertex3f(10.0f, -10.0f, -10.0f – 100.0f);

glTexCoord2f(0.0f, 0.0f);

glVertex3f(-10.0f, -10.0f, -10.0f – 100.0f);

glTexCoord2f(1.0f, 0.0f);

glVertex3f(0, -10.0f, 10.0f – 100.0f);

//-z

 

glTexCoord2f(0.0f, 1.0f);

glVertex3f(10.0f, -10.0f, -10.0f – 100.0f);

glTexCoord2f(0.0f, 0.0f);

glVertex3f(-10.0f, -10.0f, -10.0f – 100.0f);

glTexCoord2f(1.0f, 1.0f);

glVertex3f(0, 10.0f, 0.0f – 100.0f);

glEnd();

//矩阵操作结束,出栈

glPopMatrix();

 

glFlush();

}

 

///加载bmp格式的图片

unsigned char* LoadBMP(const char*path, int &width, int &height)

{

unsigned char* imageData = NULL;

FILE*pFile = fopen(path, “rb”);

if (pFile)

{

BITMAPFILEHEADER bfh;

fread(&bfh, sizeof(BITMAPFILEHEADER), 1, pFile);

if (bfh.bfType == 0x4D42)

{

BITMAPINFOHEADER bih;

fread(&bih, sizeof(BITMAPINFOHEADER), 1, pFile);

width = bih.biWidth;

height = bih.biHeight;

imageData = new unsigned char[width*height * 3];

fseek(pFile, bfh.bfOffBits, SEEK_SET);

fread(imageData, 1, width*height * 3, pFile);

fclose(pFile);

}

}

return imageData;

}

 

GLuint texture;

//GL相关模式的初始化

void GlInit(void)

{

//把图片数据上传至显卡

int imageWidth, imageHeight;

unsigned char* imageData = LoadBMP(“test.bmp”, imageWidth, imageHeight);

glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);

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_T, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);

 

//背景颜色

glClearColor(41.0f / 255.0f, 77.0f / 255.0f, 121.0f / 255.0f, 1.0f);

 

//投影矩阵

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(50.0f, 400.0f / 400.0f, 0.1f, 1000.0f);

 

//模型视口矩阵

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

 

 

 

//main函数

int main(int argc, char *argv[])

{

//窗口设置

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow(“纹理操作”);

 

GlInit();

glutDisplayFunc(&myDisplay);

//循环

glutIdleFunc(&myDisplay);

glutMainLoop();

return 0;

}

由于这次有资源,可能不好说清结构,我把我的项目打包放到网盘上面了,有需要的可以下载下http://pan.baidu.com/s/1dERiNDJ

更多教程欢迎访问随风工作室博客:http://www.unitybeginner.com/blog/




回复

使用道具 举报

4四处流浪
387/500
排名
9483
昨日变化
147

1

主题

238

帖子

387

积分

Rank: 4

UID
207270
好友
0
蛮牛币
329
威望
0
注册时间
2017-2-19
在线时间
72 小时
最后登录
2017-7-23
发表于 3 天前 | 显示全部楼层
66666666666666
[发帖际遇]: 1232122 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表