如何使用SOIL在VS2012的 C++環境下顯示圖片


先看下效果。

 

這是一個很無聊的功能。。。。首先說下,我做這個功能的初衷並不是為了實現在控制台中顯示圖片。。。(這貌似很無聊)

而是因為自己想做用C做一個游戲:http://q.cnblogs.com/q/65778/ 

當然,這是一個艱難而且漫長的過程,我決定只參考下別人的代碼而不完全搬運,順便練下手,因為自己是JAVA程序員,學C貌似有點難度。

我打算從畫地圖開始做起。

扯遠了,開始吧。

SOIL(Simple OpenGL Image Library) 顧名思義,簡單的OpenGL圖片庫

其實載入圖片的學習型過程中,我也學到了不少其他的東西,不過都是和圖形有關的,比如gtk,opengl等。。。

有經驗都來分享下吧,首先是在visual studio環境下配置GTK。

首先從這里下載GTK的完整版(Windows)。

然后解壓縮文件到你想要的位置,這里就把文件解壓縮到D盤根目錄下,為了以后方便,我們把文件夾名稱改為gtk

然后用管理員身份運行cmd,鍵入以下命令 setx GTKDIR D:\gtk /m

然后打開VS2012,新建一個C++項目,最好是空項目。

然后右鍵單擊你的項目,點擊屬性->配置屬性->VC++目錄

找到右邊的包含目錄和庫目錄

然后點擊一下文本框,會出來一下下箭頭,點一下,然后點擊編輯

然后點擊新行,新建一行,然后在包含目錄中分別把

$(GTKDIR)\lib\gtk-2.0\include $(GTKDIR)\lib\glib-2.0\include $(GTKDIR)\include
添加進去,$(GTKDIR)就是剛才在CMD下添加的,當然你也可以省略掉上面的步驟,直接添加絕對路徑,當然,這取決於你的喜好。
在庫目錄中添加:
$(GTKDIR)\lib

然后,選擇鏈接器->系統->子系統->窗口 (/SUBSYSTEM:WINDOWS)
注意,這個地方,以后如果如下報錯。

錯誤 1 error LNK2019: 無法解析的外部符號 _WinMain@16,該符號在函數 ___tmainCRTStartup 中被引用 C:\Users\li\documents\visual studio 2012\Projects\Win32Project3\Win32Project3\MSVCRTD.lib(crtexew.obj) Win32Project3

那么,就要把這里調回來哦~~~

然后CMD,進入D:\gtk\bin目錄,

我們下面要利用里面的命令做一些事情:

首先是輸入命令:

pkg-config --cflags gtk+-2.0 --msvc-syntax > compilerflags.txt

然后你就可以在D:\gtk或者D:\gtk\bin下面找到這個文件,里面寫了如下內容:

-mms-bitfields -ID:/gtk/include/gtk-2.0 -ID:/gtk/lib/gtk-2.0/include -ID:/gtk/include/atk-1.0 -ID:/gtk/include/cairo -ID:/gtk/include/gdk-pixbuf-2.0 -ID:/gtk/include/pango-1.0 -ID:/gtk/include/glib-2.0 -ID:/gtk/lib/glib-2.0/include -ID:/gtk/include -ID:/gtk/include/freetype2 -ID:/gtk/include/libpng14

上面這段話,我們先暫時放這里。

然后我們再輸入:

pkg-config --libs gtk+-2.0 --msvc-syntax > linkerflags.txt
就會在目錄下生產一個名為linkerflags.txt的文件
里面內容如下:

/libpath:D:/gtk/lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gio-2.0.lib pangowin32-1.0.lib gdi32.lib pangocairo-1.0.lib gdk_pixbuf-2.0.lib pango-1.0.lib cairo.lib gobject-2.0.lib gmodule-2.0.lib gthread-2.0.lib glib-2.0.lib intl.lib

然后我們右鍵點擊項目,然后點擊屬性,單擊C/C++下的命令行,下面有一欄空白的其他選項,把第一段綠色的文字(compilerflags.txt)復制到里面去,

然后跳到鏈接器->命令行,把第二段綠色的文字(linkerflags.txt)里的內容復制進去。

到此為止,你就可以在include里引用gtk了!

到此為止,大功告成,如果大家以后看到了其他的插件,想引用進來,也可以用類似的方法,大部分情況下都會成功的哦~~

 

SOIL下載地址

