1. 程式人生 > >Visual Studio 2017上配置OpenGL程式設計指南第8版開發環境

Visual Studio 2017上配置OpenGL程式設計指南第8版開發環境

一直想學習一下OpenGL,買了紅寶書第8版,卻因為工作原因一直沒有時間看,最近利用週末嘗試了一下配置開發環境,遇到了一些坑點,現在記錄下來備用。

第一步:開啟Visual Studio 2017,建立一個空的C++工程

第二步:新建triangles.cpp檔案,並寫入書本例子中的程式碼

///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////

#include <iostream>
using namespace std;

#include "vgl.h"
#include "LoadShaders.h"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers }; enum Attrib_IDs { vPosition = 0 }; GLuint VAOs[NumVAOs]; GLuint Buffers[NumBuffers]; const GLuint NumVertices = 6; //--------------------------------------------------------------------- // // init // void init(void) { glGenVertexArrays(NumVAOs, VAOs); glBindVertexArray(VAOs[Triangles]); GLfloat vertices[NumVertices][
2] = { { -0.90, -0.90 }, // Triangle 1 { 0.85, -0.90 }, { -0.90, 0.85 }, { 0.90, -0.85 }, // Triangle 2 { 0.90, 0.90 }, { -0.85, 0.90 } }; glGenBuffers(NumBuffers, Buffers); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]); glBufferData(GL_ARRAY_BUFFER, sizeof
(vertices), vertices, GL_STATIC_DRAW); ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "triangles.vert" }, { GL_FRAGMENT_SHADER, "triangles.frag" }, { GL_NONE, NULL } }; GLuint program = LoadShaders(shaders); glUseProgram(program); glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vPosition); } //--------------------------------------------------------------------- // // display // void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAOs[Triangles]); glDrawArrays(GL_TRIANGLES, 0, NumVertices); glFlush(); } //--------------------------------------------------------------------- // // main // int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(4, 3); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMainLoop(); }

第三步:插入程式碼之後會有很多的報錯,下載官方的樣例程式碼,開啟專案屬性->VC++目錄並引入lib庫和標頭檔案

第四步:生成解決方案,這個時候可以發現程式碼的報錯已經沒有了,但是控制檯會有一些錯誤的提示

開啟專案屬性->連結器->輸入,找到忽略特定預設庫,在其中加入libcmtd.lib

第五步:解決庫衝突問題後仍存在問題

我們從原始碼的資料夾libs中找到LoadShaders.cpp檔案,複製到專案目錄下,並新增到解決方案中

第六步:新增LoadShaders檔案後依然有報錯

開啟工程目錄下的LoadShaders.cpp檔案,將如下程式碼的巨集WIN32修改成_WIN32

第七步:解決對應平臺安全程式碼問題,依然報錯

開啟專案屬性->連結器->輸入,並在附加依賴項中新增legacy_stdio_definitions.lib

第八步:新增依賴項legacy_stdio_definitions.lib後依然報錯

這時候我們在triangles.cpp最上方新增如下程式碼

#if _MSC_VER>=1900
#include "stdio.h"
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus
extern "C"
#endif
FILE* __cdecl __iob_func(unsigned i) {
    return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */

第九步:解決符號問題後生成工程成功

點選執行,而然又報錯了

這個時候需要在glutInit(&argc, argv);前加入程式碼

glewExperimental = GL_TRUE;

再次點選執行

原來忘記放入書上的著色器檔案了,在工程目錄下分別建立著色器檔案triangles.frag和triangles.vert

// triangles.frag
#version 430 core
out vec4 fColor;
void
main()
{
    fColor = vec4(0.0, 0.0, 1.0, 1.0);
}
// triangles.vert
#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
    gl_Position = vPosition;
}

第十步:再次執行工程,終於見到了成功的圖形

 

上述就是在Visual Studio 2017上構建《OpenGL程式設計指南(原書第8版)》開發環境及執行書本第一個例子的完整過程。