OpenGL環(huán)境搭建 耗時2天心碎

OpenGL配置
  • 開發(fā)環(huán)境 : VS2022
  • OpenGL庫 : glew freeglut gltools
  • 配置項目的工具 : cmake
    *動態(tài)庫庫的版本 :win32用32位的 win64的用64位的 對應(yīng)不是各種報錯等著你!
  • 我只配置64位環(huán)境
我的項目基礎(chǔ)配置 bin include lib
image.png
  • lib文件夾 放 .lib文件


    image.png
  • bin文件夾 放.dll動態(tài)庫文件


    image.png
  • include文件夾 放頭文件


    image.png
image.png
配置freeglut

https://sourceforge.net/projects/freeglut/files/

image.png
image.png
  • cMake 配置 freeglut項目 生成動態(tài)庫

D:/OpenGl/freeglut-3.4.0/freeglut-3.4.0 (cMakeLists路徑)
D:/OpenGl/freeglut-3.4.0/freeglut-3.4.0/build (生成項目路徑 手動創(chuàng)建build文件夾)

1.點擊Configure 2.成功點擊Generate


image.png
image.png
image.png
  • freeglut 設(shè)置為啟動項目
image.png
  • 成功


    image.png
  • 拿到freeglut.lib庫


    image.png
image.png
  • bin 文件夾 拿動態(tài)庫 freeglut.dll文件


    image.png

freeglut.lib freeglut.dll
放入項目的lib文件 和 bin文件夾

下面的頭文件放入到include/GL 文件夾下面


image.png

.dll可以放入系統(tǒng)路徑下面
32位的.dll 放入系統(tǒng)64位文件夾下面 (win32-64版本遷移為了兼容這樣做的)
C:\Windows\SysWOW64
64位的.dll放入32位的文件夾下面
C:\Windows\System32

配置glew

https://glew.sourceforge.net/

image.png
image.png
image.png
image.png

glew32s.lib glew32.dll
放入項目lib 和 bin文件夾
項目只用 glew32s.lib

最后配置gltools (依賴glew)

只有g(shù)ltools生成靜態(tài)庫文件
利用源碼 通過vs2022 生成靜態(tài)庫(可以用cMake配置項目)
gltools.lib為靜態(tài)庫 需要添加 #pragma comment(lib,"Gltools.lib")

網(wǎng)上下載 gltools包 有源碼 和 頭文件 (后續(xù)會放到云盤)

image.png

創(chuàng)建gltools空項目 include 文件夾

image.png
image.png
image.png

glew.h 和 wglew.h 通過之前配置glew文件夾拷貝過來

  • 配置項目路徑


    image.png
  • 調(diào)整編譯靜態(tài)庫


    image.png
  • 運行錯誤1

gltools1.png
  • 預(yù)處理器添加 WIN32


    gltools2.png
  • 錯誤2 (可能出現(xiàn))

1>ConsoleApplication8.obj : error LNK2019: 無法解析的外部符號 __imp__glClear@4,該符號在函數(shù) “void __cdecl display(void)” (?display@@YAXXZ) 中被引用

glew.c 添加 #pragma comment(lib,"OpenGL32.lib")


3.png
  • 成功生成靜態(tài)庫


    image.png
image.png

Gltools.lib
放入項目 lib文件夾

配置項目
  • 配置include文件路徑


    image.png
  • 配置環(huán)境bin文件夾路徑


    image.png
  • 配置lib文件夾路徑

image.png
  • 配置項目需要的lib庫
image.png

freeglutd.lib glew32s.lib Gltools.lib

image.png

直接配置 freeglutd.dll到 C:\Windows\System32 或者項目 debug目錄下

#include <iostream>
#include <stdlib.h>
#include <string.h>
#if defined(_WIN32) || defined(WIN32)
#include <windows.h> 
#endif

#include <GLTools.h>    // OpenGL toolkit
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLGeometryTransform.h>


