主題:貼圖座標
範例網址:https://jsyeh.org/3dcg10/
下載windows.zip =>下載\windows\Texture.exe
下載date.zip =>下載\將data拉進windows\裡面有很多圖檔
點開Texture.exe
貼圖座標:glTexCoord2f(tx,ty,tz);
下載OpenCV 2.1.0 vs2008 版(相容性最廣、容量小)
注意在安裝到PATH的時候,要選擇第二個選項,Add OpenCV to the system PATH for all users
安裝路徑請使用預設
安裝完OpenCV之後要重開CodeBlocks
File-New-EmptyFile,檔名存成:week9_opencv.cpp
接下來要設定步驟
首先到工具列setting-compiler
1.打開setting-compiler後,在Search directories - compiler 要Add(新增) C:\OpenCV2.1\include
2.Search directories-linker要Add(新增) C:\OpenCV2.1\lib
3.setting - Compiler下面選Linker settings,要Add(新增) cv210、cxcore210、highgui210
範例程式碼:
#include <opencv/highgui.h>
int main()
{
///Ipl是Intel performance library的縮寫
IplImage * img = cvLoadImage("檔名.png");///讀圖
cvShowImage("week09",img);///秀圖
cvWaitKey(0);///等任意鍵繼續
}
注意!!!程式碼跟圖片要存在同個地方,這樣子檔案才能夠執行
我的程式:
#include <opencv/highgui.h>
int main()
{
///Ipl是Intel performance library的縮寫
IplImage * img = cvLoadImage("week09.jpg");///讀圖
cvShowImage("week09",img);///秀圖
cvWaitKey(0);///等任意鍵繼續
}
執行成果如下
先去複製之前的十行茶壺程式
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week09 texture");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
#include <GL/glut.h>
#include <opencv/highgui.h>
void myTexture()
{
IplImage * img = cvLoadImage("earth.jpg");///去找地圖
cvShowImage("img",img);///在img視窗放img的圖
cvWaitKey(0);///等任意鍵繼續
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week09 texture");
glutDisplayFunc(display);
myTexture();
glutMainLoop();
return 0;
}
注意喔,寫完之後會跳出三個視窗,分別是茶壺、地球地圖跟小黑視窗
但是茶壺的圖片並不會跑出來,會被地圖(img)卡住,所以要先關掉地圖才有辦法看到茶壺
將兩個圖片合成
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * filename)
{
IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
glGenTextures(1, &id); /// 產生Generate 貼圖ID
glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
/// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
/// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
/// 貼圖參數, 放大時的內插, 用最近點
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
/// 貼圖參數, 縮小時的內插, 用最近點
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
return id;
}
void myTexture()
{
IplImage * img = cvLoadImage("earth.jpg");///去找地圖
cvShowImage("img",img);///在img視窗放img的圖
cvWaitKey(0);///等任意鍵繼續
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc,char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week09 texture");
glutDisplayFunc(display);
myTexture("earth.jpg");
glutMainLoop();
return 0;
}














沒有留言:
張貼留言