在vs2013上运行OpenGL编程指南第8版第一个程序

来源:互联网 发布:行助手检测不到网络 编辑:程序博客网 时间:2024/05/22 05:28
//triangle.vert#version 430 corelayout( location = 0 ) in vec4 vPosition;void main(){    gl_Position = vPosition;}

//triangle.frag#version 430 coreout vec4 fColor;void main(){ fColor = vec4(0.5, 0.4, 0.8, 1.0);}

////////////////////////////////////////////////////////////////////////////////// --- LoadShaders.cxx ---////////////////////////////////////////////////////////////////////////////////#include <cstdlib>#include <iostream>//#define GLEW_STATIC#include "Header.h"#ifdef __cplusplusextern "C" {#endif // __cplusplus//----------------------------------------------------------------------------static const GLchar*ReadShader(const char* filename){FILE* infile;fopen_s(&infile, filename, "rb");if (!infile) {#ifdef _DEBUGstd::cerr << "Unable to open file '" << filename << "'" << std::endl;#endif /* DEBUG */return NULL;}fseek(infile, 0, SEEK_END);int len = ftell(infile);fseek(infile, 0, SEEK_SET);GLchar* source = new GLchar[len + 1];fread(source, 1, len, infile);fclose(infile);source[len] = 0;return const_cast<const GLchar*>(source);}//----------------------------------------------------------------------------GLuintLoadShaders(ShaderInfo* shaders){if (shaders == NULL) { return 0; }GLuint program = glCreateProgram();ShaderInfo* entry = shaders;while (entry->type != GL_NONE) {GLuint shader = glCreateShader(entry->type);entry->shader = shader;const GLchar* source = ReadShader(entry->filename);if (source == NULL) {for (entry = shaders; entry->type != GL_NONE; ++entry) {glDeleteShader(entry->shader);entry->shader = 0;}return 0;}glShaderSource(shader, 1, &source, NULL);delete[] source;glCompileShader(shader);GLint compiled;glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);if (!compiled) {#ifdef _DEBUGGLsizei len;glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);GLchar* log = new GLchar[len + 1];glGetShaderInfoLog(shader, len, &len, log);std::cerr << "Shader compilation failed: " << log << std::endl;delete[] log;#endif /* DEBUG */return 0;}glAttachShader(program, shader);++entry;}#ifdef GL_VERSION_4_1if (GLEW_VERSION_4_1) {// glProgramParameteri( program, GL_PROGRAM_SEPARABLE, GL_TRUE );}#endif /* GL_VERSION_4_1 */glLinkProgram(program);GLint linked;glGetProgramiv(program, GL_LINK_STATUS, &linked);if (!linked) {#ifdef _DEBUGGLsizei len;glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);GLchar* log = new GLchar[len + 1];glGetProgramInfoLog(program, len, &len, log);std::cerr << "Shader linking failed: " << log << std::endl;delete[] log;#endif /* DEBUG */for (entry = shaders; entry->type != GL_NONE; ++entry) {glDeleteShader(entry->shader);entry->shader = 0;}return 0;}return program;}//----------------------------------------------------------------------------#ifdef __cplusplus}#endif // __cplusplus

////////////////////////////////////////////////////////////////////////////////// --- LoadShaders.h ---////////////////////////////////////////////////////////////////////////////////#ifndef __LOAD_SHADERS_H__#define __LOAD_SHADERS_H__//#include <GL/gl.h>#include <GL/glew.h>#include <GL/freeglut.h>#ifdef __cplusplusextern "C" {#endif // __cplusplus//----------------------------------------------------------------------------//// LoadShaders() takes an array of ShaderFile structures, each of which// contains the type of the shader, and a pointer a C-style character// string (i.e., a NULL-terminated array of characters) containing the// entire shader source.//// The array of structures is terminated by a final Shader with the// "type" field set to GL_NONE.//// LoadShaders() returns the shader program value (as returned by// glCreateProgram()) on success, or zero on failure. //typedef struct {GLenum type;const char* filename;GLuint shader;} ShaderInfo;GLuint LoadShaders(ShaderInfo*);//----------------------------------------------------------------------------#ifdef __cplusplus};#endif // __cplusplus#endif // __LOAD_SHADERS_H__

/////////////////////////////////////////////////////////////////////////// triangles.cpp/////////////////////////////////////////////////////////////////////////#include <iostream>using namespace std;#include "Header.h"#define BUFFER_OFFSET(x) ((const void*) (x))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();}

一、安装vs2013
二、配置OpenGL
     1、可以下载已经编译好了的freeglut和glew。freeglut下载地址http://www.transmissionzero.co.uk/software/freeglut-devel/,我下载的是Download freeglut 3.0.0 for MSVC 。然后下载glew,地址https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0-win32.zip/download
     2、解压,找到其中的freeglut.dll和glew32.dll(即使是64位系统,也最好选择32位的freeglut.dll和glew32.dll,本人电脑64位,选择32位动态库时经常出问题,后来改为32位的,完美运行至今。)复制到vs2013安装目录VC\bin之中,再复制到C:\Windows\System32之中。然后将vs2013的安装目录VC\bin的路径添加至环境变量。
     3、在vs2013安装目录VC\include里面创建一个文件夹,命名为GL,然后将freeglut\include\GL里面的头文件全部复制进去,再将glew\include\GL里面的头文件也全部复制进去。
     4、将32位的glew32.lib和freeglut.lib复制到vs的VC\lib里面去。
     至此,可以运行一般的OpenGL程序了,不需要再配置任何链接库。
但,寡人在运行OpenGL编程指南第八版的第一个示例的时候,还是会出现一堆错误,比如
Error 1 error LNK2001: unresolved external symbol __imp____glewAttachShader C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 2 error LNK2001: unresolved external symbol __imp____glewCompileShader C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 3 error LNK2001: unresolved external symbol __imp____glewCreateProgram C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 4 error LNK2001: unresolved external symbol __imp____glewCreateShader C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 5 error LNK2001: unresolved external symbol __imp____glewDeleteShader C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 6 error LNK2001: unresolved external symbol __imp____glewGetProgramInfoLog C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 7 error LNK2001: unresolved external symbol __imp____glewGetProgramiv C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 8 error LNK2001: unresolved external symbol __imp____glewGetShaderInfoLog C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 9 error LNK2001: unresolved external symbol __imp____glewGetShaderiv C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 10 error LNK2001: unresolved external symbol __imp____glewLinkProgram C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2Error 11 error LNK2001: unresolved external symbol __imp____glewShaderSource C:\Users\Yi\Desktop\glcode\ShaderTeaPotVS\zaishi2\zaishi2\LoadShaders.obj zaishi2

 全部是关于glew*函数的链接问题,在故需要添加

1、右键项目->properties->Linker->Input->Additional Dependencies,添加glew32.lib即可


附上代码(与书上略有不同。不同之处在于我include了glew.h和freeglut.h,而不再需要它的vgl.h了):(附上的代码怎么跑到最上面去了,,,第一次写博客,原谅我没时间排版。)

然后就是连个着色器,添加上去,便可完美运行。

还有不懂的私聊我:QQ 1071221759




原创粉丝点击