OpenGL——外部读档+异常报错
从外部读取shader文件:
先添加Shader类:

再创建vertexSource.txt和fragmentSource.txt两个文件:

如图填入shader:


在shader.h宣告:

在shader.cpp中从外部读档:
#include "Shader.h"
#include <iostream>
#include<fstream>
#include <sstream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h> using namespace std; Shader::Shader(const char* vertexPath,const char* fragmentPath)
{ // 1. 从文件路径中获取顶点/片段着色器
ifstream vertexFile;
ifstream fragmentFile;
stringstream vertexSStream;
stringstream fragmentSStream; // 打开文件
vertexFile.open(vertexPath);
fragmentFile.open(fragmentPath);
vertexFile.exceptions(ifstream::failbit || ifstream::badbit);
fragmentFile.exceptions(ifstream::failbit || ifstream::badbit); try
{
if (!vertexFile.is_open()||!fragmentFile.is_open())//没有打开,丢出异常
{
throw exception("open file error");
}
vertexSStream << vertexFile.rdbuf();//从硬盘读取资料
fragmentSStream << fragmentFile.rdbuf();//从硬盘读取资料 vertexString = vertexSStream.str();//转成字符串
fragmentString = fragmentSStream.str(); vertexSource = vertexString.c_str();
fragmentSource = fragmentString.c_str(); unsigned int vertex, fragment; vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, , &vertexSource, NULL);
glCompileShader(vertex);
checkCompileErrors(vertex, "VERTEX");//异常报错提示 fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, , &fragmentSource, NULL);
glCompileShader(fragment);
checkCompileErrors(fragment, "FRAGMENT");//异常报错提示 ID = glCreateProgram();
glAttachShader(ID, vertex);
glAttachShader(ID, fragment);
glLinkProgram(ID);
checkCompileErrors(ID, "PROGRAM");//异常报错提示 glDeleteShader(vertex);
glDeleteShader(fragment); }
catch (const std::exception&ex)
{
printf(ex.what());//如果错误就跳到这执行
}
} void Shader::use() {
glUseProgram(ID);
} void Shader::checkCompileErrors(unsigned int ID, std::string type) //宣告
{//测试报错
int success;
char infoLog[]; if (type!="PROGRAM")
{
glGetShaderiv(ID, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(ID, , NULL, infoLog);
cout << "shader compile error:" << infoLog << endl;
}
}
else
{
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(ID, , NULL, infoLog);
cout << "progam Linking error:" << infoLog << endl;
}
}
};
main.cpp写入:
#include <iostream>
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "Shader.h" float vertices[] = {
-0.5f,-0.5f,0.0f,1.0f,,,
0.5f,-0.5f,0.0f,,1.0f,,
0.5f,0.5f,0.0f,,,1.0f,
-0.5f,0.5f,0.0f,1.0f,,1.0f
}; unsigned int indices[] = { // 注意索引从0开始!
, , , //第一个三角形
, , //第二个三角形
}; //函数在main之前存档
void processInput(GLFWwindow* window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{//退出键关闭窗口
glfwSetWindowShouldClose(window, true);
}
}
int main(int argc, char* argv[]) { glfwInit();//初始化和创建窗口
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, );//提示用主版本号为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, );//次版本号为3,即为3.3版本的OpenGL
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //open GLFW window
GLFWwindow* window = glfwCreateWindow(, , "Test window", NULL, NULL);//800*600的窗口 if (window == NULL) {//如果为空指针
//std::cout << "open window failed." << std::endl;//打印失败
printf("open window failes.");
glfwTerminate();//终止
return -;
//return EXIT_FAILURE;
} glfwMakeContextCurrent(window); //init GLEW
glewExperimental = true; if (glewInit() != GLEW_OK)
{
printf("Init GLEW failed.");
//std::cout << "glew init failed." << std::endl;
glfwTerminate();
return -;//-1代表不正常退出
} glViewport(, , , );//前两个参数控制窗口左下角的位置,后两个参数设置可绘制的像素大小 //第一个参数表示我们打算将其应用到所有的三角形的正面和背面,第二个参数告诉我们用线来绘制
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//线框模式
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//关掉线框模式 Shader* myshader = new Shader("vertexSource.txt", "fragmentSource.txt");//指针调用 unsigned int VAO;
glGenVertexArrays(, &VAO);
glBindVertexArray(VAO); unsigned int VBO;//顶点缓冲对象
glGenBuffers(, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);//顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER,使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上
//调用glBufferData函数,它会把之前定义的顶点数据复制到缓冲的内存中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); unsigned int EBO;
glGenBuffers(, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); //顶点属性,顶点属性的大小(vec3),数据类型,是否数据被标准化,步长,强制类型转换(表示位置数据在缓冲中起始位置的偏移量)
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(float), (void*));
glEnableVertexAttribArray();//启用顶点属性
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(float), (void*)(*sizeof(float)));
glEnableVertexAttribArray();//启用顶点属性
while (!glfwWindowShouldClose(window))
{ processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0);//清屏颜色填充RGB,透明度
glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); myshader->use();
glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_INT, );//改为glDrawElements即可。6为索引个数,0表示偏移。
glfwSwapBuffers(window);
glfwPollEvents();
} glfwTerminate(); return ;
}
运行结果:没错!