下面來介紹一下SOIL的引入方法,重復的地方就不說了,有一點不同我還是要說下,

如果直接按照上面的方法,會引入成功,但是調試運行程序的時候會報錯,這怎么解決呢?

在SOIL目錄下->projects下面有以下文件。

都是工程文件哦

這里我們選擇VC8來做吧,我在VS2012下面用VC8的成功了,VC9的失敗了,不懂為什么。

回到原來的項目,右鍵單擊解決方案添加現有項目,定位到哪個VC8的地方,然后添加進去。

然后再進行引用就OK了。

 

然后你就可以編譯成功了(網上說了一些其他的方法,我試了沒用,目前只知道引用工程的方法)。

 

好了,然后我放代碼出來吧:

//#include "graphics.h"
#include <stdio.h>

#include <windows.h>
#include <conio.h>
#include <math.h>
#include <GL\glut.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#include <SOIL.h> //輕量級圖形控件




//載入圖片
GLuint    myTexture;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    
    glLoadIdentity();
    glTranslatef(100.0f, 100.0f, 0.0f);
    
    glBindTexture(GL_TEXTURE_2D, myTexture);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(256.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(256.0f, 256.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(0.0f, 256.0f);
    glEnd();
    
    glutSwapBuffers();
}

void reshape(int width, int height)
{
    glViewport(0, 0, width, height);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
    glMatrixMode(GL_MODELVIEW);
}

void idle(void)
{
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(640, 480);
    glutCreateWindow("SOIL test");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    
    myTexture = SOIL_load_OGL_texture("1.jpg", 0, 1, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
    if (!myTexture)
    {
        printf("soil failed to load texture\n");
        //exit(0);
    }
    glEnable(GL_TEXTURE_2D);
    
    glutMainLoop();
    return EXIT_SUCCESS;
}

  其實我也是初學呢,所以代碼解釋方面的話,我也不敢亂說話。

還有一點打擊要注意下,就是載入圖片的路徑,我這里是1.jpg,這個1.jpg是相對路徑,

如果路徑錯誤,是載入不了圖片的,設置路徑方式如下:

右鍵單擊項目,在配置屬性下的調試里面有一個工作目錄,工作目錄就是相對路徑哦。

我自己因為是出於練手階段,所以刪除了一些沒必要的代碼,其實開始寫了一些畫正方形和線段的代碼,這里沒放出來,以后不過會放的。

 

編輯:

今天把代碼做了一下分析,想看的點開吧,都寫了注釋。

//#include "graphics.h"
#include <stdio.h>

#include <windows.h>
#include <conio.h>
#include <math.h>
#include <GL\glut.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#include <SOIL.h> //輕量級圖形控件




//載入圖片
GLuint    myTexture;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    
    glLoadIdentity();

    //詳情:http://msdn.microsoft.com/en-us/library/windows/desktop/ee872066(v=vs.85).aspx
    //第一個參數:圖片在X軸方向的位置,越大圖片越往右邊偏移,Y同樣的,是從屏幕的左下角開始計算的。
    glTranslatef(0.0f, 0.0f, 0.0f);
    
    glBindTexture(GL_TEXTURE_2D, myTexture);
    glBegin(GL_QUADS); //開始畫線

    /*注意glTexCoord2f的值只能是-1~1的浮點型數字
    注意glVertex2f的第一個參數為X軸的左邊,第二個參數為Y軸的坐標
    需要4個坐標進行配合,這樣才能做出不同大小的圖片*/
    //左下角
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);

    //右下角
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(805.0f, 0.0f);

    //右上角頂點
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(805.0f, 150.0f);

    //左上角
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(0.0f, 150.0f);


    //結束畫線
    glEnd();
    
    //如果沒有這一步,窗口將會變成白色,原因不明
    glutSwapBuffers();
}

void reshape(int width, int height)
{
    glViewport(0, 0, width, height); //這里的width和height是glutInitWindowSize時設置的,下同。
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
    glMatrixMode(GL_MODELVIEW);
}

void idle(void)
{
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutCreateWindow("SOIL test");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    
    myTexture = SOIL_load_OGL_texture("1.jpg", 0, 1, SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_INVERT_Y);
    if (!myTexture)
    {
        printf("soil failed to load texture\n");
        //exit(0);
    }
    //啟用gl
    glEnable(GL_TEXTURE_2D);
    
    glutMainLoop();
    return EXIT_SUCCESS;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM