VS2015中跑OpenGL紅寶書第八版的示例代碼


OpenGL的東西快忘光了,把角落的第八版紅寶書拿出來復習一下

從書中的地址下了個示例代碼結果新系統(Win10+VS2015)各種跑不起來,懊惱之后在網上瘋狂搜索資料終於跑起來了,記錄一下

 

一、環境搭建指南

書中的地址

http://www.opengl-redbook.com/

去這里打包下載OpenGL紅寶書的示例代碼,解壓后是這樣

雖然沒有第一章的代碼但第一章的內容好歹算一個完整的例子,網上各種環境搭建教程也都以第一章的代碼為例,我們就拿過來直接用一下。

 

1、打開VS2015創建一個空的控制台項目,然后新建一個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]);

	glewExperimental = GL_TRUE;
	if (glewInit()) {
		cerr << "Unable to initialize GLEW ... exiting" << endl;
		exit(EXIT_FAILURE);
	}
	init();
	glutDisplayFunc(display);
	glutMainLoop();
}

2、打開項目屬性,在“VC++ Directories”選項卡中,將前面下載回來的紅寶書示例代碼中的include目錄加入“Include Directories”,將lib目錄加入“Library Directories”

3、打開項目屬性,在“General”選項卡中,將“Platform Toolset”設置為VS2013

4、在項目管理器中右擊Source Files的Filter,添加現有項,然后找到紅寶書源碼目錄中的lib目錄,添加LoadShaders.cpp文件

5、打開項目屬性,在“Linker/Input”選項卡中,在“Ignore Specific Default Libraries”中添加libcmtd.lib

6、在項目目錄中新建兩個文本分別命名為triangles.vert和triangles.frag,也就是我們的頂點着色器和片段着色器啦

triangles.vert

#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
	gl_Position = vPosition;
}

triangles.frag

#version 430 core
out vec4 fColor;
void
main()
{
	fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

7、編譯,運行,搞定

 

二、所以然

1、關於第一步

這里的示例代碼其實比書中的多了一句

glewExperimental = GL_TRUE;

書里的代碼用到了GLEW庫,GLEW可以跨平台支持OpenGL高級擴展特性,沒有GLEW的話在Win平台是無法使用4.3的那些功能的。這句代碼是GLEW所有擴展的一個開關,需要在glewInit()之前執行。如果沒有這一句,編譯是可以通過的,但在運行時會崩潰。

2、關於第二步

主要目的是將示例代碼中用到的GLUT和GLEW庫的頭文件和庫文件引入項目目錄。這一步沒設置好的話編譯無法通過,現象一般是無法打開freeglut相關庫文件或者某些函數沒有聲明。

網上有些教程讓你自己去下載並編譯freeglut和glew,然后拷貝到各種系統目錄和VS的目錄,其實沒用。所有用到的頭文件和庫文件在第八版示例代碼include和lib目錄中都有了,你只要正確引入項目中就不會有問題。

3、關於第三步

只有VS2015需要這一步

VS2015更改了很多標准庫的鏈接方式和宏定義,而紅寶書第八版中用到的freeglut庫中用到了這些標准庫和宏。所以如果報_sscanf或者__iob_func是無法解析的外部符號之類的錯誤,只需要把平台工具集改成舊的就行了。

4、關於第四步

沒有這一項,LoadShaders中定義的函數會報無法解析的外部符號錯誤。

5、關於第五步

如果不忽略這個默認庫,會報庫沖突或者無法打開庫文件的錯誤。

6、關於第六步

沒着色器畫個卵,運行漆黑一片。

7、雙顯卡電腦又躺槍了

我折騰了半天運行CMD顯示Unable to create OpenGL 4.3 context,尼瑪雙顯卡電腦默認用核心顯卡啟動應用。打開NVidia控制面板-管理3D設置-全局設置-首選圖形處理器,把獨顯設為默認就OK了。

 


免責聲明!

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



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