OpenGL红宝书第一个例子:绘制两个三角形
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红宝书第一个例子:绘制两个三角形的更多相关文章
- 从今日起,我会把OpenGL红宝书上的例子用完整的代码形式写在我的博客中,
		
1.使用教程:OpenGL红宝书第8版 2.使用的库工具:GLEW和GLFW 3.使用的IDE:vs2012 4.说说目的:完整的看一遍OpenGL,加深印象并且熟练掌握运用OpenGL 5.欢迎有相 ...
 - [OpenGL红宝书]第一章 OpenGL概述
		
第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...
 - 【转载】关于在vs2013中配置opengl红宝书第八版环境
		
本文为转载 原文地址 http://blog.csdn.net/qq821869798/article/details/45247241 本人刚开始学习opengl,买了一本opengl红宝书第八版 ...
 - [转] VS2015中跑OpenGL红宝书第八版的第一章示例代码,运行
		
Ori Article Link OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资 ...
 - VS2015中跑OpenGL红宝书第八版的示例代码
		
OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资料终于跑起来了,记录一下 一.环境 ...
 - 运行OpenGL红宝书第9版源码时Visual Studio提示“无法启动程序...ALL_BUILD。拒绝访问“的问题的解决办法
		
问题描述: OpenGL红宝书第9版源码采用CMake编译后,用相应的Visual Studio(如VS2012)打开“vermilion9.sln”解决方案,并运行时Visual Studio提示“ ...
 - OpenGL红宝书例子2.2 uniform变量的使用
		
1. 简单介绍一下OpenGL可编程渲染管线的流程 顶点着色 --> 细分着色 --> 几何着色 --> 片元着色 --> 计算着色 一般我们主要参与的阶段是顶点着色和片元着色 ...
 - OpenGL红宝书学习笔记(1)
		
OpenGL对场景中的图像进行渲染时所执行的主要操作: 1.根据几何图元创建形状,从而建立物体的数学描述,(OpenGL把点,直线,多边形和位图作为基本的图元) 2.在三维空间中排列物体,并选择观察复 ...
 - OpenGL红宝书例3.1 -- glBufferSubData使用
		
代码实现 1.1 C++部分 GLFWwindow *window; GLuint shader_program; GLuint VAO; void init() { static const GLf ...
 
随机推荐
- php 生成.txt文件
			
$content =array('color'=> array('blue','red','green'),'size'=> array('small','medium','large') ...
 - JS的异步回调函数
			
hi :)几日不见,趁着周末和父母在广州走走逛逛,游山玩水,放松身心,第一天上班就被一个问题难住了,不废话,以下是关于JS函数回调方面的知识,今天的查阅看的也是一知半解,摘录下来日后慢慢琢磨! js中 ...
 - hdu_4283_You Are the One(区间DP)
			
题目链接:hdu_4283_You Are the One 题意: 有n个人,每个人有个屌丝值,如果果他是第K个上场,不开心指数就为(K-1)*D,然后有个小黑屋,可以调整他们的出场顺序,现在让你调整 ...
 - Maven项目问题
			
Maven项目部署 svn检出的为普通项目 1.普通项目转换为Maven项目: 选择项目右击->Maven4MyEclipse->Update Project 2.tomcat项目空间WE ...
 - 1、JavaScript基础
			
1.思维导图 2.创建html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
 - Docker安装目录
			
操作系统为 # cat /etc/redhat-release CentOS Linux release (Core) docker安装 # yum install -y docker docker安 ...
 - [ An Ac a Day ^_^ ] HDU 1257 基础dp 最长上升子序列
			
最近两天在迎新 看来只能接着水题了…… 新生培训的任务分配 作为一个有担当的学长 自觉去选了动态规划…… 然后我觉得我可以开始水动态规划了…… 今天水一发最长上升子序列…… kuangbin有nlog ...
 - FZU 2086  餐厅点餐
			
好久不写博客了……得有快一个月了……看到大神们一篇篇博文 唉……差好多……这一个月 有蓝桥杯还有校赛……校赛签到题都没签完 实力铁牌……不过蓝桥杯一等奖 五月份帝都之行还挺令人期待……清明小长假之前 ...
 - Openjudge-计算概论(A)-求一元二次方程的根
			
描述: 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根 ...
 - AFNetworking 关于JSON text did not start with array or object and option to allow fragments not set 错误
			
AFHTTPSessionManager *manager =[AFHTTPSessionManager manager]; [manager GET:@"http://www.baidu. ...