现在,修改vertexSource文件内容:

运行:没出现图像,并且命令窗口报异常。

OpenGL——外部读档+异常报错的更多相关文章
- Python基础中所出现的异常报错总结
今天我们来探索python中大部分的异常报错 首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等. 打个比方很多公司年终送苹果笔记本,你 ...
- saiku中过滤窗口优化及隐藏异常报错
问题一:当取消自动查询后,点击该维度应弹出过滤条件窗口,实际无反应,只有执行一次查询后再点击该维度,才能弹出过滤条件窗口 解决办法:打开WorkspaceDropZone.js文件,找到selecti ...
- unity3d MonoDevelop引用外部自定义dll文件报错:are you missing an assembly reference?
在unity3d 编辑器 MonoDevelop 中引用外部自定义dll文件报错:are you missing an assembly reference? 因为unity还停留在.NET Fram ...
- (原创)vagrant up 异常报错,出现 There was an error while executing `VBoxManage` 的解决方法
最近在使用 vagrant homestead 时,不小心在虚拟机上使用了 exit 命令退出虚拟机,导致再使用 vagrant up 时出现以下错误: Bringing machine 'larav ...
- 【转】JAVA异常报错大全
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...
- Unity在OpenGL模式下Shader编译报错
报错信息 GLSL compilation failed: 0(21) : error C7528: OpenGL reserves names containing '__' 双击报错VS自动打开V ...
- idea运行javadoc生成文档以及 报错编码gbk的不可映射字符坑
将项目类信息生成文档 idea整合了javadoc的操作,可以一键生成doc文档 方法: 选中你要生成文档的项目 点击上方tools->Generate JavaDoc 运行即可 注意这里有一个 ...
- 执行文件异常报错:ImportError: attempted relative import with no known parent package
这个问题困扰了我很久了,网上的解决方法都很一致,找来找去都是一样的解决方法,在导入包的文件和执行文件加入 1 print('__file__={0:<35} | __name__={1:< ...
- SAP 调用RFC 的时候记录异常报错方式
DATA: lv_error TYPE char100. CALL FUNCTION 'ZRFC_WM_ZEL001' DESTINATION lv_desc EXPORTING process_fl ...
随机推荐
- 删除倒数第k个元素
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- 权限管理——shiro
1.shiro整合spring a.导入依赖 <properties> <shiro.version>1.2.4</shiro.version> </prop ...
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...
- css 制作圆角、圆形图形布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 对于服务器AdminServer, 与计算机Machine-0相关联的节点管理器无法访问
控制台启动server时报"对于服务器server-1与计算机machin<!--StartFragment -->对于服务器AdminServer, 与计算机Machine-0 ...
- 小甲鱼Python第十八讲课后习题
笔记: 1.函数与过程:过程(procedure)是简单的,特殊且没有返回值的:函数(Function)有返回值 Python严格来说只有函数没有过程 2.局部变量:在局部生效如在函数中定义的变量 3 ...
- HDFS基础配置
HADOOP-3.1.0-----HDFS基础配置 执行步骤:(1)配置集群(2)启动.测试集群增.删.查(3)执行wordcount案例 一.配置集群 1.在 hadoop-env.sh配置文件添加 ...
- iniReader,读取配置文件中数据
#include ”IniOperation.h" CString strPath = strIntancePath + _T("..\\config.ini"); // ...
- verilog中signed的使用
1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其 ...
- 英特尔神经棒使用入门-NCS2 & NCS1 -OpenVino
|--背景: NCS1使用的NCSDK1和NCSDK2,速度一般,没有想象中的速度,能有TX2一半的速度吧.跟大佬又申请了个NCS2来试一试. 环境配置到跑通自己写的MNIST分类网络花了2天不到吧. ...