#include <GL\freeglut.h>

//gltools為靜態(tài)庫需要添加
#pragma comment(lib,"Gltools.lib")

//自定義著色管理器
GLShaderManager shaderManager;
//簡單的批次容器 是GLTools的一個簡單容器
GLBatch triangleBatch;



//改變窗口大小
void ChangeSize(int w, int h) {
    glViewport(0, 0, w, h);
}

void SpeacialKeys(int key, int x, int y) {


}

//This function does any needed initialization on the rendering context.
//This is the first opportunity to do any OpenGL related tasks.
void SetupRC() {
    //背景顏色
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

    //初始化著色器管理
    shaderManager.InitializeStockShaders();
    //Load up a triangle

    //x y z   -1  -> 1

    //3個點 A x = -0.5  y = 0 z = 0
          //  B x = 0.5 y = 0 z = 0
          //  C  x = 0 y=0.5 z = 0

    GLfloat vVerts[] = {
      -0.5f,0.0f,0.0f,
       0.5f,0.0f,0.0f,
       0.0f,0.5f,0.0f,
    };

    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}
//Called to draw scene
void RenderScene(void) {
    //Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    GLfloat vRed[] = { 1.0f,0.0f,0.0f,1.0f };
    //著色器名字 單元著色器
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    //容器進行繪畫
    triangleBatch.Draw();

    //Perform the buffer swap to display the back buffer
    glutSwapBuffers();
}

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

    //設(shè)置當(dāng)前工作目錄
    gltSetWorkingDirectory(argv[0]);

    //傳輸命令行參數(shù)并初始化GLUT庫
    glutInit(&argc, argv);

    //創(chuàng)建窗口使用哪種類型顯示模式,雙緩沖串口和RGBA顏色模式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

    //窗口大小
    glutInitWindowSize(800, 600);

    //窗口標題
    glutCreateWindow("Triangle");

    //窗口改變大小回調(diào)函數(shù),以便能夠設(shè)置視點
    glutReshapeFunc(ChangeSize);

    //注冊函數(shù)包含OpenGL渲染代碼
    glutDisplayFunc(RenderScene);

    //特殊鍵位
    glutSpecialFunc(SpeacialKeys);

    //初始化GLEW庫,初始化驅(qū)動程序中所有丟失的入口點,確保OpenGL API可用
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    //渲染環(huán)境,運行中的OpenGL狀態(tài)機的句柄
    SetupRC();
    //開啟主消息循環(huán)并結(jié)束main函數(shù)
    glutMainLoop();
}
image.png
總結(jié)耗時久的原因

1.網(wǎng)上下載別人的配置包 然后各種報錯 開始懷疑是win32的.lib導(dǎo)致的 然后開始一步步的從官網(wǎng)下載庫 vs編譯源碼生成對應(yīng)平臺的庫

  1. 開始的時候 我把glut的庫也配置進項目 也可能會導(dǎo)致各種問題 現(xiàn)在直接用freeglut glut有兩個 glut.lib glut32.lib 不懂直接copy進了項目 各種問題隨之而來

“glut32.dll” "glut32.lib"用于微軟的win32平臺,“glut.dll” “glut.lib"用于SGI平臺
此處我們的編譯環(huán)境是x64 和x86環(huán)境,所以只需要"glut32.dll” "glut32.lib"這兩個文件

  1. glew32.lib glew32s.lib
lib庫要使用glew32s.lib,(不要用glew32.lib)(其中s 是static的意思,glew32.lib需要glew32.dll,glew32s.lib就不需要了)

#define GLEW_STATIC

#include "glew.h"

#pragma comment(lib, "glew32s.lib")

就不用再改project options了。

如果用GLEW就要在屬性設(shè)置里添加一個庫openGL32.lib,否則有很多專有類型識別不出來

  1. 各種異常百分之99的問題都是庫的問題?。。。。。。。。。。。?/li>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容