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版)》開發環境及運行書本第一個例子的完整過程。


免責聲明!

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



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