编译opengl编程指南第八版示例代码通过

最近在编译opengl编程指南第八版的示例代码,如下

 1 #include <iostream>
 2 #include "vgl.h"
 3 #include "LoadShaders.h"
 4
 5 using namespace std;
 6
 7
 8 enum VAO_IDs { Triangles, NumVAOs };
 9 enum Buffer_IDs { ArrayBuffer, NumBuffers };
10 enum Attrib_IDs { vPosition = 0 };
11 GLuint VAOs[NumVAOs];
12 GLuint Buffers[NumBuffers];
13 const GLuint NumVertices = 6;
14
15 void
16 init(void)
17 {
18     glGenVertexArrays(NumVAOs, VAOs);
19     glBindVertexArray(VAOs[Triangles]);
20     GLfloat vertices[NumVertices][2] = {
21         { -0.90, -0.90 }, // Triangle 1
22         { 0.85, -0.90 },
23         { -0.90, 0.85 },
24         { 0.90, -0.85 }, // Triangle 2
25         { 0.90, 0.90 },
26         { -0.85, 0.90 }
27     };
28     glGenBuffers(NumBuffers, Buffers);
29     glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
30     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
31         vertices, GL_STATIC_DRAW);
32     ShaderInfo shaders[] = {
33         { GL_VERTEX_SHADER, "triangles.vert" },
34         { GL_FRAGMENT_SHADER, "triangles.frag" },
35         { GL_NONE, NULL }
36     };
37     GLuint program = LoadShaders(shaders);
38     glUseProgram(program);
39     glVertexAttribPointer(vPosition, 2, GL_FLOAT,
40         GL_FALSE, 0, BUFFER_OFFSET(0));
41     glEnableVertexAttribArray(vPosition);
42 }
43
44 void
45 display(void)
46 {
47     glClear(GL_COLOR_BUFFER_BIT);
48     glBindVertexArray(VAOs[Triangles]);
49     glDrawArrays(GL_TRIANGLES, 0, NumVertices);
50     glFlush();
51 }
52
53 int
54 main(int argc, char** argv)
55 {
56     glutInit(&argc, argv);
57     glutInitDisplayMode(GLUT_RGBA);
58     glutInitWindowSize(512, 512);
59     glutInitContextVersion(4, 3);
60     glutInitContextProfile(GLUT_CORE_PROFILE);
61     glutCreateWindow(argv[0]);
62     if (glewInit()) {
63         cerr << "Unable to initialize GLEW ... exiting" << endl;
64         exit(EXIT_FAILURE);
65     }
66     init();
67     glutDisplayFunc(display);
68     glutMainLoop();
69 }

shader代码如下:

//顶点shader
#version 430 core

layout(location = 0) in vec4 vPosition;

void main(){
    gl_Position = vPosition;
}
//片元shader
#version 430 core

out vec4 fColor;

void main(){
    fColor = vec4(0.0, 0.0, 1.0, 1.0);
}

在编译成功运行的时候老是在glGenVertexArrays和glBindVertexArray两个函数出crash,在stackoverflow上面找到了解决的办法,GLEW has trouble accessing some parts of the opengl core profile by default, so saying "glewExperimental = GL_TRUE;" before your call to glewInit() might help.因此只需要加这么一行代码就可以了

 1 int
 2 main(int argc, char** argv)
 3 {
 4     glutInit(&argc, argv);
 5     glutInitDisplayMode(GLUT_RGBA);
 6     glutInitWindowSize(512, 512);
 7     glutInitContextVersion(4, 3);
 8     glutInitContextProfile(GLUT_CORE_PROFILE);
 9     glutCreateWindow(argv[0]);
10     glewExperimental = GL_TRUE;//add
11     if (glewInit()) {
12         cerr << "Unable to initialize GLEW ... exiting" << endl;
13         exit(EXIT_FAILURE);
14     }
15     init();
16     glutDisplayFunc(display);
17     glutMainLoop();
18 }

运行结果如下

时间: 2024-08-08 01:26:39

编译opengl编程指南第八版示例代码通过的相关文章

Visual Studio 2017上配置OpenGL编程指南第8版开发环境

一直想学习一下OpenGL,买了红宝书第8版,却因为工作原因一直没有时间看,最近利用周末尝试了一下配置开发环境,遇到了一些坑点,现在记录下来备用. 第一步:打开Visual Studio 2017,建立一个空的C++工程 第二步:新建triangles.cpp文件,并写入书本例子中的代码 /////////////////////////////////////////////////////////////////////// // // triangles.cpp // //////////

