OpenGL--纹理贴图基础
生活随笔
收集整理的這篇文章主要介紹了
OpenGL--纹理贴图基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 理論基礎
紋理貼圖:通俗地講就是可以把我們讀取的紋理加載到圖元表面的一種技術,這樣大大的提高了圖像的表現質量。
- 實例代碼
//讀取tga格式圖片
//紋理貼圖使用一般步驟:1,初始化:創建紋理對象,設置紋理過濾方式,為當前創建的紋理對象指定紋理 2,使用:激活,指定當前活動紋理并為頂點指定紋理坐標//
#include "GLTools.h"#ifdef __APPLE__ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endifGLuint texName; GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat;void init(void) {glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);glEnable(GL_DEPTH_TEST);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);//設置像素存儲模式//讀取tga圖像數據pBits = gltReadTGABits("/Users/app05/Desktop/opengl/stone.tga", &nWidth, &nHeight, &nComponents, &eFormat);if(pBits == NULL)printf("tga load failed");glGenTextures(1, &texName);//生成1個未使用的紋理對象標志glBindTexture(GL_TEXTURE_2D, texName);//創建紋理對象(存儲紋理數據的容器)/*設置紋理過濾方式*///指當紋理坐標的第一維坐標值大于1.0或小于0.0時,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//指當紋理坐標的第二維坐標值大于1.0或小于0.0時,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//紋理圖象被使用到一個小于它的形狀上,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);/*設置如果紋理圖象被使用到一個大于它的形狀上時,像素如何填充,可選擇的設置有GL_NEAREST和GL_LINEAR,前者表示“使用紋理中坐標最接近的一個像素的顏色作為需要繪制的像素顏色”,后者表示“使用紋理中坐標最接近的若干個顏色,通過加權平均算法得到需要繪制的像素顏色",后者效果要比前者好。*/glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);//指定二維紋理glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);free(pBits); }void display(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_TEXTURE_2D);//激活二維紋理貼圖//設置紋理貼圖方式(直接覆蓋原來顏色或與原來顏色混合)glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//直接使用紋理覆蓋模式glBindTexture(GL_TEXTURE_2D, texName);//指定當前使用的紋理(第一次使用和第二次使用含義不同)//為每個頂點指定紋理坐標,類似指定法線一樣glNormal()glBegin(GL_QUADS);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();glDisable(GL_TEXTURE_2D);//關閉二維紋理貼圖 }void reshape(int w, int h) {glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, -3.6); }int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(250, 250);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0; }總結
以上是生活随笔為你收集整理的OpenGL--纹理贴图基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分立器件~二极管三极管
- 下一篇: ddk开发 c语言,使用DDK提供的bu