1. 环境配置

在这里不在做环境配置的说明,因为网上可以找到很多类似的教程,如果有需要可以@我,我也希望能帮到大家,其它的不说了,先上我的代码

2. 第一个程序代码

  • 创建LoadShader.h
#pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <string> GLuint LoadShader(const char *vertice_path, const char *framgment_path);
bool compileShader(GLuint &shader_id, const char *path); static const GLchar *getFileData(const char * path);
  • 创建LoadShader.cpp
#include "LoadShader.h"
#include <fstream>
#include <vector> GLuint LoadShader( const char *vertice_path, const char *framgment_path )
{
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); bool bRet = compileShader(vertexShaderID, vertice_path);
if(!bRet)
return 0;
bRet = compileShader(fragmentShaderID, framgment_path);
if(!bRet)
return 0; GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, vertexShaderID);
glAttachShader(ProgramID, fragmentShaderID);
glLinkProgram(ProgramID); glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID); return ProgramID;
} static const GLchar* getFileData( const char * path )
{
FILE* infile;
fopen_s(&infile, path, "rb");
if(!infile)
{
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);
} bool compileShader( GLuint &shader_id, const char *path )
{
const GLchar *shader_code = getFileData(path);
if(strlen(shader_code) <= 0 )
return 0; GLint Result = GL_FALSE;
GLint InfoLogLength; glShaderSource(shader_id, 1, &shader_code, NULL);
glCompileShader(shader_id); delete []shader_code; glGetShaderiv(shader_id, GL_COMPILE_STATUS, &Result);
if ( !Result ){
glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(shader_id, InfoLogLength, NULL, &ShaderErrorMessage[0]);
printf("%s\n", &ShaderErrorMessage[0]);
return false;
} return true;
}
  • OpenGL主逻辑文件triangles.cpp
#include <iostream>
#include "LoadShader.h" GLFWwindow *window; 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;
GLuint shader_program; void init()
{
glGenVertexArrays(NumVAOs,VAOs);
glBindVertexArray(VAOs[Triangles]); GLfloat vertices[NumVertices][2] = {
{ -0.90f, -0.90f },
{ 0.85f, -0.90f },
{ -0.90f, 0.85f },
{ 0.90f, -0.85f },
{ 0.90f, 0.90f },
{ -0.85f, 0.90f }
}; glGenBuffers(NumVertices, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); shader_program = LoadShader("triangles.vert", "triangles.frag");
glUseProgram(shader_program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, (void *)0);
glEnableVertexAttribArray(vPosition);
} void display()
{
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices); /* Swap front and back buffers */
glfwSwapBuffers(window); /* Poll for and process events */
glfwPollEvents();
} glfwTerminate();
} int main(int argc, char** argv)
{
if(!glfwInit())
return -1; glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window = glfwCreateWindow(512, 512, "Hello World", NULL, NULL);
if(!window)
{
glfwTerminate();
return -1;
} glfwMakeContextCurrent(window); // Initialize GLEW
glewExperimental = true; // Needed for core profile
if( GLEW_OK != glewInit())
return -1; init(); display(); return 0;
}
  • 顶点shader
#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec4 vPosition; void main(){ gl_Position = vPosition;
}
  • 片段shader
#version 330 core

// Ouput data
out vec4 fcolor; void main()
{ fcolor = vec4(0.0, 0.0, 1.0, 1.0); }

3.我在编写程序的时候遇到的问题

3.1 因为例子是用4.3的,在我电脑上我用glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);设置后就会失败,后来改成了3.3就成功了,不知道原因,我猜测可能我的电脑不支持4.3的OpenGL

3.2 写shader加载的时候遇到了点问题,glGetShaderiv(shader_id, GL_COMPILE_STATUS, &Result);没有看仔细glGetShaderiv的参数说明:Result正确的时候返回的是true,否则返回false,程序写反了,所以一直加载shader失败

