OpenGL编程指南 (红宝书 第八版) 样例代码配置问题汇总

本文主要是介绍OpenGL编程指南 (红宝书 第八版) 样例代码配置问题汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录(?)[+]

    • 代码下载
    • 环境配置问题glut 和 glew1
    • 基本头文件和库文件配置2
  • 以下是正文内容不断添加中
  • 第一个渲染程序Triangles3
  • 第三章 03ch03_drawcommands4

本文是笔者自己在配置中遇到问题并解决后将原资料和自己的经验结合整理而成

代码下载

可以在CSDN上搜索

环境配置问题(glut 和 glew)1

可以参考我的另一篇博文《使用cmake和visual studio编译freeglut和glew源代码并配置的流程》,但可能并不是必须的步骤。

基本头文件和库文件配置2

如果发现大片大片的红线,则需要添加include和lib:

点项目右键属性,点击vc++目录 
这里写图片描述

包含目录–编辑,添加红宝书源码目录中的include文件夹 
这里写图片描述 
库目录–编辑,添加红宝书源码目录中的lib文件夹 
这里写图片描述


  • 错误主要是:无法解析的外部符号 _sscanf、 ___iob_func等。这个问题很好解决,主要是VS2015相对于之前的版本有所改动,具体可以自行百度。解决方法如下:
  • 1.右键项目–>属性–>链接器–>输入–>附加依赖项:legacy_stdio_definitions.lib 
  • 2.在源文件中添加以下代码
  • #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 */

    编译通过了,但是VAOs出现访问冲突: 
    这里写图片描述

    原因是glewInit()没有完成所有的初始化,所以在glewInit()前面一行加上:

    glewExperimental = GL_TRUE;

    详见代码部分。

    glewExperimental 相当一个总开关,如果将它设置成 GL_TRUE 就可以让glew支持所有的拓展,glewInit()也可以顺利完成所有的初始化。

以下是正文内容,不断添加中:






第一个渲染程序Triangles3

一、新建一个Win32 Console Application

修改后的完整代码如下:


///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

二、常见问题

(1)关于”stdafx.h”的错

代码首部添加或删除 #include “stdafx.h”

(2)编译一下发现不通过,报无法解析外部命令的错误

这可能是因为找不到LoadShaders.cpp 
在红宝书源代码目录中有个lib文件夹,里面有LoadShaders.cpp 
在工程的源文件右键添加现有项,把它添加进来 
这里写图片描述

(3) 
现在再编译一次,发现还是报错,说有个libcmtd.lib库跟其他库有冲突,我们可以去忽略它 
点击项目右键–属性–链接器–输入,在忽略特定默认库中添加它 
这里写图片描述

(4) 
编译通过了,但是VAOs出现访问冲突: 
这里写图片描述

原因是glewInit()没有完成所有的初始化,所以在glewInit()前面一行加上:

glewExperimental = GL_TRUE;

详见代码部分。

glewExperimental 相当一个总开关,如果将它设置成 GL_TRUE 就可以让glew支持所有的拓展,glewInit()也可以顺利完成所有的初始化。

(5) 
现在在编译一次发现可以通过了出来 
这里写图片描述 
但是它是白色的三角形不是蓝色的,需要在工程目录中新建两个文本 
更名为triangles.vert和triangles.frag 
这里写图片描述

代码如下:

triangles.vert