《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut.h中对exit的使用,意思是如果没有定义宏?GLUT_BUILDING_LIB,就使用它的exit,那我们就在项目的属性--预处理器 里定义这个宏,这样就不执行glut.h中的exit了,而只执行stdlib.h中的exit.这样也就不会冲突了.对了,还要在附加依赖项里手动加上?glut32.lib

opengl编程指南 第七版 源码有bug Page35 lines.c 红宝书

问题1:当我照着源码敲进去的时候发现,运行的结果不对.哪里不对?源码中没有glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现每次更新点画线时在下一次绘制时会以最后一次设置的信息重绘而覆盖掉之前已绘制好的点线.所以要进行状态压栈处理和谈栈处理,这样子在刷帧重绘才不会影响其他帧的绘制结果.(原因是什么目前我也不清楚,估计是状态机的管理问题.要了解内部的绘制机制才行.)但是每次手动添加压栈和弹栈太麻烦了,所以我处理C_style的宏定义形式去实现 问题2

opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书

问题1:根据源代码时,我发现的时候去敲门.不正确实施效果.哪里是不正确?没有源代码glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现最后的下一次抽奖提供的资料重绘每次更新的虚线时间前覆盖已制定好点线.和谈栈处理,这样子在刷帧重绘才不会影响其它帧的绘制结果.(原因是什么眼下我也不清楚,预计是状态机的管理问题.要了解内部的绘制机制才行. )可是每次手动加入压栈和弹栈太麻烦了,所以我处理C_style的宏定义形式去实现 问题2:reshape的操作屏蔽掉

在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法

前言:笔者第一次用vs2015来实现<OpenGL编程指南>第八版第一个程序时确实花费了不少时间,按照网上教程,尝试了各种方法,最终花费了两个上午加一个下午的时间, 成功运行了程序,花了这么多时间,确实让人懊恼,现在把运行程序的步骤记录下来,以便查阅. 1.第一步,下载oglpg-8th-edith. 如果去书本上的官网下载,下载的是第九版的,而不是第八版的源码. 去其他网站下载,下载的这个包里面没有第一章的源码,可以网上黏贴其他人的代码,建议下第八版源码,下载网址:链接:http://pan

VS15 openGL 编程指南 配置库 triangle例子

最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去该书的网站中下载相关的配置文件,书中给的是"红宝书"的官方网址:http://www.opengl-redbook.com/ 但现在已经更新至第九版,里面的库不是很完整,不适宜用于此书示例. 所以我们要找一个第八版的资源:http://pan.baidu.com/s/1kVpv1MR 下载

OpenGL 编程指南 (3.1)

1.OpenGL使用的是RGB颜色空间,例如三个颜色分量各占8位,那么就说这个颜色值色深24,能够表示2^24中颜色. 2.多重采样是基于采样的抗锯齿技术,有OGAA(ordered grid anti-sliasing).SGAA(sparse grid anti-aliasing).MSAA(multi-sampling anti-aliasing).CSAA(coverage sampling anti-aliasing)等众多实现方式.fragment shader中有gl_Sample

OpenGL 编程指南 (3.2)

1.帧缓冲对象 帧缓冲对象对于离屏渲染.纹理贴图更新.缓存乒乓技术(buffer ping-pongqing,GPGPU的一种数据传输方式)的实现意义非凡,它减少了大量的数据拷贝工作. 建立帧缓冲需要负责建立帧缓冲使用的其它缓冲内容,也就是说,新建的帧缓冲只是一个空壳,具体的渲染缓冲对象被称之为帧缓冲附件.下面是一个简单的可用帧缓冲建立示例: 帧缓冲是比较消耗内存的,所以OpenGL提供了可以将帧缓冲一部分或者全部无效化从而立即释放内存的操作 void glInvalidFramebuffer(

OpenGL 编程指南 (8)

1.细分着色器(Tessellation shader)有两个阶段来生成几何图元的模型网格. 1)在顶点着色阶段,需要设置所有线段.三角形构成处理的网格,使用有序顶点列表生成新的目标图元,. 2)将新生成的图元顶点放置到指定的位置上后进入下一阶段. 2.tessellation shader 处理一种叫 面片(patch) 的新图元,它是一个保证了期望顺序的顶点列表.面片的的顶点数量需要自行设置,同一个绘制命令处理的面片大小是相同的. void glPathcParameteri(GLenum