参考书是这本opengl编程指南第8版
源码链接,用的百度盘,opengl第八版的官方源代码也包含在triangles.rar里面了。
https://pan.baidu.com/s/1gfLpUPt
然后是官方源码链接:
http://www.opengl-redbook.com/
不过书好像已经出到第九版了,所以源码官方链接里的源码也是第九版了。
先来试着编译并运行书上第一个示例吧,triangles.cpp.
///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h" //加载着色器
enum VAO_IDs { Triangles, NumVAOs }; //顶点数组对象相关数据, VAO(Vertex-Array Object)
enum Buffer_IDs { ArrayBuffer, NumBuffers }; //顶点缓存相关数据
enum Attrib_IDs { vPosition = 0 , vColor = 1}; //
GLuint VAOs[NumVAOs]; //顶点数组
GLuint Buffers[NumBuffers]; //顶点缓存
const GLuint NumVertices = 6; //顶点数
//---------------------------------------------------------------------
//
// init
//
void init(void)
{
glGenVertexArrays(NumVAOs, VAOs); //生成顶点缓存数组名称
glBindVertexArray(VAOs[Triangles]); //绑定顶点数组
struct VertexData {
GLubyte color[4];
GLfloat position[4];
};
VertexData vertices[NumVertices] = {
{{255, 0, 0, 255}, {-0.90, -0.90}},
{{0, 255, 0, 255}, {0.85, -0.90}},
{{0, 0, 255, 255}, {-0.90, 0.85}},
{{10, 10, 10, 255}, {0.90, -0.85}},
{{100, 100, 100, 255}, {0.90, 0.90}},
{{255, 255, 255, 255}, {-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(vColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VertexData), BUFFER_OFFSET(0));
glVertexAttribPointer(vPosition, 2, GL_FLOAT,
GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(sizeof(vertices[0].color)));
glEnableVertexAttribArray(vColor);
glEnableVertexAttribArray(vPosition); //启用顶点属性数组
glClearColor(0, 0, 1, 1); //设置清除屏幕颜色
}
//---------------------------------------------------------------------
//
// display
//
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT); //清除帧缓存
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices); //顶点数据向OpenGL管线传输
glFlush(); //强制所有进行中的opengl命令立即完成并传输到opengl服务端处理
}
//---------------------------------------------------------------------
//
// 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();
}
//接下来是顶点着色器和片元着色器,都是新建的txt文件改名字而成的
//顶点着色器
triangles.vert
#version 430 core
layout(location = 0) in vec4 vPosition;
layout(location = 1) in vec4 vColor;
out vec4 color;
void main()
{
color = vColor;
gl_Position = vPosition;
}
//片元着色器
triangles.frag
#version 430 core
in vec4 color;
out vec4 fColor;
void main()
{
fColor = color;
}
接下来是项目配置,我用的vs2015:
1添加include目录:
2添加lib目录:
3在“General”选项卡中,将“Platform Toolset”设置为VS2013:
当然你电脑必须安装vs2013才行。
4在项目管理器中右击Source Files的Filter,添加现有项,然后找到红宝书源码目录中的lib目录,添加LoadShaders.cpp文件
5打开项目属性,在“Linker/Input”选项卡中,在“Ignore Specific Default Libraries”中添加libcmtd.lib
最后就可以按f5了,然后运行情况如图: