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
-
lib文件夾 放 .lib文件
image.png -
bin文件夾 放.dll動態(tài)庫文件
image.png -
include文件夾 放頭文件
image.png
配置freeglut
https://sourceforge.net/projects/freeglut/files/
- 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
- freeglut 設(shè)置為啟動項目
-
成功
image.png -
拿到freeglut.lib庫
image.png
-
bin 文件夾 拿動態(tài)庫 freeglut.dll文件
image.png
freeglut.lib freeglut.dll
放入項目的lib文件 和 bin文件夾
下面的頭文件放入到include/GL 文件夾下面
.dll可以放入系統(tǒng)路徑下面
32位的.dll 放入系統(tǒng)64位文件夾下面 (win32-64版本遷移為了兼容這樣做的)
C:\Windows\SysWOW64
64位的.dll放入32位的文件夾下面
C:\Windows\System32
配置glew
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ù)會放到云盤)
創(chuàng)建gltools空項目 include 文件夾
glew.h 和 wglew.h
通過之前配置glew文件夾拷貝過來
-
配置項目路徑
image.png -
調(diào)整編譯靜態(tài)庫
image.png 運行錯誤1
-
預(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")
-
成功生成靜態(tài)庫
image.png
Gltools.lib
放入項目 lib文件夾
配置項目
-
配置include文件路徑
image.png -
配置環(huán)境bin文件夾路徑
image.png 配置lib文件夾路徑
- 配置項目需要的lib庫
freeglutd.lib glew32s.lib Gltools.lib
直接配置 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);
//容器進(jìn)行繪畫
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);
//窗口標(biāo)題
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)機(jī)的句柄
SetupRC();
//開啟主消息循環(huán)并結(jié)束main函數(shù)
glutMainLoop();
}
總結(jié)耗時久的原因
1.網(wǎng)上下載別人的配置包 然后各種報錯 開始懷疑是win32的.lib導(dǎo)致的 然后開始一步步的從官網(wǎng)下載庫 vs編譯源碼生成對應(yīng)平臺的庫
- 開始的時候 我把glut的庫也配置進(jìn)項目 也可能會導(dǎo)致各種問題 現(xiàn)在直接用freeglut glut有兩個 glut.lib glut32.lib 不懂直接copy進(jìn)了項目 各種問題隨之而來
“glut32.dll” "glut32.lib"用于微軟的win32平臺熬粗,“glut.dll” “glut.lib"用于SGI平臺
此處我們的編譯環(huán)境是x64 和x86環(huán)境鸥鹉,所以只需要"glut32.dll” "glut32.lib"這兩個文件
- 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,否則有很多專有類型識別不出來
- 各種異常百分之99的問題都是庫的問題>囊臁8省8岱伞!i艽骸B咛省!E迸?ㄈ濉!@汀骨望!