openGL learning
PACKAGES MAY BE USED
- GL3W - For modern OpenGL methods
- GLFW - Window creation and management
- GLM - Maths calculations
- stb_image - Image loading
- TinyOBJLoader - Obj loading
- TinyEXR - EXR file saving
- ImGui - UI rendering
- tinyfiledialogs - Call native file dialog (require Zenity on linux)
DENOISE:
https://github.com/OpenImageDenoise/oidn
LINUX PLATFORM
cmake_minimum_required(VERSION 2.8)
project(CP_01) set(GLFW_HOME /home/gearslogy/Plugin_dev/opengl/GLEXT)
include_directories(${GLFW_HOME}/include/)
link_directories(${GLFW_HOME}/lib/) find_package(OpenGL REQUIRED)
include_directories(${OpenGL_INCLUDE_DIRS})
link_directories(${OpenGL_LIBRARY_DIRS})
add_definitions(${OpenGL_DEFINITIONS})
if(NOT OPENGL_FOUND)
message(ERROR " OPENGL not found!")
endif(NOT OPENGL_FOUND) add_executable(CP_01 main.cpp)
target_link_libraries(CP_01 glfw GLEW)
//
// Created by gearslogy on 11/1/18.
// #include <GL/glew.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h> enum VAO_IDs {Triangles ,NumVAOs};
enum Buffer_IDs{ArrayBuffer,NumBuffers};
enum Attrib_IDS{vPosition=}; GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers]; const GLuint NumVertices = ; void init(void){ static const GLfloat vertices[NumVertices][] = {
{-0.90f, -0.90f},
{0.85f, -0.90f},
{-0.90f, 0.85f}, {0.90f, -0.85f},
{0.90f, 0.90f},
{-0.85f, 0.90f},
}; glCreateBuffers(NumBuffers,Buffers);
glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,); glGenVertexArrays(NumVAOs,VAOs);
glBindVertexArray(VAOs[Triangles]);
glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
glVertexAttribPointer(vPosition,,GL_FLOAT,GL_FALSE,,);
glEnableVertexAttribArray(vPosition); } void display(void){
static const float black[] = {0.0f,0.0f,0.0f,0.0f};
glClearBufferfv(GL_COLOR,,black);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, ,NumVertices);
} int main(){
glfwInit(); GLFWwindow *window =glfwCreateWindow(,,"Triangles",NULL,NULL);
glfwMakeContextCurrent(window);
glewInit();
init(); while(!glfwWindowShouldClose(window)){
display();
glfwSwapBuffers(window);
glfwPollEvents();
} glfwDestroyWindow(window);
glfwTerminate();
}
WINDOWS PLATFORM,VC2019, 全部静态链接
Windows CMakelists:
cmake_minimum_required(VERSION 3.5) project(Triangle) set(CMAKE_CXX_STANDARD )
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# OPENGL
find_package(OpenGL REQUIRED)
include_directories(${OpenGL_INCLUDE_DIRS})
link_directories(${OpenGL_LIBRARY_DIRS})
add_definitions(${OpenGL_DEFINITIONS}) if(NOT OPENGL_FOUND)
message(ERROR " OPENGL not found!")
endif(NOT OPENGL_FOUND) # GLEW
set(GLEW_HOME D:/plugin_dev/libs/glew-2.1.)
include_directories(${GLEW_HOME}/include)
link_directories(${GLEW_HOME}/lib/Release/x64) # GLFW
set(GLFW_HOME D:/plugin_dev/libs/glfw-3.3..bin.WIN64)
include_directories(${GLFW_HOME}/include/)
link_directories(${GLFW_HOME}/lib-vc2019) add_executable(Triangle main.cpp)
target_link_libraries(Triangle glew32s glfw3 opengl32)
在win32平台一定要显式的写出opengl32链接库。原因来自:这里
统统设置STATIC
#define GLEW_STATIC
// GLEW #include <GL/glew.h>
#include <cstdlib>
#undef GLFW_DLL
// GLFW
#include <GLFW/glfw3.h>
2,simple vertex shader & fragment shader
trangles.vert:
#version core layout (location =) in vec4 vPosition;
void main()
{
gl_Position = vec4(vPosition.x, vPosition.y, vPosition.z, 1.0);
}
trangles.frag:
#version core
layout (location =) out vec4 FragColor;
void main(){ FragColor = vec4(,,,1.0);
}
loadshader.h
//
// Created by gearslogy on 11/2/18.
// #ifndef CP_01_LOADSHADER_H
#define CP_01_LOADSHADER_H #include <string>
#include <iostream>
#include <fstream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <vector>
#include <algorithm> using namespace std;
class FileIO
{
public:
static string load(const char *path){
ifstream in;
in.open(path,ios::in);
if(!in.is_open())
cout << "read " << path << " error\n"; string temp; string line;
while(getline(in,line)){
temp += line;
temp += "\n";
} in.close();
return temp;
}
}; void ApplyShaders(GLuint &shaderProgram,
const vector<string> &codes,
const vector<GLenum> shaderTypes )
{
if(codes.size()!=shaderTypes.size())
{
cout << "shader src size not match type size\n";
return ;
} // FOR LOG
int success;
char infoLog[]; vector <GLuint> shaders;
for(int i=;i<codes.size();i++){
GLuint shader = glCreateShader(shaderTypes[i]);
cout << "Shader ID :" << shader <<endl;
const char *code = codes[i].c_str();
glShaderSource(shader, , &code, NULL);
glCompileShader(shader);
// check compile error
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(shader, , NULL, infoLog);
std::cout << "ERROR::COMPILATION_FAILED\n" << infoLog << std::endl;
}
glAttachShader(shaderProgram, shader);
// append shader to vector to delete later
} glLinkProgram(shaderProgram);
// check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, , NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
} //glDeleteShader(vertexShader);
//glDeleteShader(fragmentShader); glUseProgram(shaderProgram);
for(int i=;i<shaders.size();i++)
glDeleteShader(shaders[i]); } #endif //CP_01_LOADSHADER_H
main.cpp:
#include <GL/glew.h>
#include <GL/gl.h> #include <GLFW/glfw3.h>
#include <iostream>
#include "loadshader.h"
#define BUFFER_OFFSET(offset) ((void *)(offset)) using namespace std;
enum VAO_IDs {Triangles ,NumVAOs}; // NumVAOs 1
enum Buffer_IDs{ArrayBuffer,NumBuffers};
enum Attrib_IDS{vPosition=}; GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers]; const GLuint NumVertices = ; void init(void){ static const GLfloat vertices[NumVertices][] = {
{-0.90f, -0.90f},
{0.85f, -0.90f},
{-0.90f, 0.85f}, {0.90f, -0.85f},
{0.90f, 0.90f},
{-0.85f, 0.90f},
};
glCreateVertexArrays(NumVAOs,VAOs);//glGenVertexArrays(NumVAOs,VAOs);
cout << "CreateVertexArrays VAOs[0]: "<<VAOs[] << endl; glCreateBuffers(NumBuffers,Buffers);
cout << "CreateVertexArrays Buffers[0]: "<<Buffers[] << endl; glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,); const char *vertexShaderSource = FileIO::load("../triangles.vert").c_str();
const char *fragmentShaderSource = FileIO::load("../triangles.frag").c_str(); unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, , &vertexShaderSource, NULL);
glCompileShader(vertexShader); int success;
char infoLog[];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, , NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
} unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, , &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, , NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
} unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram); // check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, , NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
} glUseProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader); glBindVertexArray(VAOs[Triangles]);
glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
glVertexAttribPointer(,,GL_FLOAT,GL_FALSE, * sizeof(float),BUFFER_OFFSET());
glEnableVertexAttribArray(); } void display(void){
static const float black[] = {0.0f,0.5f,0.0f,0.0f};
glClearBufferfv(GL_COLOR,,black);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, ,NumVertices); } int main(){
glfwInit(); GLFWwindow *window =glfwCreateWindow(,,"Triangles",NULL,NULL);
glfwMakeContextCurrent(window);
glewInit();
init(); while(!glfwWindowShouldClose(window)){
display();
glfwSwapBuffers(window);
glfwPollEvents();
} glfwDestroyWindow(window);
glfwTerminate();
}
replace main.cpp shader's methods then use the loadshader.h ApplyShaders:
main.cpp:
//
// Created by gearslogy on 11/1/18.
// #include <GL/glew.h>
#include <GL/gl.h> #include <GLFW/glfw3.h>
#include <iostream>
#include "loadshader.h"
#define BUFFER_OFFSET(offset) ((void *)(offset)) using namespace std;
enum VAO_IDs {Triangles ,NumVAOs}; // NumVAOs 1
enum Buffer_IDs{ArrayBuffer,NumBuffers};
enum Attrib_IDS{vPosition=}; GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers]; const GLuint NumVertices = ; void init(void){ static const GLfloat vertices[NumVertices][] = {
{-0.90f, -0.90f},
{0.85f, -0.90f},
{-0.90f, 0.85f}, {0.90f, -0.85f},
{0.90f, 0.90f},
{-0.85f, 0.90f},
};
glCreateVertexArrays(NumVAOs,VAOs);//glGenVertexArrays(NumVAOs,VAOs);
cout << "CreateVertexArrays VAOs[0]: "<<VAOs[] << endl; glCreateBuffers(NumBuffers,Buffers);
cout << "CreateVertexArrays Buffers[0]: "<<Buffers[] << endl; glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,); vector <string> codes;
vector <GLenum> shaderTypes;
codes.push_back(FileIO::load("../triangles.vert"));
codes.push_back(FileIO::load("../triangles.frag"));
shaderTypes.push_back(GL_VERTEX_SHADER);
shaderTypes.push_back(GL_FRAGMENT_SHADER); GLuint shaderProgram = glCreateProgram();
ApplyShaders(shaderProgram,codes,shaderTypes); glBindVertexArray(VAOs[Triangles]);
glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
glVertexAttribPointer(,,GL_FLOAT,GL_FALSE, * sizeof(float),BUFFER_OFFSET());
glEnableVertexAttribArray(); } void display(void){
static const float black[] = {0.0f,0.5f,0.0f,0.0f};
glClearBufferfv(GL_COLOR,,black);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, ,NumVertices); } int main(){
glfwInit(); GLFWwindow *window =glfwCreateWindow(,,"Triangles",NULL,NULL);
glfwMakeContextCurrent(window);
glewInit();
init(); while(!glfwWindowShouldClose(window)){
display();
glfwSwapBuffers(window);
glfwPollEvents();
} glfwDestroyWindow(window);
glfwTerminate();
}
openGL learning的更多相关文章
- Github上的1000多本免费电子书重磅来袭!
Github上的1000多本免费电子书重磅来袭! 以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...
- Github 的一个免费编程书籍列表
Index Ada Agda Alef Android APL Arduino ASP.NET MVC Assembly Language Non-X86 AutoHotkey Autotools A ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- 1.openGL 初探
GLEW, GLFW和GLM介绍 现在你有了工程,就让我们开始介绍下工程所用到的开源库和为啥需要这些. The OpenGL Extension Wrangler (GLEW)是用来访问OpenGL ...
- openGL实现二维图形和三维图形
openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- OpenGL 开始学习指南
近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenG ...
- OpenGL ES应用开发实践指南:iOS卷
<OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
随机推荐
- MR 实例
二次排序 点击复制代码:https://www.cnblogs.com/JBLi/p/10764535.html 将上面的代码改成两个 分区 展示的数据 相同的不在一个分区 怎么解决点击查看没有 ...
- Appium could not connect to server are you sure it's running appium desktop
use remote host value : 127.0.0.1 switch to Custom server to Automatic server adb kill-server adb st ...
- MySQL 的数据目录
MySQL里面有4个数据库是属于MySQL自带的系统数据库: mysql 这个数据库贼核心,它存储了MySQL的用户账户和权限信息,一些存储过程.事件的定义信息,一些运行过程中产生的日志信息,一些帮助 ...
- 利用ajax技术 实现用户注册。
一.ajax? 异步加载技术,在不刷新网页的前提下,实现部分网页内容的更新! AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. 思考? 注册界面刚好可以应用 ...
- Go语言中的make和new
相同点: make和new都是用来创建分配类型内存的. 不同点: 先看下面的代码 package main import "fmt" func main(){ var i *int ...
- Android List 排序
Collections.sort(list, (l1, l2) -> l1.getID().compareTo(l2.getID())); list:泛型集合 l1:比较的前一个泛型 l2:比较 ...
- gd.so和php_gd2.so 有什么区别
1.关于gd与gd2有什么区别,可以参加以下的链接,简单来说gd2就是gd的更新版,可以处理更多图像类型 https://stackoverflow.com/questions/3035216/wha ...
- XMLHttpRequest的使用
XMLHttpRequest的使用 标签(空格分隔): JavaScript 前端 编程 function sendAjax() { //构造表单数据 var formData = new FormD ...
- 记录下扣jio的2018年
踩着18年的尾巴,写下这篇总结,既给18年画上句号,也展望19年,制定下计划. 自17年底正式接手团队项目管理工作以来,虽然前面一年都干了大部分工作,但正式走到这个位置上来,还是有一部分的期待.接手之 ...
- npm_config_
npm script时会带一些参数变量,例如: "test": "node scripts/tools/test.js --name=test111" 平常我们 ...