layout(location = 0) in vec4 vPosition;  
void  
main()  
{  gl_Position = vPosition;  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

triangles.frag

out vec4 fColor;  
void  
main()  
{  fColor = vec4(0.0, 0.0, 1.0, 1.0);  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后再编译运行,出现蓝色三角形 
这里写图片描述






第三章 03\ch03_drawcommands4

(1)修改后的完整代码:

/* $URL$$Rev$$Author$$Date$$Id$
*/#include "vapp.h"
#include "vutils.h"#include "vmath.h"#include "LoadShaders.h"#include <stdio.h>using namespace vmath;// Define USE_PRIMITIVE_RESTART to 0 to use two separate draw commands
#define USE_PRIMITIVE_RESTART 1BEGIN_APP_DECLARATION(DrawCommandExample)// Override functions from base classvirtual void Initialize(const char * title);virtual void Display(bool auto_redraw);virtual void Finalize(void);virtual void Reshape(int width, int height);// Member variablesfloat aspect;GLuint render_prog;GLuint vao[1];GLuint vbo[1];GLuint ebo[1];GLint render_model_matrix_loc;GLint render_projection_matrix_loc;
END_APP_DECLARATION()DEFINE_APP(DrawCommandExample, "Drawing Commands Example")void DrawCommandExample::Initialize(const char * title)
{base::Initialize(title);static  ShaderInfo shader_info[] ={{ GL_VERTEX_SHADER, "../../03/ch03_primitive_restart/primitive_restart.vs.glsl" },{ GL_FRAGMENT_SHADER, "../../03/ch03_primitive_restart/primitive_restart.fs.glsl" },{ GL_NONE, NULL }};render_prog = LoadShaders(shader_info);glUseProgram(render_prog);// "model_matrix" is actually an array of 4 matricesrender_model_matrix_loc = glGetUniformLocation(render_prog, "model_matrix");render_projection_matrix_loc = glGetUniformLocation(render_prog, "projection_matrix");// A single trianglestatic const GLfloat vertex_positions[] ={-1.0f, -1.0f,  0.0f, 1.0f,1.0f, -1.0f,  0.0f, 1.0f,-1.0f,  1.0f,  0.0f, 1.0f,-1.0f, -1.0f,  0.0f, 1.0f,};// Color for each vertexstatic const GLfloat vertex_colors[] ={1.0f, 1.0f, 1.0f, 1.0f,1.0f, 1.0f, 0.0f, 1.0f,1.0f, 0.0f, 1.0f, 1.0f,0.0f, 1.0f, 1.0f, 1.0f};// Indices for the triangle stripsstatic const GLushort vertex_indices[] ={0, 1, 2};// Set up the element array bufferglGenBuffers(1, ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[0]);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_indices), vertex_indices, GL_STATIC_DRAW);// Set up the vertex attributesglGenVertexArrays(1, vao);glBindVertexArray(vao[0]);glGenBuffers(1, vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_positions), vertex_positions);glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertex_positions), sizeof(vertex_colors), vertex_colors);glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid *)sizeof(vertex_positions));glEnableVertexAttribArray(0);glEnableVertexAttribArray(1);glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}void DrawCommandExample::Display(bool auto_redraw)
{float t = float(GetTickCount() & 0x1FFF) / float(0x1FFF);static float q = 0.0f;static const vmath::vec3 X(1.0f, 0.0f, 0.0f);static const vmath::vec3 Y(0.0f, 1.0f, 0.0f);static const vmath::vec3 Z(0.0f, 0.0f, 1.0f);vmath::mat4 model_matrix;// SetupglEnable(GL_CULL_FACE);glDisable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Activate simple shading programglUseProgram(render_prog);// Set up the model and projection matrixvmath::mat4 projection_matrix(vmath::frustum(-1.0f, 1.0f, -aspect, aspect, 1.0f, 500.0f));glUniformMatrix4fv(render_projection_matrix_loc, 1, GL_FALSE, projection_matrix);// Set up for a glDrawElements callglBindVertexArray(vao[0]);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[0]);// Draw Arrays...model_matrix = vmath::translate(-3.0f, 0.0f, -5.0f);glUniformMatrix4fv(render_model_matrix_loc,1, GL_FALSE, model_matrix);glDrawArrays(GL_TRIANGLES, 0, 3);// DrawElementsmodel_matrix = vmath::translate(-1.0f, 0.0f, -5.0f);glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL);// DrawElementsBaseVertexmodel_matrix = vmath::translate(1.0f, 0.0f, -5.0f);glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix);glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL, 1);// DrawArraysInstancedmodel_matrix = vmath::translate(3.0f, 0.0f, -5.0f);glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix);glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1);base::Display();
}void DrawCommandExample::Finalize(void)
{glUseProgram(0);glDeleteProgram(render_prog);glDeleteVertexArrays(1, vao);glDeleteBuffers(1, vbo);
}void DrawCommandExample::Reshape(int width, int height)
{glViewport(0, 0 , width, height);aspect = float(height) / float(width);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172

(2)常见问题:

line 46: static const ShaderInfo shader_info[] = 改成 static ShaderInfo shader_info[] = 
line 116: mat4 model_matrix; 改成 vmath::mat4 model_matrix; 
line 136/141/146/151: translation 改成 translate 
line 137/142/147/152: 把参数4改成1 ,即 
glUniformMatrix4fv(render_model_matrix_loc, 4, GL_FALSE, model_matrix); 改成 glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix);

结果如下: 
这里写图片描述




以下是原文地址或参考地址:


  1. 基本头文件和库文件配置: 
    http://blog.csdn.net/iceteaset/article/details/50359559 ↩
  2. 基本配置: 
    http://blog.csdn.net/qq821869798/article/details/45247241 ↩
  3. 第一个渲染程序: 
    http://blog.csdn.net/qq821869798/article/details/45247241 
    http://www.cnblogs.com/caster99/p/4752354.html ↩
  4. 第三章ch03_drawcommands: 
    http://blog.csdn.net/fanbird2008/article/details/17538243 ↩

这篇关于OpenGL编程指南 (红宝书 第八版) 样例代码配置问题汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016105

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一