第一个OpenGL程序到这里就结束了。后续努力中。。。

注: 后续的shader加载就不在说明,只有在添加的时候新内容的时候才会再次说明

OpenGL红宝书第一个例子:绘制两个三角形的更多相关文章

  1. 从今日起,我会把OpenGL红宝书上的例子用完整的代码形式写在我的博客中,

    1.使用教程:OpenGL红宝书第8版 2.使用的库工具:GLEW和GLFW 3.使用的IDE:vs2012 4.说说目的:完整的看一遍OpenGL,加深印象并且熟练掌握运用OpenGL 5.欢迎有相 ...

  2. [OpenGL红宝书]第一章 OpenGL概述

    第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...

  3. 【转载】关于在vs2013中配置opengl红宝书第八版环境

     本文为转载 原文地址 http://blog.csdn.net/qq821869798/article/details/45247241 本人刚开始学习opengl,买了一本opengl红宝书第八版 ...

  4. [转] VS2015中跑OpenGL红宝书第八版的第一章示例代码,运行

    Ori Article Link OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资 ...

  5. VS2015中跑OpenGL红宝书第八版的示例代码

    OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资料终于跑起来了,记录一下 一.环境 ...

  6. 运行OpenGL红宝书第9版源码时Visual Studio提示“无法启动程序...ALL_BUILD。拒绝访问“的问题的解决办法

    问题描述: OpenGL红宝书第9版源码采用CMake编译后,用相应的Visual Studio(如VS2012)打开“vermilion9.sln”解决方案,并运行时Visual Studio提示“ ...

  7. OpenGL红宝书例子2.2 uniform变量的使用

    1. 简单介绍一下OpenGL可编程渲染管线的流程 顶点着色 --> 细分着色 --> 几何着色 --> 片元着色 --> 计算着色 一般我们主要参与的阶段是顶点着色和片元着色 ...

  8. OpenGL红宝书学习笔记(1)

    OpenGL对场景中的图像进行渲染时所执行的主要操作: 1.根据几何图元创建形状,从而建立物体的数学描述,(OpenGL把点,直线,多边形和位图作为基本的图元) 2.在三维空间中排列物体,并选择观察复 ...

  9. OpenGL红宝书例3.1 -- glBufferSubData使用

    代码实现 1.1 C++部分 GLFWwindow *window; GLuint shader_program; GLuint VAO; void init() { static const GLf ...

随机推荐

  1. Spring Aop详尽教程

    一.概念 AOP(Aspect Oriented Programming):面向切面编程. 面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AO ...

  2. c语言正则表达式

    标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...

  3. 【LeetCode】434. Number of Segments in a String

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  4. jquery 下拉框 收藏

    jquery 下拉框  Query获取Select选择的Text和Value: 语法解释: 1. $("#select_id").change(function(){//code. ...

  5. MYSQL:SQL中Group By的使用

    SQL中Group By的使用   1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By ...

  6. arguments对象,caller 和 callee

    arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...

  7. JPA 系列教程13-复合主键-@EmbeddedId+@Embeddable

    复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 同复合主键-2个@Id和复合主键-2个@Id+ ...

  8. C/C++宏定义中#与##区别 .

    // #表示:对应变量字符串化// ##表示:把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符 #define U_BOOT_CMD_MKENT_COMPLETE(name,maxa ...

  9. 数据查找之80-20原则的JavaScript代码实现

    作为前端开发人员,无论在工作还是找工作(笔试/面试),或多或少会涉及一些数据结构的知识. 数据结构即计算机存储和组织数据的方式. 常用的结构:数组.栈.队列.链表.树.图.堆和散列表 关于数据,我们常 ...

  10. linux中将程序加入到开机自动启动

    如果将在linux中将命令或者程序设置为开机自动启动,只需要进入到将对应命令加入到/etc/rc.d/rc.local文件里即可,如下 打开文件,vi /etc/rc.d/rc.local #!/bi ...